[gtksourceview/gnome-3-18] map: avoid handling GtkAdjustment signals when hidden



commit b8e283b146f228b0aea92848c79e991c30ba8a91
Author: Christian Hergert <christian hergert me>
Date:   Wed Apr 20 20:41:53 2016 -0700

    map: avoid handling GtkAdjustment signals when hidden
    
    It is often the case that a GtkSourceMap will be packed into the widget
    hierarchy, but not visible unless the user has enabled the feature.
    
    This means that we receive a lot of signal notifications when we can't
    do anything about it. So instead, toggle the signal activity based on
    whether or not we are visible.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=765358

 gtksourceview/gtksourcemap.c |   51 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)
---
diff --git a/gtksourceview/gtksourcemap.c b/gtksourceview/gtksourcemap.c
index 815e1e5..311a7d8 100644
--- a/gtksourceview/gtksourcemap.c
+++ b/gtksourceview/gtksourcemap.c
@@ -732,6 +732,13 @@ connect_view (GtkSourceMap  *map,
                gtk_widget_add_events (GTK_WIDGET (priv->view), GDK_LEAVE_NOTIFY_MASK);
        }
 
+       /* If we are not visible, we want to block certain signal handlers */
+       if (!gtk_widget_get_visible (GTK_WIDGET (map)))
+       {
+               g_signal_handler_block (vadj, priv->view_vadj_value_changed_handler);
+               g_signal_handler_block (vadj, priv->view_vadj_notify_upper_handler);
+       }
+
        gtk_source_map_rebuild_css (map);
 }
 
@@ -1055,6 +1062,48 @@ gtk_source_map_realize (GtkWidget *widget)
 }
 
 static void
+gtk_source_map_show (GtkWidget *widget)
+{
+       GtkSourceMap *map = GTK_SOURCE_MAP (widget);
+       GtkSourceMapPrivate *priv;
+       GtkAdjustment *vadj;
+
+       GTK_WIDGET_CLASS (gtk_source_map_parent_class)->show (widget);
+
+       priv = gtk_source_map_get_instance_private (map);
+
+       if (priv->view != NULL)
+       {
+               vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (priv->view));
+
+               g_signal_handler_unblock (vadj, priv->view_vadj_value_changed_handler);
+               g_signal_handler_unblock (vadj, priv->view_vadj_notify_upper_handler);
+
+               g_object_notify (G_OBJECT (vadj), "upper");
+               g_signal_emit_by_name (vadj, "value-changed");
+       }
+}
+
+static void
+gtk_source_map_hide (GtkWidget *widget)
+{
+       GtkSourceMap *map = GTK_SOURCE_MAP (widget);
+       GtkSourceMapPrivate *priv;
+       GtkAdjustment *vadj;
+
+       GTK_WIDGET_CLASS (gtk_source_map_parent_class)->hide (widget);
+
+       priv = gtk_source_map_get_instance_private (map);
+
+       if (priv->view != NULL)
+       {
+               vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (priv->view));
+               g_signal_handler_block (vadj, priv->view_vadj_value_changed_handler);
+               g_signal_handler_block (vadj, priv->view_vadj_notify_upper_handler);
+       }
+}
+
+static void
 gtk_source_map_class_init (GtkSourceMapClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -1067,11 +1116,13 @@ gtk_source_map_class_init (GtkSourceMapClass *klass)
        widget_class->draw = gtk_source_map_draw;
        widget_class->get_preferred_height = gtk_source_map_get_preferred_height;
        widget_class->get_preferred_width = gtk_source_map_get_preferred_width;
+       widget_class->hide = gtk_source_map_hide;
        widget_class->size_allocate = gtk_source_map_size_allocate;
        widget_class->button_press_event = gtk_source_map_button_press_event;
        widget_class->button_release_event = gtk_source_map_button_release_event;
        widget_class->motion_notify_event = gtk_source_map_motion_notify_event;
        widget_class->scroll_event = gtk_source_map_scroll_event;
+       widget_class->show = gtk_source_map_show;
        widget_class->state_flags_changed = gtk_source_map_state_flags_changed;
        widget_class->realize = gtk_source_map_realize;
 


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