[gtk/focus-ring-experiment] Focus ring experiments



commit 0d6b5c8637a3ff38434cca1945f7280134f1f73c
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Apr 21 18:14:40 2020 -0400

    Focus ring experiments
    
    Make the visible focus disappear after 10 seconds, but make
    it come back on any key press. Is this too annoying ?

 gtk/gtkwindow.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 48 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index c02742e055..2f66ce4fd4 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -192,6 +192,8 @@ typedef struct
 
   guint    mnemonics_display_timeout_id;
 
+  guint    focus_visible_timeout;
+
   gint     scale;
 
   gint title_height;
@@ -4077,6 +4079,12 @@ gtk_window_finalize (GObject *object)
       priv->mnemonics_display_timeout_id = 0;
     }
 
+  if (priv->focus_visible_timeout)
+    {
+      g_source_remove (priv->focus_visible_timeout);
+      priv->focus_visible_timeout = 0;
+    }
+
   g_clear_object (&priv->constraint_solver);
   g_clear_object (&priv->renderer);
   g_clear_object (&priv->resize_cursor);
@@ -7416,6 +7424,19 @@ gtk_window_get_focus_visible (GtkWindow *window)
   return priv->focus_visible;
 }
 
+static gboolean
+unset_focus_visible (gpointer data)
+{
+  GtkWindow *window = data;
+  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
+  priv->focus_visible_timeout = 0;
+
+  gtk_window_set_focus_visible (window, FALSE);
+
+  return G_SOURCE_REMOVE;
+}
+
 /**
  * gtk_window_set_focus_visible:
  * @window: a #GtkWindow
@@ -7427,15 +7448,39 @@ void
 gtk_window_set_focus_visible (GtkWindow *window,
                               gboolean   setting)
 {
+  gboolean changed;
+
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
 
   g_return_if_fail (GTK_IS_WINDOW (window));
 
-  setting = setting != FALSE;
+  changed = priv->focus_visible != setting;
+
+  priv->focus_visible = setting;
+
+  if (priv->focus_visible_timeout)
+    {
+      g_source_remove (priv->focus_visible_timeout);
+      priv->focus_visible_timeout = 0;
+    }
 
-  if (priv->focus_visible != setting)
+  if (priv->focus_visible)
+    priv->focus_visible_timeout = g_timeout_add_seconds (5, unset_focus_visible, window);
+
+  if (changed)
     {
-      priv->focus_visible = setting;
+      if (priv->focus_widget)
+        {
+          GtkWidget *widget;
+
+          for (widget = priv->focus_widget; widget; widget = gtk_widget_get_parent (widget))
+            {
+              if (priv->focus_visible)
+                gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_FOCUS_VISIBLE, FALSE);
+              else
+                gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_FOCUS_VISIBLE);
+            }
+        }
       g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FOCUS_VISIBLE]);
     }
 }


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