From 98fa34358817cbee70b0d714495bec9d6ccae3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 10 Sep 2014 22:24:26 +0200 Subject: [PATCH] window-actor: Keep in compositor's window list until destroyed When a window is destroyed, the corresponding actor may still be kept around for the destroy effect. But as the actor is removed from the compositor's stack list immediately, the compositor will always stack it above "valid" window actors - this is not what we want, so only update the compositor's list when the actor is actually destroyed. https://bugzilla.gnome.org/show_bug.cgi?id=735927 --- src/compositor/compositor.c | 4 ++-- src/compositor/meta-window-actor.c | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 586bdc148..47bea317e 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -920,7 +920,7 @@ meta_compositor_sync_stack (MetaCompositor *compositor, old_actor = old_stack->data; old_window = meta_window_actor_get_meta_window (old_actor); - if (old_window->hidden && + if ((old_window->hidden || old_window->unmanaging) && !meta_window_actor_effect_in_progress (old_actor)) { old_stack = g_list_delete_link (old_stack, old_stack); @@ -954,7 +954,7 @@ meta_compositor_sync_stack (MetaCompositor *compositor, * filtered out non-animating hidden windows above. */ if (old_actor && - (!stack_actor || old_window->hidden)) + (!stack_actor || old_window->hidden || old_window->unmanaging)) { actor = old_actor; window = old_window; diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c index 804315718..7b9d3a51d 100644 --- a/src/compositor/meta-window-actor.c +++ b/src/compositor/meta-window-actor.c @@ -1171,7 +1171,6 @@ meta_window_actor_destroy (MetaWindowActor *self) { MetaWindowActorPrivate *priv = self->priv; MetaWindow *window = priv->window; - MetaCompositor *compositor = priv->compositor; MetaWindowType window_type = meta_window_get_window_type (window); meta_window_set_compositor_private (window, NULL); @@ -1182,12 +1181,6 @@ meta_window_actor_destroy (MetaWindowActor *self) priv->send_frame_messages_timer = 0; } - /* - * We remove the window from internal lookup hashes and thus any other - * unmap events etc fail - */ - compositor->windows = g_list_remove (compositor->windows, (gconstpointer) self); - if (window_type == META_WINDOW_DROPDOWN_MENU || window_type == META_WINDOW_POPUP_MENU || window_type == META_WINDOW_TOOLTIP ||