[gnome-text-editor] page: set_visible(false) on overlay revealers



commit aca7d1d1543ca84800ebae0577d14854041dc303
Author: Christian Hergert <chergert redhat com>
Date:   Fri Nov 12 15:38:42 2021 -0800

    page: set_visible(false) on overlay revealers
    
    The goal here is to keep revealers out of the size allocation machinery
    when they aren't actually to be displayed. That can save some CPU burnt
    on something we don't care about since it doesn't even use it to enforce
    the size of the overlay anyway.

 src/editor-page.c          |  3 +++
 src/editor-utils-private.h |  1 +
 src/editor-utils.c         | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 67 insertions(+)
---
diff --git a/src/editor-page.c b/src/editor-page.c
index 5772478..e256dd3 100644
--- a/src/editor-page.c
+++ b/src/editor-page.c
@@ -651,6 +651,9 @@ editor_page_init (EditorPage *self)
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
+  _editor_revealer_auto_hide (self->search_revealer);
+  _editor_revealer_auto_hide (self->goto_line_revealer);
+
   /* Work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4315
    * by connecting to the GtkText to intercept insert-text() emission.
    */
diff --git a/src/editor-utils-private.h b/src/editor-utils-private.h
index b7fe25a..3f0a004 100644
--- a/src/editor-utils-private.h
+++ b/src/editor-utils-private.h
@@ -54,5 +54,6 @@ void                     _editor_file_chooser_add_line_endings  (GtkFileChooser
                                                                  GtkSourceNewlineType        selected);
 const GtkSourceEncoding *_editor_file_chooser_get_encoding      (GtkFileChooser             *chooser);
 GtkSourceNewlineType     _editor_file_chooser_get_line_ending   (GtkFileChooser             *chooser);
+void                     _editor_revealer_auto_hide             (GtkRevealer                *revealer);
 
 G_END_DECLS
diff --git a/src/editor-utils.c b/src/editor-utils.c
index fa2c9a9..a68218e 100644
--- a/src/editor-utils.c
+++ b/src/editor-utils.c
@@ -497,3 +497,66 @@ _editor_file_chooser_get_line_ending (GtkFileChooser *chooser)
 
   return GTK_SOURCE_NEWLINE_TYPE_LF;
 }
+
+static gboolean
+revealer_autohide (gpointer data)
+{
+  GtkRevealer *revealer = data;
+
+  g_assert (GTK_IS_REVEALER (revealer));
+
+  g_object_set_data (G_OBJECT (revealer), "AUTOHIDE_ID", NULL);
+
+  if (gtk_widget_get_parent (GTK_WIDGET (revealer)) != NULL)
+    {
+      if (!gtk_revealer_get_reveal_child (revealer) &&
+          !gtk_revealer_get_child_revealed (revealer))
+        gtk_widget_hide (GTK_WIDGET (revealer));
+    }
+
+  return G_SOURCE_REMOVE;
+}
+
+static void
+revealer_queue_autohide (GtkRevealer *revealer)
+{
+  guint id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (revealer), "AUTOHIDE_ID"));
+
+  if (id != 0)
+    {
+      g_source_remove (id);
+      id = 0;
+    }
+
+  if (gtk_widget_get_parent (GTK_WIDGET (revealer)) != NULL)
+    id = g_idle_add_full (G_PRIORITY_HIGH,
+                          revealer_autohide,
+                          g_object_ref (revealer),
+                          g_object_unref);
+
+  g_object_set_data (G_OBJECT (revealer), "AUTOHIDE_ID", GUINT_TO_POINTER (id));
+
+  if ((gtk_revealer_get_reveal_child (revealer) ||
+       gtk_revealer_get_child_revealed (revealer)) &&
+      !gtk_widget_get_visible (GTK_WIDGET (revealer)))
+    gtk_widget_show (GTK_WIDGET (revealer));
+}
+
+/* Try to get a revealer out of the size request machinery
+ * until it is even necessary (ie: displayed).
+ */
+void
+_editor_revealer_auto_hide (GtkRevealer *revealer)
+{
+  g_return_if_fail (GTK_IS_REVEALER (revealer));
+
+  g_signal_connect (revealer,
+                    "notify::reveal-child",
+                    G_CALLBACK (revealer_queue_autohide),
+                    NULL);
+  g_signal_connect (revealer,
+                    "notify::child-revealed",
+                    G_CALLBACK (revealer_queue_autohide),
+                    NULL);
+  revealer_queue_autohide (revealer);
+}


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