[libdazzle/libdazzle-3-26] signal-group: avoid some unnecessary signal emissions
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libdazzle/libdazzle-3-26] signal-group: avoid some unnecessary signal emissions
- Date: Fri, 12 Jan 2018 23:31:18 +0000 (UTC)
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]