[gnome-text-editor] page: set_visible(false) on overlay revealers
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-text-editor] page: set_visible(false) on overlay revealers
- Date: Fri, 12 Nov 2021 23:49:59 +0000 (UTC)
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]