[gnome-shell] shell-global: Disconnect from stage events on X11 display close



commit 31d915a38ac7502fc1b4978749a5b1198e44c93c
Author: Marco Trevisan (Treviño) <mail 3v1n0 net>
Date:   Wed Oct 2 21:24:37 2019 +0200

    shell-global: Disconnect from stage events on X11 display close
    
    As per GNOME/mutter!385 [1], the compositor is finalized an its pointer
    cleared on display close.
    
    However, since the shell reacts to such events instead of controlling them,
    when the shell is stopping or restarting and its display closing, the shell
    stage destroys its children after the display closing is finished and during
    this process the focus is unset, causing focus_actor_changed() to be called
    and thus calls to meta_stage_is_focused() which deferences the now NULL
    compositor, leading to a crash on shutdown.
    
    Since after this point we should just ignore any stage event, disconnect
    from them all.
    
    [1] https://gitlab.gnome.org/GNOME/mutter/merge_requests/385
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/746

 src/shell-global.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
---
diff --git a/src/shell-global.c b/src/shell-global.c
index 80f251272c..7f74a34fd8 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -832,6 +832,13 @@ entry_cursor_func (StEntry  *entry,
                            use_ibeam ? META_CURSOR_IBEAM : META_CURSOR_DEFAULT);
 }
 
+static void
+on_x11_display_closed (MetaDisplay *display,
+                       ShellGlobal *global)
+{
+  g_signal_handlers_disconnect_by_data (global->stage, global);
+}
+
 void
 _shell_global_set_plugin (ShellGlobal *global,
                           MetaPlugin  *plugin)
@@ -895,6 +902,10 @@ _shell_global_set_plugin (ShellGlobal *global,
   g_signal_connect (global->meta_display, "notify::focus-window",
                     G_CALLBACK (focus_window_changed), global);
 
+  if (global->xdisplay)
+    g_signal_connect_object (global->meta_display, "x11-display-closing",
+                             G_CALLBACK (on_x11_display_closed), global, 0);
+
   backend = meta_get_backend ();
   settings = meta_backend_get_settings (backend);
   g_signal_connect (settings, "ui-scaling-factor-changed",


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