diff options
| -rw-r--r-- | doc/how-to-get-focus-right.txt | 2 | ||||
| -rw-r--r-- | src/core/stack.c | 1 | ||||
| -rw-r--r-- | src/core/window.c | 2 | ||||
| -rw-r--r-- | src/core/workspace.c | 42 | ||||
| -rw-r--r-- | src/core/workspace.h | 11 | 
5 files changed, 18 insertions, 40 deletions
| diff --git a/doc/how-to-get-focus-right.txt b/doc/how-to-get-focus-right.txt index 45c0f378..b9ccee6d 100644 --- a/doc/how-to-get-focus-right.txt +++ b/doc/how-to-get-focus-right.txt @@ -7,7 +7,7 @@ end of the discussion for how these special cases are handled.)  The  basics are easy:  Focus method  Behavior -    click     When a user clicks on a window, focus it +    click     Focus the window on top     sloppy     When an EnterNotify is received, focus the window      mouse     Same as sloppy, but also defocus when mouse enters DESKTOP                window diff --git a/src/core/stack.c b/src/core/stack.c index fa4dbee3..d2eb7acf 100644 --- a/src/core/stack.c +++ b/src/core/stack.c @@ -237,7 +237,6 @@ meta_stack_freeze (MetaStack *stack)    stack->freeze_count += 1;  } -  void  meta_stack_thaw (MetaStack *stack)  { diff --git a/src/core/window.c b/src/core/window.c index 603bedf3..bc04b644 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -6214,7 +6214,6 @@ idle_update_icon (gpointer data)    return FALSE;  } -  MetaWorkspace *  meta_window_get_workspace (MetaWindow *window)  { @@ -6224,7 +6223,6 @@ meta_window_get_workspace (MetaWindow *window)      return window->workspace;  } -  GList*  meta_window_get_workspaces (MetaWindow *window)  { diff --git a/src/core/workspace.c b/src/core/workspace.c index 98c33e20..04ba575b 100644 --- a/src/core/workspace.c +++ b/src/core/workspace.c @@ -33,7 +33,7 @@  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, +static void focus_ancestor_or_top_window (MetaWorkspace *workspace,                                            MetaWindow    *not_this_one,                                            guint32        timestamp);  static void free_this                    (gpointer candidate, @@ -971,7 +971,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,    if (meta_prefs_get_focus_mode () == META_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; @@ -1008,7 +1008,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,              }          }        else if (meta_prefs_get_focus_mode () == META_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 () == META_FOCUS_MODE_MOUSE)          {            meta_topic (META_DEBUG_FOCUS, @@ -1035,13 +1035,11 @@ record_ancestor (MetaWindow *window,   * window on active workspace   */  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, @@ -1072,36 +1070,8 @@ 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)      { diff --git a/src/core/workspace.h b/src/core/workspace.h index 7d02861e..b8ea3c97 100644 --- a/src/core/workspace.h +++ b/src/core/workspace.h @@ -52,6 +52,17 @@ 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; | 
