diff options
Diffstat (limited to 'src/core/window.c')
-rw-r--r-- | src/core/window.c | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/src/core/window.c b/src/core/window.c index c2d294ac..c8dd297c 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -529,7 +529,7 @@ meta_window_new (MetaDisplay *display, window->opaque_region = None; window->opacity = 0xffffffff; - window->unmaps_pending = 0; + window->unmaps_pending = NULL; window->mwm_decorated = TRUE; window->mwm_border_only = FALSE; @@ -1267,6 +1267,9 @@ meta_window_unmanage (MetaWindow *window, meta_error_trap_pop (window->display); + g_list_free_full (window->unmaps_pending, g_free); + window->unmaps_pending = NULL; + g_object_unref (window); } @@ -2321,12 +2324,11 @@ meta_window_show (MetaWindow *window) { meta_topic (META_DEBUG_WINDOW_STATE, "%s actually needs unmap (shaded)\n", window->desc); - meta_topic (META_DEBUG_WINDOW_STATE, - "Incrementing unmaps_pending on %s for shade\n", - window->desc); window->mapped = FALSE; - window->unmaps_pending += 1; meta_error_trap_push (window->display); + meta_window_add_pending_unmap (window, + NextRequest (window->display->xdisplay), + "shade"); XUnmapWindow (window->display->xdisplay, window->xwindow); meta_error_trap_pop (window->display); } @@ -2472,12 +2474,11 @@ meta_window_hide (MetaWindow *window) { meta_topic (META_DEBUG_WINDOW_STATE, "%s actually needs unmap\n", window->desc); - meta_topic (META_DEBUG_WINDOW_STATE, - "Incrementing unmaps_pending on %s for hide\n", - window->desc); window->mapped = FALSE; - window->unmaps_pending += 1; meta_error_trap_push (window->display); + meta_window_add_pending_unmap (window, + NextRequest (window->display->xdisplay), + "hide"); XUnmapWindow (window->display->xdisplay, window->xwindow); meta_error_trap_pop (window->display); did_hide = TRUE; @@ -9456,3 +9457,49 @@ meta_window_reframe (MetaWindow *window) window->reframe_id = g_idle_add (reframe_cb, window); } + +void +meta_window_add_pending_unmap (MetaWindow *window, + gulong serial, + const char *reason) +{ + gulong *pending_unmap; + + pending_unmap = g_new (gulong, 1); + *pending_unmap = serial; + + meta_topic (META_DEBUG_WINDOW_STATE, + "Adding pending unmap on %s for %s\n", + window->desc, + reason); + + window->unmaps_pending = g_list_append (window->unmaps_pending, + pending_unmap); +} + +gboolean +meta_window_remove_pending_unmap (MetaWindow *window, + gulong serial) +{ + gboolean removed; + GList *l; + + removed = FALSE; + + for (l = window->unmaps_pending; l != NULL; l = l->next) + { + gulong *pending_unmap; + + pending_unmap = l->data; + + if (*pending_unmap == serial) + { + removed = TRUE; + window->unmaps_pending = g_list_remove_link (window->unmaps_pending, l); + g_list_free_full (l, g_free); + break; + } + } + + return removed; +} |