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 <ammen99@gmail.com>
Reviewed-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
Ilia Bozhinov 2017-06-28 00:08:40 +03:00 committed by Quentin Glidic
parent 749637a8a3
commit 3e5303daf4
No known key found for this signature in database
GPG key ID: AC203F96E2C34BB7
2 changed files with 10 additions and 1 deletions

View file

@ -112,7 +112,6 @@ weston_desktop_xwayland_surface_change_state(struct weston_desktop_xwayland_surf
weston_desktop_surface_create_view(surface->surface); weston_desktop_surface_create_view(surface->surface);
weston_layer_entry_insert(&surface->xwayland->layer.view_list, weston_layer_entry_insert(&surface->xwayland->layer.view_list,
&surface->view->layer_link); &surface->view->layer_link);
weston_view_set_position(surface->view, x, y);
surface->view->is_mapped = true; surface->view->is_mapped = true;
wsurface->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, weston_desktop_xwayland_surface_change_state(surface, XWAYLAND, NULL,
x, y); x, y);
weston_view_set_position(surface->view, x, y);
} }
static int static int

View file

@ -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 *configure_notify =
(xcb_configure_notify_event_t *) event; (xcb_configure_notify_event_t *) event;
const struct weston_desktop_xwayland_interface *xwayland_api =
wm->server->compositor->xwayland_interface;
struct weston_wm_window *window; struct weston_wm_window *window;
wm_log("XCB_CONFIGURE_NOTIFY (window %d) %d,%d @ %dx%d%s\n", 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) if (window->frame)
frame_resize_inside(window->frame, frame_resize_inside(window->frame,
window->width, window->height); 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);
} }
} }