window-x11: Focus a window in the active workspace as take-focus fallback

Starting with commit 2db94e2e we try to focus a fallback default focus window
if no take-focus window candidate gets the input focus when we request it and
we limit the focus candidates to the current window's workspace.

However, if the window is unmanaging, the workspace might be unset, and we could
end up in deferencing a NULL pointer causing a crash.

So, in case the window's workspace is unset, just use the currently active
workspace for the display.

Closes https://gitlab.gnome.org/GNOME/mutter/issues/687

https://gitlab.gnome.org/GNOME/mutter/merge_requests/688
This commit is contained in:
Marco Trevisan (Treviño) 2019-07-17 01:13:48 +02:00
parent a5265365dd
commit 5ca0ef078d

View File

@ -886,15 +886,21 @@ meta_window_x11_maybe_focus_delayed (MetaWindow *window,
}
static void
maybe_focus_default_window (MetaWorkspace *workspace,
maybe_focus_default_window (MetaDisplay *display,
MetaWindow *not_this_one,
guint32 timestamp)
{
MetaStack *stack = workspace->display->stack;
MetaWorkspace *workspace;
MetaStack *stack = display->stack;
g_autoptr (GList) focusable_windows = NULL;
g_autoptr (GQueue) focus_candidates = NULL;
GList *l;
if (not_this_one && not_this_one->workspace)
workspace = not_this_one->workspace;
else
workspace = display->workspace_manager->active_workspace;
/* Go through all the focusable windows and try to focus them
* in order, waiting for a delay. The first one that replies to
* the request (in case of take focus windows) changing the display
@ -988,7 +994,7 @@ meta_window_x11_focus (MetaWindow *window,
window->display->focus_window->unmanaging)
{
meta_display_unset_input_focus (window->display, timestamp);
maybe_focus_default_window (window->workspace, window,
maybe_focus_default_window (window->display, window,
timestamp);
}
}