From 3e5303daf4212334f1859a025a3de7449efa2b49 Mon Sep 17 00:00:00 2001 From: Ilia Bozhinov Date: Wed, 28 Jun 2017 00:08:40 +0300 Subject: [PATCH] xwm: update override-redirect surface's position upon configure_notify When we receive configure_notify we should update the surface's position by calling xwayland_api->set_xwayland(). Otherwise some surfaces like dnd surfaces from xwayland views are "stuck" at one place. When setting XWAYLAND state though we should always call view_set_position(), not just the first time we set this state. Signed-off-by: Ilia Bozhinov Reviewed-by: Quentin Glidic --- libweston-desktop/xwayland.c | 2 +- xwayland/window-manager.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libweston-desktop/xwayland.c b/libweston-desktop/xwayland.c index 4f4b453f..002e2523 100644 --- a/libweston-desktop/xwayland.c +++ b/libweston-desktop/xwayland.c @@ -112,7 +112,6 @@ weston_desktop_xwayland_surface_change_state(struct weston_desktop_xwayland_surf weston_desktop_surface_create_view(surface->surface); weston_layer_entry_insert(&surface->xwayland->layer.view_list, &surface->view->layer_link); - weston_view_set_position(surface->view, x, y); surface->view->is_mapped = true; wsurface->is_mapped = true; } @@ -316,6 +315,7 @@ set_xwayland(struct weston_desktop_xwayland_surface *surface, int x, int y) { weston_desktop_xwayland_surface_change_state(surface, XWAYLAND, NULL, x, y); + weston_view_set_position(surface->view, x, y); } static int diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c index 25008539..3e8c4c7c 100644 --- a/xwayland/window-manager.c +++ b/xwayland/window-manager.c @@ -739,6 +739,8 @@ weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *eve { xcb_configure_notify_event_t *configure_notify = (xcb_configure_notify_event_t *) event; + const struct weston_desktop_xwayland_interface *xwayland_api = + wm->server->compositor->xwayland_interface; struct weston_wm_window *window; wm_log("XCB_CONFIGURE_NOTIFY (window %d) %d,%d @ %dx%d%s\n", @@ -760,6 +762,13 @@ weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *eve if (window->frame) frame_resize_inside(window->frame, window->width, window->height); + + /* We should check if shsurf has been created because sometimes + * there are races + * (configure_notify is sent before xserver_map_surface) */ + if (window->shsurf) + xwayland_api->set_xwayland(window->shsurf, + window->x, window->y); } }