summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/how-to-get-focus-right.txt3
-rw-r--r--src/core/workspace-private.h10
-rw-r--r--src/core/workspace.c47
3 files changed, 19 insertions, 41 deletions
diff --git a/doc/how-to-get-focus-right.txt b/doc/how-to-get-focus-right.txt
index 53cfa5245..574a3a533 100644
--- a/doc/how-to-get-focus-right.txt
+++ b/doc/how-to-get-focus-right.txt
@@ -31,8 +31,7 @@ workspaces. In these cases, there needs to be a rule consistent with
the above about the new window to choose.
Focus method Behavior
- click Focus the most recently used window (same as the window
- on top)
+ click Focus the window on top
sloppy Focus the window containing the pointer if there is such
a window, otherwise focus the most recently used window.
mouse Focus the non-DESKTOP window containing the pointer if
diff --git a/src/core/workspace-private.h b/src/core/workspace-private.h
index f1391d0c8..81bfe867a 100644
--- a/src/core/workspace-private.h
+++ b/src/core/workspace-private.h
@@ -42,6 +42,16 @@ struct _MetaWorkspace
MetaScreen *screen;
GList *windows;
+
+ /* The "MRU list", or "most recently used" list, is a list of
+ * MetaWindows ordered based on the time the the user interacted
+ * with the window most recently.
+ *
+ * For historical reasons, we keep an MRU list per workspace.
+ * It used to be used to calculate the default focused window,
+ * but isn't anymore, as the window next in the stacking order
+ * can sometimes be not the window the user interacted with last,
+ */
GList *mru_list;
GList *list_containing_self;
diff --git a/src/core/workspace.c b/src/core/workspace.c
index 5930d76bb..eeb11c5b1 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -46,7 +46,7 @@ enum {
};
void meta_workspace_queue_calc_showing (MetaWorkspace *workspace);
-static void focus_ancestor_or_mru_window (MetaWorkspace *workspace,
+static void focus_ancestor_or_top_window (MetaWorkspace *workspace,
MetaWindow *not_this_one,
guint32 timestamp);
static void free_this (gpointer candidate,
@@ -1201,7 +1201,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK ||
!workspace->screen->display->mouse_mode)
- focus_ancestor_or_mru_window (workspace, not_this_one, timestamp);
+ focus_ancestor_or_top_window (workspace, not_this_one, timestamp);
else
{
MetaWindow * window;
@@ -1238,7 +1238,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
}
}
else if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_SLOPPY)
- focus_ancestor_or_mru_window (workspace, not_this_one, timestamp);
+ focus_ancestor_or_top_window (workspace, not_this_one, timestamp);
else if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_MOUSE)
{
meta_topic (META_DEBUG_FOCUS,
@@ -1261,17 +1261,13 @@ record_ancestor (MetaWindow *window,
return FALSE; /* quit with the first ancestor we find */
}
-/* Focus ancestor of not_this_one if there is one, otherwise focus the MRU
- * window on active workspace
- */
+/* Focus ancestor of not_this_one if there is one */
static void
-focus_ancestor_or_mru_window (MetaWorkspace *workspace,
+focus_ancestor_or_top_window (MetaWorkspace *workspace,
MetaWindow *not_this_one,
guint32 timestamp)
{
MetaWindow *window = NULL;
- MetaWindow *desktop_window = NULL;
- GList *tmp;
if (not_this_one)
meta_topic (META_DEBUG_FOCUS,
@@ -1305,36 +1301,9 @@ focus_ancestor_or_mru_window (MetaWorkspace *workspace,
}
}
- /* No ancestor, look for the MRU window */
- tmp = workspace->mru_list;
-
- while (tmp)
- {
- MetaWindow* tmp_window;
- tmp_window = ((MetaWindow*) tmp->data);
- if (tmp_window != not_this_one &&
- meta_window_showing_on_its_workspace (tmp_window) &&
- tmp_window->type != META_WINDOW_DOCK &&
- tmp_window->type != META_WINDOW_DESKTOP)
- {
- window = tmp->data;
- break;
- }
- else if (tmp_window != not_this_one &&
- desktop_window == NULL &&
- meta_window_showing_on_its_workspace (tmp_window) &&
- tmp_window->type == META_WINDOW_DESKTOP)
- {
- /* Found the most recently used desktop window */
- desktop_window = tmp_window;
- }
-
- tmp = tmp->next;
- }
-
- /* If no window was found, default to the MRU desktop-window */
- if (window == NULL)
- window = desktop_window;
+ window = meta_stack_get_default_focus_window (workspace->screen->stack,
+ workspace,
+ NULL);
if (window)
{