From de5588c10ee640c23426c62553df0964f29ef28e Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Wed, 2 Feb 2005 18:46:09 +0000 Subject: [PATCH] Focus parents of dismissed transient windows in preference to the window 2005-02-02 Elijah Newren Focus parents of dismissed transient windows in preference to the window that most recently had keyboard focus. Fixes #157360. * doc/how-to-get-focus-right.txt: Note the distinction between "most recently used window" and "most recent to have keyboard focus" that we are now making. * src/workspace.c: (focus_ancestor_or_mru_window): rename from meta_workspace_focus_mru_window, and first check whether we need to focus an ancestor window before looking for the mru window, (record_ancestor): helper function for focus_ancestor_or_mru_window, (meta_workspace_focus_default_window): update due to the function rename from meta_workspace_focus_mru_window to focus_ancestor_or_mru_window --- ChangeLog | 18 ++++++++++ doc/how-to-get-focus-right.txt | 8 +++++ src/workspace.c | 64 +++++++++++++++++++++++++++------- 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 05dcecf1b..9766a7af8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2005-02-02 Elijah Newren + + Focus parents of dismissed transient windows in preference to the + window that most recently had keyboard focus. Fixes #157360. + + * doc/how-to-get-focus-right.txt: Note the distinction between + "most recently used window" and "most recent to have keyboard + focus" that we are now making. + + * src/workspace.c: (focus_ancestor_or_mru_window): rename from + meta_workspace_focus_mru_window, and first check whether we need + to focus an ancestor window before looking for the mru window, + (record_ancestor): helper function for + focus_ancestor_or_mru_window, + (meta_workspace_focus_default_window): update due to the function + rename from meta_workspace_focus_mru_window to + focus_ancestor_or_mru_window + 2005-01-31 Elijah Newren Try 2 to correct misleading and inaccurate wording. Hopefully, diff --git a/doc/how-to-get-focus-right.txt b/doc/how-to-get-focus-right.txt index 2f9f03e92..9d9ab6960 100644 --- a/doc/how-to-get-focus-right.txt +++ b/doc/how-to-get-focus-right.txt @@ -37,6 +37,14 @@ Focus method Behavior mouse Focus the window containing the pointer if there is one, otherwise focus the designated "no_focus_window". +Note that "most recently used window", as used here, has a slightly +different connotation than "most recent to have keyboard focus". This +is because when a user activates a window that is a transient, its +ancestor(s) should be considered to be more recently used than other +windows that have had the keyboard focus more recently. (See bug +157360; this may mean that the alt-tab order should also change +simultaneously, although the current implementation does not do that.) + Also, sometimes a new window will be mapped (e.g. unminimizing a window or launching a new application). Most users want to interact with new windows right away, so these should typically be focused. diff --git a/src/workspace.c b/src/workspace.c index 357a8e560..6954a572e 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -27,11 +27,11 @@ #include #include -void meta_workspace_queue_calc_showing (MetaWorkspace *workspace); -static void set_active_space_hint (MetaScreen *screen); -static void meta_workspace_focus_mru_window (MetaWorkspace *workspace, - MetaWindow *not_this_one, - Time timestamp); +void meta_workspace_queue_calc_showing (MetaWorkspace *workspace); +static void set_active_space_hint (MetaScreen *screen); +static void focus_ancestor_or_mru_window (MetaWorkspace *workspace, + MetaWindow *not_this_one, + Time timestamp); static void maybe_add_to_list (MetaScreen *screen, MetaWindow *window, gpointer data) @@ -801,7 +801,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace, if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK) - meta_workspace_focus_mru_window (workspace, not_this_one, timestamp); + focus_ancestor_or_mru_window (workspace, not_this_one, timestamp); else { MetaWindow * window; @@ -838,7 +838,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace, } } else if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_SLOPPY) - meta_workspace_focus_mru_window (workspace, not_this_one, timestamp); + focus_ancestor_or_mru_window (workspace, not_this_one, timestamp); else if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_MOUSE) { meta_topic (META_DEBUG_FOCUS, @@ -850,11 +850,23 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace, } } -/* Focus MRU window (or top window if failed) on active workspace */ -void -meta_workspace_focus_mru_window (MetaWorkspace *workspace, - MetaWindow *not_this_one, - Time timestamp) +static gboolean +record_ancestor (MetaWindow *window, + void *data) +{ + MetaWindow **result = data; + + *result = 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 + */ +static void +focus_ancestor_or_mru_window (MetaWorkspace *workspace, + MetaWindow *not_this_one, + Time timestamp) { MetaWindow *window = NULL; GList *tmp; @@ -862,7 +874,33 @@ meta_workspace_focus_mru_window (MetaWorkspace *workspace, if (not_this_one) meta_topic (META_DEBUG_FOCUS, "Focusing MRU window excluding %s\n", not_this_one->desc); - + else + meta_topic (META_DEBUG_FOCUS, + "Focusing MRU window\n"); + + /* 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_topic (META_DEBUG_FOCUS, + "Focusing %s, ancestor of %s\n", + ancestor->desc, not_this_one->desc); + + meta_window_focus (ancestor, timestamp); + + /* Also raise the window if in click-to-focus */ + if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK) + meta_window_raise (ancestor); + + return; + } + } + + /* No ancestor, look for the MRU window */ tmp = workspace->mru_list; while (tmp)