Commit 31d915a3 authored by Marco Trevisan's avatar Marco Trevisan 🎺

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

As per 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] mutter!385

parent e00878ab
......@@ -832,6 +832,13 @@ entry_cursor_func (StEntry *entry,
static void
on_x11_display_closed (MetaDisplay *display,
ShellGlobal *global)
g_signal_handlers_disconnect_by_data (global->stage, global);
_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",
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment