[mutter] display: Unmanage windows before compositor



commit 8ec8a26717909b729b57539c5d16cf23c417ad90
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri May 6 17:49:50 2022 +0200

    display: Unmanage windows before compositor
    
    Prior to 'compositor: Destroy actors when unmanaging', window actors
    were destroyed when the compositor object was destroyed, long after the
    windows were unmanaged, however, when this instead changed to happen
    when unmanaging, with the original goal to avoid having these actors try
    to interact with the disposed MetaCompositor instance, it caused an
    issue where window actors would be indirectly destroyed as a side effect
    of their parents being destroyed, which caused some fallout in the logic
    handling window-close animation tracking, which relies on
    meta_window_actor_queue_destroy() being called before a window actor is
    actually destroyed.
    
    Fix this by unmanaging windows before unmanaging the compositor.
    
    From an X11 point of view, this should be harmless, since all it really
    do is call XCompositeUnredirectSubwindows().
    
    For the native backend and the common behavior, all unmanaging the
    compositor instance does is destroy clutter actors, so doing so after
    window actors were already cleaned up should not be a problem, as this
    was the case before too.
    
    Fixes: 35ac3a096d84de97c1da9a54d99aebf7640c1c07
    Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5330
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2403>

 src/core/display.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
---
diff --git a/src/core/display.c b/src/core/display.c
index 058d09f2a5..fdf6d31a84 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -1132,9 +1132,8 @@ meta_display_close (MetaDisplay *display,
 
   g_signal_emit (display, display_signals[CLOSING], 0);
 
-  meta_compositor_unmanage (display->compositor);
-
   meta_display_unmanage_windows (display, timestamp);
+  meta_compositor_unmanage (display->compositor);
 
   meta_prefs_remove_listener (prefs_changed_callback, display);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]