[mutter/wip/exalm/focused-appearance: 4/4] window: Appear as focused while focusing




commit be6095d177546ec1f0e4c0f133eadc57ed68d887
Author: Alexander Mikhaylenko <exalm7659 gmail com>
Date:   Sun Oct 13 05:15:51 2019 +0500

    window: Appear as focused while focusing
    
    Prevent focused window from blinking after switching to another
    workspace on X11.

 src/core/window-private.h | 3 +++
 src/core/window.c         | 9 ++++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)
---
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 83d3a5813f..84b31b960c 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -562,6 +562,9 @@ struct _MetaWindow
   guint unmanage_idle_id;
 
   pid_t client_pid;
+
+  /* Prevent blinking when focusing */
+  gboolean focusing;
 };
 
 struct _MetaWindowClass
diff --git a/src/core/window.c b/src/core/window.c
index bc02ac0be3..48defdde35 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -4821,6 +4821,10 @@ meta_window_focus (MetaWindow  *window,
       window = modal_transient;
     }
 
+  /* If the window was already appearing focused, but didn't have has_focus set,
+   * it will now briefly appear unfocused on X11. Set a flag to prevent that. */
+  window->focusing = TRUE;
+
   meta_window_flush_calc_showing (window);
 
   if ((!window->mapped || window->hidden) && !window->shaded)
@@ -4828,6 +4832,7 @@ meta_window_focus (MetaWindow  *window,
       meta_topic (META_DEBUG_FOCUS,
                   "Window %s is not showing, not focusing after all",
                   window->desc);
+      window->focusing = FALSE;
       return;
     }
 
@@ -5313,6 +5318,8 @@ meta_window_set_focused_internal (MetaWindow *window,
 {
   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
 
+  window->focusing = FALSE;
+
   if (focused)
     {
       window->has_focus = TRUE;
@@ -7328,7 +7335,7 @@ meta_window_appears_focused (MetaWindow *window)
   if (workspace && workspace != workspace_manager->active_workspace)
     return window == meta_workspace_get_default_focus_window (workspace);
   else
-    return window->has_focus || !window->attached_focus_window;
+    return window->has_focus || window->focusing || !window->attached_focus_window;
 }
 
 gboolean


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