[mutter/wip/exalm/focused-appearance: 5/6] window: Make default focus window on each workspace appear focused



commit 37d7ec9d44c2b65f8e1771d0adc7aa5e2507b58b
Author: Alexander Mikhaylenko <exalm7659 gmail com>
Date:   Sat Oct 12 23:55:26 2019 +0500

    window: Make default focus window on each workspace appear focused
    
    Makes workspace transitions in gnome-shell look more seamless, since
    both outgoing and incoming workspace have focused windows.
    
    This is only done for click focus mode, since it's not known which
    window would be focused for the other modes.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/850

 src/core/window-private.h |  2 ++
 src/core/window.c         | 18 ++++++++++++++++--
 src/core/workspace.c      |  3 +++
 3 files changed, 21 insertions(+), 2 deletions(-)
---
diff --git a/src/core/window-private.h b/src/core/window-private.h
index f45e7b111..484140a27 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -682,6 +682,8 @@ void        meta_window_get_session_geometry (MetaWindow  *window,
 
 void        meta_window_update_unfocused_button_grabs (MetaWindow *window);
 
+void        meta_window_appears_focused_changed (MetaWindow *window);
+
 void     meta_window_set_focused_internal (MetaWindow *window,
                                            gboolean    focused);
 
diff --git a/src/core/window.c b/src/core/window.c
index 03f1fab27..4627e5f7b 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -251,6 +251,10 @@ prefs_changed_callback (MetaPreference pref,
       meta_window_recalc_features (window);
       meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
     }
+  else if (pref == META_PREF_FOCUS_MODE)
+    {
+      meta_window_appears_focused_changed (window);
+    }
 }
 
 static void
@@ -5166,7 +5170,7 @@ meta_window_change_workspace_by_index (MetaWindow *window,
     meta_window_change_workspace (window, workspace);
 }
 
-static void
+void
 meta_window_appears_focused_changed (MetaWindow *window)
 {
   set_net_wm_state (window);
@@ -7241,7 +7245,17 @@ meta_window_get_frame (MetaWindow *window)
 gboolean
 meta_window_appears_focused (MetaWindow *window)
 {
-  return window->has_focus || (window->attached_focus_window != NULL);
+  MetaWorkspaceManager *workspace_manager;
+  MetaWorkspace *workspace;
+  MetaWindow *default_window = NULL;
+
+  workspace_manager = window->display->workspace_manager;
+  workspace = meta_window_get_workspace (window);
+
+  if (workspace && workspace != workspace_manager->active_workspace)
+    default_window = meta_workspace_get_default_focus_window (workspace);
+
+  return window->has_focus || (window->attached_focus_window != NULL) || (window == default_window);
 }
 
 gboolean
diff --git a/src/core/workspace.c b/src/core/workspace.c
index 3ed91b58c..e0e763429 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -526,6 +526,7 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
   MetaWorkspaceLayout layout1, layout2;
   gint num_workspaces, current_space, new_space;
   MetaMotionDirection direction;
+  GList *l;
 
   meta_verbose ("Activating workspace %d\n",
                 meta_workspace_index (workspace));
@@ -644,6 +645,8 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
   if (focus_this)
     {
       meta_window_activate (focus_this, timestamp);
+      for (l = workspace->windows; l; l = l->next)
+        meta_window_appears_focused_changed (l->data);
     }
   else if (move_window)
     {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]