[gtk/focus-ring-experiment] fine-tuning



commit b2ac1e96df941547ef9b969d8c17474ca060da39
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Apr 22 23:52:20 2020 -0400

    fine-tuning
    
    Make it so that we only turn on visible focus in reponse to
    a key press when focus moves between key press and release.
    
    Additionally, make focus visible while Alt is pressed.
    
    We still turn visible focus off after 5 seconds of no
    keyboard interaction.

 gtk/gtkwindow.c | 35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 2f66ce4fd4..36196e14e7 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -200,6 +200,7 @@ typedef struct
   GtkWidget *title_box;
   GtkWidget *titlebar;
   GtkWidget *popup_menu;
+  GtkWidget *key_press_focus;
 
   GdkMonitor *initial_fullscreen_monitor;
   guint      edge_constraints;
@@ -5379,6 +5380,36 @@ update_mnemonics_visible (GtkWindow       *window,
     }
 }
 
+static void
+update_focus_visible (GtkWindow       *window,
+                      guint            keyval,
+                      GdkModifierType  state,
+                      gboolean         visible)
+{
+  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
+  if (visible)
+    {
+      if (priv->focus_visible)
+        priv->key_press_focus = NULL;
+      else
+        priv->key_press_focus = priv->focus_widget;
+
+      if ((keyval == GDK_KEY_Alt_L || keyval == GDK_KEY_Alt_R) &&
+               ((state & (gtk_accelerator_get_default_mod_mask ()) & ~(GDK_ALT_MASK)) == 0))
+        gtk_window_set_focus_visible (window, TRUE);
+    }
+  else
+    {
+      if (priv->key_press_focus == priv->focus_widget)
+        gtk_window_set_focus_visible (window, FALSE);
+      else
+        gtk_window_set_focus_visible (window, TRUE);
+
+      priv->key_press_focus = NULL;
+    }
+}
+
 static gboolean
 gtk_window_key_pressed (GtkWidget       *widget,
                         guint            keyval,
@@ -5388,8 +5419,7 @@ gtk_window_key_pressed (GtkWidget       *widget,
 {
   GtkWindow *window = GTK_WINDOW (widget);
 
-  gtk_window_set_focus_visible (window, TRUE);
-
+  update_focus_visible (window, keyval, state, TRUE);
   update_mnemonics_visible (window, keyval, state, TRUE);
 
   return FALSE;
@@ -5404,6 +5434,7 @@ gtk_window_key_released (GtkWidget       *widget,
 {
   GtkWindow *window = GTK_WINDOW (widget);
 
+  update_focus_visible (window, keyval, state, FALSE);
   update_mnemonics_visible (window, keyval, state, FALSE);
 
   return FALSE;


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