core: Move remaining default focus window handling to workspace

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2489>
This commit is contained in:
Sebastian Wick
2022-07-12 00:45:43 +02:00
committed by Marge Bot
parent 3a96ef023b
commit b4b9a7c90f
9 changed files with 129 additions and 242 deletions

View File

@ -39,6 +39,7 @@
#include <string.h>
#include "backends/meta-backend-private.h"
#include "backends/meta-cursor-tracker-private.h"
#include "backends/meta-logical-monitor.h"
#include "cogl/cogl.h"
#include "core/boxes-private.h"
@ -53,6 +54,8 @@ void meta_workspace_queue_calc_showing (MetaWorkspace *workspace);
static void focus_ancestor_or_mru_window (MetaWorkspace *workspace,
MetaWindow *not_this_one,
guint32 timestamp);
static MetaWindow * get_pointer_window (MetaWorkspace *workspace,
MetaWindow *not_this_one);
G_DEFINE_TYPE (MetaWorkspace, meta_workspace, G_TYPE_OBJECT);
@ -1330,7 +1333,8 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
else
{
MetaWindow * window;
window = meta_display_get_pointer_window (workspace->display, not_this_one);
window = get_pointer_window (workspace, not_this_one);
if (window &&
window->type != META_WINDOW_DOCK &&
window->type != META_WINDOW_DESKTOP)
@ -1381,7 +1385,8 @@ is_focusable (MetaWindow *window,
MetaWorkspace *workspace)
{
return !window->unmanaging &&
window->mapped &&
window->unmaps_pending == 0 &&
window->type != META_WINDOW_DOCK &&
meta_window_is_focusable (window) &&
meta_window_located_on_workspace (window, workspace) &&
meta_window_showing_on_its_workspace (window);
@ -1402,11 +1407,91 @@ find_focusable_ancestor (MetaWindow *window,
return TRUE;
}
static MetaWindow *
get_default_focus_window (MetaWorkspace *workspace,
MetaWindow *not_this_one)
GList *
meta_workspace_get_default_focus_candidates (MetaWorkspace *workspace)
{
GList *l;
GList *candidates = NULL;
for (l = workspace->mru_list; l; l = l->next)
{
MetaWindow *window = l->data;
g_assert (window);
if (!is_focusable (window, workspace))
continue;
candidates = g_list_prepend (candidates, window);
}
return candidates;
}
static gboolean
window_contains_point (MetaWindow *window,
int root_x,
int root_y)
{
MetaRectangle rect;
meta_window_get_frame_rect (window, &rect);
return META_POINT_IN_RECT (root_x, root_y, rect);
}
MetaWindow *
meta_workspace_get_default_focus_window_at_point (MetaWorkspace *workspace,
MetaWindow *not_this_one,
int root_x,
int root_y)
{
g_autoptr (GList) sorted = NULL;
GList *l;
MetaStack *stack;
g_return_val_if_fail (META_IS_WORKSPACE (workspace), NULL);
g_return_val_if_fail (!not_this_one || META_IS_WINDOW (not_this_one), NULL);
stack = workspace->display->stack;
g_return_val_if_fail (META_IS_STACK (stack), NULL);
/* Find the topmost, focusable, mapped, window.
* not_this_one is being unfocused or going away, so exclude it.
*/
sorted = g_list_reverse (meta_stack_list_windows (stack, workspace));
/* top of this layer is at the front of the list */
for (l = sorted; l != NULL; l = l->next)
{
MetaWindow *window = l->data;
g_assert (window);
if (window == not_this_one)
continue;
if (!is_focusable (window, workspace))
continue;
if (!window_contains_point (window, root_x, root_y))
continue;
return window;
}
return NULL;
}
MetaWindow *
meta_workspace_get_default_focus_window (MetaWorkspace *workspace,
MetaWindow *not_this_one)
{
GList *l;
g_return_val_if_fail (META_IS_WORKSPACE (workspace), NULL);
g_return_val_if_fail (!not_this_one || META_IS_WINDOW (not_this_one), NULL);
for (l = workspace->mru_list; l; l = l->next)
{
@ -1426,17 +1511,23 @@ get_default_focus_window (MetaWorkspace *workspace,
return NULL;
}
MetaWindow *
meta_workspace_get_default_focus_window (MetaWorkspace *workspace)
static MetaWindow *
get_pointer_window (MetaWorkspace *workspace,
MetaWindow *not_this_one)
{
if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK)
{
return get_default_focus_window (workspace, NULL);
}
else
{
return NULL;
}
MetaBackend *backend = meta_get_backend ();
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
graphene_point_t point;
if (not_this_one)
meta_topic (META_DEBUG_FOCUS,
"Focusing mouse window excluding %s", not_this_one->desc);
meta_cursor_tracker_get_pointer (cursor_tracker, &point, NULL);
return meta_workspace_get_default_focus_window_at_point (workspace,
not_this_one,
point.x, point.y);
}
static gboolean
@ -1515,7 +1606,7 @@ focus_ancestor_or_mru_window (MetaWorkspace *workspace,
}
}
window = get_default_focus_window (workspace, not_this_one);
window = meta_workspace_get_default_focus_window (workspace, not_this_one);
if (window)
{