From 7d54c5621c8274b589e9a1bb26dff2f321060efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 3 Jul 2019 16:48:07 +0000 Subject: [PATCH] stack: Add a function to get a sorted list of focus candidates Use a static function if a window can be the default focus window, and use such function to return a filtered list of the stack. https://gitlab.gnome.org/GNOME/mutter/merge_requests/669 (cherry picked from commit 2439255f32b4e775d4427c92a6797b8bd33e7d5a) --- src/core/stack.c | 55 ++++++++++++++++++++++++++++++++++++------------ src/core/stack.h | 15 +++++++++++++ 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/core/stack.c b/src/core/stack.c index fc51aa165..3a0130f42 100644 --- a/src/core/stack.c +++ b/src/core/stack.c @@ -1176,6 +1176,27 @@ window_contains_point (MetaWindow *window, return POINT_IN_RECT (root_x, root_y, rect); } +static gboolean +window_can_get_default_focus (MetaWindow *window) +{ + if (window->unmaps_pending > 0) + return FALSE; + + if (window->unmanaging) + return FALSE; + + if (!(window->input || window->take_focus)) + return FALSE; + + if (!meta_window_should_be_showing (window)) + return FALSE; + + if (window->type == META_WINDOW_DOCK) + return FALSE; + + return TRUE; +} + static MetaWindow* get_default_focus_window (MetaStack *stack, MetaWorkspace *workspace, @@ -1203,24 +1224,12 @@ get_default_focus_window (MetaStack *stack, if (window == not_this_one) continue; - if (window->unmaps_pending > 0) - continue; - - if (window->unmanaging) - continue; - - if (!(window->input || window->take_focus)) - continue; - - if (!meta_window_should_be_showing (window)) + if (!window_can_get_default_focus (window)) continue; if (must_be_at_point && !window_contains_point (window, root_x, root_y)) continue; - if (window->type == META_WINDOW_DOCK) - continue; - return window; } @@ -1275,6 +1284,26 @@ meta_stack_list_windows (MetaStack *stack, return workspace_windows; } +GList * +meta_stack_get_default_focus_candidates (MetaStack *stack, + MetaWorkspace *workspace) +{ + GList *windows = meta_stack_list_windows (stack, workspace); + GList *l; + + for (l = windows; l;) + { + GList *next = l->next; + + if (!window_can_get_default_focus (l->data)) + windows = g_list_delete_link (windows, l); + + l = next; + } + + return windows; +} + int meta_stack_windows_cmp (MetaStack *stack, MetaWindow *window_a, diff --git a/src/core/stack.h b/src/core/stack.h index e82be0abe..8cd7c68c6 100644 --- a/src/core/stack.h +++ b/src/core/stack.h @@ -337,6 +337,21 @@ MetaWindow* meta_stack_get_default_focus_window_at_point (MetaStack *stack, int root_x, int root_y); +/** + * meta_stack_get_default_focus_candidates: + * @stack: The stack to examine. + * @workspace: If not %NULL, only windows on this workspace will be + * returned; otherwise all windows in the stack will be + * returned. + * + * Returns all the focus candidate windows in the stack, in order. + * + * Returns: (transfer container) (element-type Meta.Window): + * A #GList of #MetaWindow, in stacking order, honouring layers. + */ +GList * meta_stack_get_default_focus_candidates (MetaStack *stack, + MetaWorkspace *workspace); + /** * meta_stack_list_windows: * @stack: The stack to examine.