[gtksourceview/gnome-3-18] map: avoid handling GtkAdjustment signals when hidden
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/gnome-3-18] map: avoid handling GtkAdjustment signals when hidden
- Date: Sat, 23 Apr 2016 12:36:23 +0000 (UTC)
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]