mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 01:20:42 -05:00
workspace: Focus only ancestors who can be actually focused
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 fault window instead of trying to request focus for a window that can't get focus anyways. Fixes #308
This commit is contained in:
parent
26cb0a5a75
commit
a5f360cb9e
@ -87,6 +87,12 @@ typedef struct _MetaWorkspaceLogicalMonitorData
|
||||
MetaRectangle logical_monitor_work_area;
|
||||
} MetaWorkspaceLogicalMonitorData;
|
||||
|
||||
typedef struct _MetaWorkspaceFocusableAncestorData
|
||||
{
|
||||
MetaWorkspace *workspace;
|
||||
MetaWindow **win;
|
||||
} MetaWorkspaceFocusableAncestorData;
|
||||
|
||||
static MetaWorkspaceLogicalMonitorData *
|
||||
meta_workspace_get_logical_monitor_data (MetaWorkspace *workspace,
|
||||
MetaLogicalMonitor *logical_monitor)
|
||||
@ -1328,13 +1334,21 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
record_ancestor (MetaWindow *window,
|
||||
void *data)
|
||||
find_focusable_ancestor (MetaWindow *window,
|
||||
void *data)
|
||||
{
|
||||
MetaWindow **result = data;
|
||||
MetaWorkspaceFocusableAncestorData *mwfa = data;
|
||||
MetaWindow **result = mwfa->win;
|
||||
|
||||
*result = window;
|
||||
return FALSE; /* quit with the first ancestor we find */
|
||||
if ((window->input || window->take_focus) &&
|
||||
meta_window_located_on_workspace (window, mwfa->workspace) &&
|
||||
meta_window_showing_on_its_workspace (window))
|
||||
{
|
||||
*result = window;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Focus ancestor of not_this_one if there is one */
|
||||
@ -1355,12 +1369,10 @@ focus_ancestor_or_top_window (MetaWorkspace *workspace,
|
||||
/* First, check to see if we need to focus an ancestor of a window */
|
||||
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))
|
||||
MetaWindow *ancestor = NULL;
|
||||
MetaWorkspaceFocusableAncestorData mwfa = { workspace, &ancestor };
|
||||
meta_window_foreach_ancestor (not_this_one, find_focusable_ancestor, &mwfa);
|
||||
if (ancestor != NULL)
|
||||
{
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focusing %s, ancestor of %s\n",
|
||||
|
Loading…
Reference in New Issue
Block a user