[libdazzle/libdazzle-3-26] signal-group: avoid some unnecessary signal emissions



commit 268ddbb32593ab94ccb8aa38871d7e2cf96da08b
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jan 12 15:30:33 2018 -0800

    signal-group: avoid some unnecessary signal emissions

 src/bindings/dzl-signal-group.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)
---
diff --git a/src/bindings/dzl-signal-group.c b/src/bindings/dzl-signal-group.c
index cfbf294..4f94df3 100644
--- a/src/bindings/dzl-signal-group.c
+++ b/src/bindings/dzl-signal-group.c
@@ -56,6 +56,8 @@ struct _DzlSignalGroup
   GPtrArray  *handlers;
   GType       target_type;
   gsize       block_count;
+
+  guint       has_bound_at_least_once : 1;
 };
 
 struct _DzlSignalGroupClass
@@ -124,13 +126,12 @@ dzl_signal_group__target_weak_notify (gpointer  data,
                                       GObject  *where_object_was)
 {
   DzlSignalGroup *self = data;
-  gsize i;
 
   g_assert (DZL_IS_SIGNAL_GROUP (self));
   g_assert (where_object_was != NULL);
   g_assert (self->target == where_object_was);
 
-  for (i = 0; i < self->handlers->len; i++)
+  for (guint i = 0; i < self->handlers->len; i++)
     {
       SignalHandler *handler;
 
@@ -210,6 +211,8 @@ dzl_signal_group_bind (DzlSignalGroup *self,
   if (target == NULL)
     return;
 
+  self->has_bound_at_least_once = TRUE;
+
   g_object_ref (target);
 
   self->target = target;
@@ -419,8 +422,12 @@ dzl_signal_group_set_target (DzlSignalGroup *self,
   if (!dzl_signal_group_check_target_type (self, target))
     return;
 
-  dzl_signal_group_unbind (self);
+  /* Only emit unbind if we've ever called bind */
+  if (self->has_bound_at_least_once)
+    dzl_signal_group_unbind (self);
+
   dzl_signal_group_bind (self, target);
+
   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_TARGET]);
 }
 
@@ -460,7 +467,9 @@ dzl_signal_group_dispose (GObject *object)
 {
   DzlSignalGroup *self = (DzlSignalGroup *)object;
 
-  dzl_signal_group_unbind (self);
+  if (self->has_bound_at_least_once)
+    dzl_signal_group_unbind (self);
+
   g_clear_pointer (&self->handlers, g_ptr_array_unref);
 
   G_OBJECT_CLASS (dzl_signal_group_parent_class)->dispose (object);


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