summaryrefslogtreecommitdiff
path: root/src/core/workspace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/workspace.c')
-rw-r--r--src/core/workspace.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/src/core/workspace.c b/src/core/workspace.c
index 19e3a9a8..45306dd6 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -969,14 +969,30 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
}
}
+typedef struct
+{
+ MetaWorkspace *workspace;
+ MetaWindow *ancestor;
+} FindFocusableAncestorData;
+
static gboolean
-record_ancestor (MetaWindow *window,
- void *data)
+find_focusable_ancestor (MetaWindow *window,
+ gpointer user_data)
{
- MetaWindow **result = data;
+ FindFocusableAncestorData *data;
- *result = window;
- return FALSE; /* quit with the first ancestor we find */
+ 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->ancestor = window;
+ return FALSE;
+ }
+
+ return TRUE;
}
/* Focus ancestor of not_this_one if there is one */
@@ -998,8 +1014,17 @@ 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);
+ FindFocusableAncestorData data;
+
+ data.workspace = workspace;
+ data.ancestor = NULL;
+
+ meta_window_foreach_ancestor (not_this_one,
+ find_focusable_ancestor,
+ &data);
+
+ ancestor = data.ancestor;
+
if (ancestor != NULL)
{
meta_topic (META_DEBUG_FOCUS,