Re: [PATCH weston 17/18] xwayland: Fix the race condition when mapping a surface

MoD mod-oss at hush.ai
Mon Jun 10 11:11:41 PDT 2013


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, ppaalanen at gmail.com wrote:
>
>From: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
>
>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
>wayland-devel at lists.freedesktop.org
>http://lists.freedesktop.org/mailman/listinfo/wayland-devel



More information about the wayland-devel mailing list