From ab6d6674b68856e3b332629654c2e59be713a1ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 3 Sep 2013 16:38:51 -0700 Subject: [PATCH] xwm: Unmap frame window when client window is unmapped We used to destroy the frame window and reparent the client window to wm_window. That means that we lose the destroy_notify event when the client window is destroyed later, since we don't select for substructure_notify on wm_window. Instead of destroying and reparenting, just unmap the frame window. --- src/xwayland/window-manager.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c index cc6b2614..9d01d361 100644 --- a/src/xwayland/window-manager.c +++ b/src/xwayland/window-manager.c @@ -870,24 +870,12 @@ weston_wm_handle_unmap_notify(struct weston_wm *wm, xcb_generic_event_t *event) 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) - cairo_surface_destroy(window->cairo_surface); - - if (window->frame_id) { - xcb_reparent_window(wm->conn, window->id, wm->wm_window, 0, 0); - xcb_destroy_window(wm->conn, window->frame_id); - weston_wm_window_set_wm_state(window, ICCCM_WITHDRAWN_STATE); - hash_table_remove(wm->window_hash, window->frame_id); - window->frame_id = XCB_WINDOW_NONE; - } - if (wm->focus_window == window) wm->focus_window = NULL; if (window->surface) wl_list_remove(&window->surface_destroy_listener.link); window->surface = NULL; + xcb_unmap_window(wm->conn, window->frame_id); } static void @@ -1055,6 +1043,21 @@ weston_wm_window_create(struct weston_wm *wm, static void weston_wm_window_destroy(struct weston_wm_window *window) { + struct weston_wm *wm = window->wm; + + if (window->repaint_source) + wl_event_source_remove(window->repaint_source); + if (window->cairo_surface) + cairo_surface_destroy(window->cairo_surface); + + if (window->frame_id) { + xcb_reparent_window(wm->conn, window->id, wm->wm_window, 0, 0); + xcb_destroy_window(wm->conn, window->frame_id); + weston_wm_window_set_wm_state(window, ICCCM_WITHDRAWN_STATE); + hash_table_remove(wm->window_hash, window->frame_id); + window->frame_id = XCB_WINDOW_NONE; + } + hash_table_remove(window->wm->window_hash, window->id); free(window); }