Commit eccc791f authored by Marco Trevisan's avatar Marco Trevisan 🎺 Committed by Jonas Ådahl

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 default focus window instead of trying to request focus for a window
that can't get focus anyways.

Fixes GNOME/mutter#308
parent 6055f048
......@@ -83,6 +83,12 @@ typedef struct _MetaWorkspaceLogicalMonitorData
MetaRectangle logical_monitor_work_area;
} MetaWorkspaceLogicalMonitorData;
typedef struct _MetaWorkspaceFocusableAncestorData
MetaWorkspace *workspace;
MetaWindow *out_window;
} MetaWorkspaceFocusableAncestorData;
static MetaWorkspaceLogicalMonitorData *
meta_workspace_get_logical_monitor_data (MetaWorkspace *workspace,
MetaLogicalMonitor *logical_monitor)
......@@ -1314,13 +1320,20 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
static gboolean
record_ancestor (MetaWindow *window,
void *data)
find_focusable_ancestor (MetaWindow *window,
gpointer user_data)
MetaWindow **result = data;
MetaWorkspaceFocusableAncestorData *data = user_data;
if (!window->unmanaging && meta_window_is_focusable (window) &&
meta_window_located_on_workspace (window, data->workspace) &&
meta_window_showing_on_its_workspace (window))
data->out_window = 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 */
......@@ -1342,11 +1355,15 @@ focus_ancestor_or_top_window (MetaWorkspace *workspace,
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))
MetaWorkspaceFocusableAncestorData data;
data = (MetaWorkspaceFocusableAncestorData) {
.workspace = workspace,
meta_window_foreach_ancestor (not_this_one, find_focusable_ancestor, &data);
ancestor = data.out_window;
if (ancestor)
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