[nautilus/wip/antoniof/fix-toolbar-flickering-and-warning] toolbar: Fix flickering when sidebar folds




commit fac526636206fd613ec0444bce3d448c96ed0366
Author: António Fernandes <antoniof gnome org>
Date:   Wed Jul 20 23:07:52 2022 +0200

    toolbar: Fix flickering when sidebar folds
    
    Fixes  the following warning and the matching flicker:
    "Trying to snapshot NautilusToolbar without a current allocation"

 src/nautilus-toolbar.c               | 14 ++++++++++++++
 src/resources/ui/nautilus-toolbar.ui |  3 +--
 2 files changed, 15 insertions(+), 2 deletions(-)
---
diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c
index d84742143..3cc30bc87 100644
--- a/src/nautilus-toolbar.c
+++ b/src/nautilus-toolbar.c
@@ -913,6 +913,14 @@ nautilus_toolbar_on_window_constructed (NautilusToolbar *self)
     undo_manager_changed (self);
 }
 
+static void
+on_idle_show_sidebar_button (gpointer user_data)
+{
+    NautilusToolbar *self = NAUTILUS_TOOLBAR (user_data);
+
+    gtk_widget_set_visible (self->sidebar_button, self->show_sidebar_button);
+}
+
 static void
 nautilus_toolbar_get_property (GObject    *object,
                                guint       property_id,
@@ -1056,6 +1064,11 @@ nautilus_toolbar_set_property (GObject      *object,
         case PROP_SHOW_SIDEBAR_BUTTON:
         {
             self->show_sidebar_button = g_value_get_boolean (value);
+            /* This is set as a result of the sidebar folding when the window
+             * goes under certain width. Actually showing a button at this point
+             * would result in trying to snapshot the toolbar without an
+             * allocation. So, do it on idle instead. */
+            g_idle_add_once (on_idle_show_sidebar_button, self);
         }
         break;
 
@@ -1183,6 +1196,7 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass)
     gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, view_toggle_icon);
     gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, app_button);
     gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, undo_redo_section);
+    gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, sidebar_button);
     gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, back_button);
     gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, back_menu);
     gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, forward_button);
diff --git a/src/resources/ui/nautilus-toolbar.ui b/src/resources/ui/nautilus-toolbar.ui
index b2b5632dc..0f1ff1055 100644
--- a/src/resources/ui/nautilus-toolbar.ui
+++ b/src/resources/ui/nautilus-toolbar.ui
@@ -161,8 +161,7 @@
           </object>
         </child>
         <child type="start">
-          <object class="GtkToggleButton" id="show_sidebar_button">
-            <property name="visible" bind-source="NautilusToolbar" bind-property="show-sidebar-button" 
bind-flags="bidirectional|sync-create"/>
+          <object class="GtkToggleButton" id="sidebar_button">
             <property name="active" bind-source="NautilusToolbar" bind-property="sidebar-button-active" 
bind-flags="bidirectional|sync-create"/>
             <property name="tooltip-text" translatable="yes">Show sidebar</property>
             <property name="icon-name">sidebar-show-symbolic</property>


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