window: Avoid focusing during workspace changes
We can land inside meta_window_focus() in the middle of changing the window workspace, because some signal handler of MetaWorkspace's "window-removed" signal triggers a focus. This can cause a crash in `g_assert (link)` when updating the MRU list because we still think we're on the old workspace when actually we are already removed from this workspaces MRU list. To avoid crashes like this, bail out of meta_window_focus() when we're in the middle of a workspace change. Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5368 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2691>
This commit is contained in:
@ -4552,6 +4552,14 @@ meta_window_focus (MetaWindow *window,
|
||||
"Setting input focus to window %s, input: %d focusable: %d",
|
||||
window->desc, window->input, meta_window_is_focusable (window));
|
||||
|
||||
if (window->in_workspace_change)
|
||||
{
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Window %s is currently changing workspaces, not focusing it after all",
|
||||
window->desc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (window->display->grab_window &&
|
||||
window->display->grab_window != window &&
|
||||
window->display->grab_window->all_keys_grabbed &&
|
||||
@ -4671,6 +4679,8 @@ set_workspace_state (MetaWindow *window,
|
||||
!window->constructing)
|
||||
return;
|
||||
|
||||
window->in_workspace_change = TRUE;
|
||||
|
||||
if (window->workspace)
|
||||
meta_workspace_remove_window (window->workspace, window);
|
||||
else if (window->on_all_workspaces)
|
||||
@ -4698,6 +4708,8 @@ set_workspace_state (MetaWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
window->in_workspace_change = FALSE;
|
||||
|
||||
if (!window->constructing)
|
||||
meta_window_update_appears_focused (window);
|
||||
|
||||
|
Reference in New Issue
Block a user