diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/workspace.c | 39 |
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, |