xwm: Just ignore the synthetic unmap_notify
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 31 May 2012 14:33:43 +0000 (10:33 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 31 May 2012 14:33:43 +0000 (10:33 -0400)
As per ICCCM 4.1.4 we're supposed to withdraw the window when we see
the real unmap or the synthetic unmap, whichever comes first.  The
synthetic unmap may come after the window has been destroyed, so let's
just only handle the real unmap.

src/xwayland/window-manager.c

index 9444132..b8be54c 100644 (file)
@@ -562,15 +562,12 @@ weston_wm_handle_unmap_notify(struct weston_wm *wm, xcb_generic_event_t *event)
        if (our_resource(wm, unmap_notify->window))
                return;
 
-       window = hash_table_lookup(wm->window_hash, unmap_notify->window);
-       if (window->frame_id == XCB_WINDOW_NONE) {
-               /* We already withdrew this window on the real unmap
-                * notify and this is the synthetic unmap notify from
-                * the client, or the other way around (ICCCM 4.1.4).
-                * Either way, we're already done so just return. */
+       if (unmap_notify->response_type & 0x80)
+               /* We just ignore the ICCCM 4.1.4 synthetic unmap notify
+                * as it may come in after we've destroyed the window. */
                return;
-       }
 
+       window = hash_table_lookup(wm->window_hash, unmap_notify->window);
        if (window->repaint_source)
                wl_event_source_remove(window->repaint_source);
        if (window->cairo_surface)