Commit 37b3cd62 authored by Marco Trevisan's avatar Marco Trevisan 🎺

workspace: Focus only ancestors that are focusable

When destroying a window that has a parent, we initially try to focus one of
its ancestors. However if no ancestor can be focused, then we should instead
focus the fault window instead of trying to request focus for a window
that can't get focus anyways.

Fixes GNOME/mutter#308
parent b0e4ab6a
......@@ -84,6 +84,12 @@ typedef struct _MetaWorkspaceLogicalMonitorData
MetaRectangle logical_monitor_work_area;
} MetaWorkspaceLogicalMonitorData;
typedef struct _MetaWorkspaceFocusableAncestorData
MetaWorkspace *workspace;
MetaWindow **win;
} MetaWorkspaceFocusableAncestorData;
static MetaWorkspaceLogicalMonitorData *
meta_workspace_get_logical_monitor_data (MetaWorkspace *workspace,
MetaLogicalMonitor *logical_monitor)
......@@ -1321,13 +1327,21 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
static gboolean
record_ancestor (MetaWindow *window,
void *data)
find_focusable_ancestor (MetaWindow *window,
void *data)
MetaWindow **result = data;
MetaWorkspaceFocusableAncestorData *mwfa = data;
MetaWindow **result = mwfa->win;
if (!window->unmanaging && meta_window_is_focusable (window) &&
meta_window_located_on_workspace (window, mwfa->workspace) &&
meta_window_showing_on_its_workspace (window))
*result = window;
return FALSE;
*result = window;
return FALSE; /* quit with the first ancestor we find */
return TRUE;
/* Focus ancestor of not_this_one if there is one */
......@@ -1348,12 +1362,10 @@ focus_ancestor_or_top_window (MetaWorkspace *workspace,
/* First, check to see if we need to focus an ancestor of a window */
if (not_this_one)
MetaWindow *ancestor;
ancestor = NULL;
meta_window_foreach_ancestor (not_this_one, record_ancestor, &ancestor);
if (ancestor != NULL &&
meta_window_located_on_workspace (ancestor, workspace) &&
meta_window_showing_on_its_workspace (ancestor))
MetaWindow *ancestor = NULL;
MetaWorkspaceFocusableAncestorData mwfa = { workspace, &ancestor };
meta_window_foreach_ancestor (not_this_one, find_focusable_ancestor, &mwfa);
if (ancestor != NULL)
meta_topic (META_DEBUG_FOCUS,
"Focusing %s, ancestor of %s\n",
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