I've been poking at XWayland+Weston's XWM recently and wanted to find this behavior and check that this patch is effective so I could vouch for it, but I haven't seen something that looks like windows being mapped with the wrong coordinates or size. Louis-Francis, could you explain how to reproduce this behavior?
Thanks. On 22 de mayo de 2013 at 10:27 AM, [email protected] wrote: > >From: Louis-Francis Ratté-Boulianne <[email protected]> > >Make sure XCB_MAP_NOTIFY has been received and the window id has >been >set before mapping the shell surface. It fixes race condition >making the >surface appears at wrong coordinates or with wrong size. >--- > src/xwayland/window-manager.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > >diff --git a/src/xwayland/window-manager.c b/src/xwayland/window- >manager.c >index 366f2e0..c2e680b 100644 >--- a/src/xwayland/window-manager.c >+++ b/src/xwayland/window-manager.c >@@ -113,6 +113,7 @@ struct weston_wm_window { > int decorate; > int override_redirect; > int fullscreen; >+ int mapped; > }; > > static struct weston_wm_window * >@@ -121,6 +122,9 @@ get_wm_window(struct weston_surface *surface); > static void > weston_wm_window_schedule_repaint(struct weston_wm_window >*window); > >+static void >+xserver_map_shell_surface(struct weston_wm *wm, struct >weston_wm_window *window); >+ > const char * > get_atom_name(xcb_connection_t *c, xcb_atom_t atom) > { >@@ -723,6 +727,14 @@ static void > weston_wm_handle_map_notify(struct weston_wm *wm, >xcb_generic_event_t *event) > { > xcb_map_notify_event_t *map_notify = (xcb_map_notify_event_t *) >event; >+ struct weston_wm_window *window; >+ >+ window = hash_table_lookup(wm->window_hash, map_notify->window); >+ >+ if (window->surface != NULL) >+ xserver_map_shell_surface(wm, window); >+ else >+ window->mapped = 1; > > if (our_resource(wm, map_notify->window)) { > weston_log("XCB_MAP_NOTIFY (window %d, ours)\n", >@@ -915,6 +927,8 @@ weston_wm_window_create(struct weston_wm *wm, > window->override_redirect = override; > window->width = width; > window->height = height; >+ window->surface = NULL; >+ window->mapped = 0; > > hash_table_insert(wm->window_hash, id, window); > } >@@ -1874,7 +1888,9 @@ xserver_set_window_id(struct wl_client >*client, struct wl_resource *resource, > &window->surface_destroy_listener); > > weston_wm_window_schedule_repaint(window); >- xserver_map_shell_surface(wm, window); >+ >+ if (window->mapped) >+ xserver_map_shell_surface(wm, window); > } > > const struct xserver_interface xserver_implementation = { >-- >1.8.1.5 > >_______________________________________________ >wayland-devel mailing list >[email protected] >http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
