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

Reply via email to