aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2017-11-09 11:21:55 +0100
committeremersion <contact@emersion.fr>2017-11-09 11:21:55 +0100
commit758514fe5d67d226290694208a34f90d1a857d8e (patch)
tree0268d9758316f999122e4390ee7bd12fa0c2b88c
parent2118c691b13c20d7100abfa02f9e274667501aef (diff)
Fix xwayland _NET_WM_STATE handling
-rw-r--r--rootston/xwayland.c2
-rw-r--r--xwayland/xwm.c52
2 files changed, 31 insertions, 23 deletions
diff --git a/rootston/xwayland.c b/rootston/xwayland.c
index 431586ba..1da61ec3 100644
--- a/rootston/xwayland.c
+++ b/rootston/xwayland.c
@@ -170,7 +170,7 @@ static void handle_request_resize(struct wl_listener *listener, void *data) {
static void handle_request_maximize(struct wl_listener *listener, void *data) {
struct roots_xwayland_surface *roots_surface =
- wl_container_of(listener, roots_surface, request_resize);
+ wl_container_of(listener, roots_surface, request_maximize);
struct roots_view *view = roots_surface->view;
struct wlr_xwayland_surface *xwayland_surface = view->xwayland_surface;
diff --git a/xwayland/xwm.c b/xwayland/xwm.c
index f011587e..e5806d5b 100644
--- a/xwayland/xwm.c
+++ b/xwayland/xwm.c
@@ -823,41 +823,49 @@ static void xwm_handle_net_wm_state_message(struct wlr_xwm *xwm,
if (!xsurface) {
return;
}
+ if (client_message->format != 32) {
+ return;
+ }
- int maximized = xsurface_is_maximized(xsurface);
+ bool fullscreen = xsurface->fullscreen;
+ bool maximized = xsurface_is_maximized(xsurface);
uint32_t action = client_message->data.data32[0];
- uint32_t property = client_message->data.data32[1];
+ for (size_t i = 0; i < 2; ++i) {
+ uint32_t property = client_message->data.data32[1 + i];
- if (property == xwm->atoms[_NET_WM_STATE_FULLSCREEN] &&
- update_state(action, &xsurface->fullscreen)) {
- xsurface_set_net_wm_state(xsurface);
+ if (property == xwm->atoms[_NET_WM_STATE_FULLSCREEN] &&
+ update_state(action, &xsurface->fullscreen)) {
+ xsurface_set_net_wm_state(xsurface);
+ } else if (property == xwm->atoms[_NET_WM_STATE_MAXIMIZED_VERT] &&
+ update_state(action, &xsurface->maximized_vert)) {
+ wlr_log(L_DEBUG, "cc sava");
+ xsurface_set_net_wm_state(xsurface);
+ } else if (property == xwm->atoms[_NET_WM_STATE_MAXIMIZED_HORZ] &&
+ update_state(action, &xsurface->maximized_horz)) {
+ wlr_log(L_DEBUG, "mwa sava");
+ xsurface_set_net_wm_state(xsurface);
+ }
+ }
+ // client_message->data.data32[3] is the source indication
+ // all other values are set to 0
+ if (fullscreen != xsurface->fullscreen) {
if (xsurface->fullscreen) {
xsurface->saved_width = xsurface->width;
xsurface->saved_height = xsurface->height;
}
wl_signal_emit(&xsurface->events.request_fullscreen, xsurface);
- } else {
- if (property == xwm->atoms[_NET_WM_STATE_MAXIMIZED_VERT] &&
- update_state(action, &xsurface->maximized_vert)) {
- xsurface_set_net_wm_state(xsurface);
- }
+ }
- if (property == xwm->atoms[_NET_WM_STATE_MAXIMIZED_HORZ] &&
- update_state(action, &xsurface->maximized_horz)) {
- xsurface_set_net_wm_state(xsurface);
+ if (maximized != xsurface_is_maximized(xsurface)) {
+ if (xsurface_is_maximized(xsurface)) {
+ xsurface->saved_width = xsurface->width;
+ xsurface->saved_height = xsurface->height;
}
- if (maximized != xsurface_is_maximized(xsurface)) {
- if (xsurface_is_maximized(xsurface)) {
- xsurface->saved_width = xsurface->width;
- xsurface->saved_height = xsurface->height;
- }
-
- wl_signal_emit(&xsurface->events.request_maximize, xsurface);
- }
+ wl_signal_emit(&xsurface->events.request_maximize, xsurface);
}
}
@@ -1310,8 +1318,8 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *wlr_xwayland) {
xwm->atoms[_NET_ACTIVE_WINDOW],
xwm->atoms[_NET_WM_MOVERESIZE],
xwm->atoms[_NET_WM_STATE_FULLSCREEN],
- xwm->atoms[_NET_WM_STATE_MAXIMIZED_HORZ],
xwm->atoms[_NET_WM_STATE_MAXIMIZED_VERT],
+ xwm->atoms[_NET_WM_STATE_MAXIMIZED_HORZ],
};
xcb_change_property(xwm->xcb_conn,
XCB_PROP_MODE_REPLACE,