[gnome-builder] egg: Various cleanups and fixes



commit 6fdcb29fcf75ff2b01fe961e683cb841e65ea2c9
Author: Garrett Regier <garrettregier gmail com>
Date:   Sun May 3 13:17:20 2015 -0700

    egg: Various cleanups and fixes

 contrib/egg/egg-binding-set.c  |  143 ++++++++++++--------------
 contrib/egg/egg-binding-set.h  |    2 +-
 contrib/egg/egg-signal-group.c |  219 +++++++++++++++++++++-------------------
 contrib/egg/egg-signal-group.h |    2 +-
 4 files changed, 184 insertions(+), 182 deletions(-)
---
diff --git a/contrib/egg/egg-binding-set.c b/contrib/egg/egg-binding-set.c
index 04a99dd..054831c 100644
--- a/contrib/egg/egg-binding-set.c
+++ b/contrib/egg/egg-binding-set.c
@@ -16,6 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#define G_LOG_DOMAIN "egg-binding-set"
+
 #include <glib/gi18n.h>
 
 #include "egg-binding-set.h"
@@ -42,6 +44,7 @@ struct _EggBindingSet
 
 typedef struct
 {
+  EggBindingSet *set;
   const gchar   *source_property;
   const gchar   *target_property;
   GObject       *target;
@@ -66,26 +69,6 @@ egg_binding_set_new (void)
 }
 
 static void
-lazy_binding_free (gpointer data)
-{
-  LazyBinding *lazy_binding = data;
-
-  if (lazy_binding != NULL)
-    {
-      if (lazy_binding->binding != NULL)
-        {
-          g_binding_unbind (lazy_binding->binding);
-          lazy_binding->binding = NULL;
-        }
-
-      g_assert (lazy_binding->target == NULL);
-
-      lazy_binding->source_property = NULL;
-      lazy_binding->target_property = NULL;
-    }
-}
-
-static void
 egg_binding_set_connect (EggBindingSet *self,
                          LazyBinding   *lazy_binding)
 {
@@ -105,20 +88,14 @@ egg_binding_set_connect (EggBindingSet *self,
 }
 
 static void
-egg_binding_set_disconnect (EggBindingSet *self,
-                            LazyBinding   *lazy_binding)
+egg_binding_set_disconnect (LazyBinding *lazy_binding)
 {
-  GBinding *binding;
-
-  g_assert (EGG_IS_BINDING_SET (self));
   g_assert (lazy_binding != NULL);
 
-  binding = lazy_binding->binding;
-
-  if (binding != NULL)
+  if (lazy_binding->binding != NULL)
     {
+      g_binding_unbind (lazy_binding->binding);
       lazy_binding->binding = NULL;
-      g_binding_unbind (binding);
     }
 }
 
@@ -169,10 +146,30 @@ egg_binding_set__target_weak_notify (gpointer  data,
 }
 
 static void
+lazy_binding_free (gpointer data)
+{
+  LazyBinding *lazy_binding = data;
+
+  if (lazy_binding->target != NULL)
+    {
+      g_object_weak_unref (lazy_binding->target,
+                           egg_binding_set__target_weak_notify,
+                           lazy_binding->set);
+      lazy_binding->target = NULL;
+    }
+
+  egg_binding_set_disconnect (lazy_binding);
+
+  lazy_binding->set = NULL;
+  lazy_binding->source_property = NULL;
+  lazy_binding->target_property = NULL;
+  g_slice_free (LazyBinding, lazy_binding);
+}
+
+static void
 egg_binding_set_dispose (GObject *object)
 {
   EggBindingSet *self = (EggBindingSet *)object;
-  gsize i;
 
   g_assert (EGG_IS_BINDING_SET (self));
 
@@ -184,23 +181,6 @@ egg_binding_set_dispose (GObject *object)
       self->source = NULL;
     }
 
-  for (i = 0; i < self->lazy_bindings->len; i++)
-    {
-      LazyBinding *lazy_binding;
-
-      lazy_binding = g_ptr_array_index (self->lazy_bindings, i);
-
-      egg_binding_set_disconnect (self, lazy_binding);
-
-      if (lazy_binding->target != NULL)
-        {
-          g_object_weak_unref (lazy_binding->target,
-                               egg_binding_set__target_weak_notify,
-                               self);
-          lazy_binding->target = NULL;
-        }
-    }
-
   if (self->lazy_bindings->len != 0)
     g_ptr_array_remove_range (self->lazy_bindings, 0, self->lazy_bindings->len);
 
@@ -275,7 +255,8 @@ egg_binding_set_class_init (EggBindingSetClass *klass)
                          _("The source GObject."),
                          G_TYPE_OBJECT,
                          (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (object_class, PROP_SOURCE, gParamSpecs [PROP_SOURCE]);
+
+  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 }
 
 static void
@@ -284,7 +265,7 @@ egg_binding_set_init (EggBindingSet *self)
   self->lazy_bindings = g_ptr_array_new_with_free_func (lazy_binding_free);
 }
 
-gpointer
+GObject *
 egg_binding_set_get_source (EggBindingSet *self)
 {
   g_return_val_if_fail (EGG_IS_BINDING_SET (self), NULL);
@@ -300,46 +281,46 @@ egg_binding_set_set_source (EggBindingSet *self,
   g_return_if_fail (!source || G_IS_OBJECT (source));
   g_return_if_fail (source != (gpointer)self);
 
-  if (source != (gpointer)self->source)
+  if (source == (gpointer)self->source)
+    return;
+
+  if (self->source != NULL)
     {
-      if (self->source != NULL)
-        {
-          gsize i;
+      gsize i;
 
-          g_object_weak_unref (self->source,
-                               egg_binding_set__source_weak_notify,
-                               self);
-          self->source = NULL;
+      g_object_weak_unref (self->source,
+                           egg_binding_set__source_weak_notify,
+                           self);
+      self->source = NULL;
 
-          for (i = 0; i < self->lazy_bindings->len; i++)
-            {
-              LazyBinding *lazy_binding;
+      for (i = 0; i < self->lazy_bindings->len; i++)
+        {
+          LazyBinding *lazy_binding;
 
-              lazy_binding = g_ptr_array_index (self->lazy_bindings, i);
-              egg_binding_set_disconnect (self, lazy_binding);
-            }
+          lazy_binding = g_ptr_array_index (self->lazy_bindings, i);
+          egg_binding_set_disconnect (lazy_binding);
         }
+    }
 
-      if (source != NULL)
-        {
-          gsize i;
+  if (source != NULL)
+    {
+      gsize i;
 
-          self->source = source;
-          g_object_weak_ref (self->source,
-                             egg_binding_set__source_weak_notify,
-                             self);
+      self->source = source;
+      g_object_weak_ref (self->source,
+                         egg_binding_set__source_weak_notify,
+                         self);
 
-          for (i = 0; i < self->lazy_bindings->len; i++)
-            {
-              LazyBinding *lazy_binding;
+      for (i = 0; i < self->lazy_bindings->len; i++)
+        {
+          LazyBinding *lazy_binding;
 
-              lazy_binding = g_ptr_array_index (self->lazy_bindings, i);
-              egg_binding_set_connect (self, lazy_binding);
-            }
+          lazy_binding = g_ptr_array_index (self->lazy_bindings, i);
+          egg_binding_set_connect (self, lazy_binding);
         }
-
-      g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_SOURCE]);
     }
+
+  g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_SOURCE]);
 }
 
 void
@@ -353,11 +334,17 @@ egg_binding_set_bind (EggBindingSet *self,
 
   g_return_if_fail (EGG_IS_BINDING_SET (self));
   g_return_if_fail (source_property != NULL);
+  g_return_if_fail (self->source == NULL ||
+                    g_object_class_find_property (G_OBJECT_GET_CLASS (self->source),
+                                                  source_property) != NULL);
   g_return_if_fail (G_IS_OBJECT (target));
   g_return_if_fail (target_property != NULL);
+  g_return_if_fail (g_object_class_find_property (G_OBJECT_GET_CLASS (target),
+                                                  target_property) != NULL);
   g_return_if_fail (target != (gpointer)self);
 
   lazy_binding = g_slice_new0 (LazyBinding);
+  lazy_binding->set = self;
   lazy_binding->source_property = g_intern_string (source_property);
   lazy_binding->target_property = g_intern_string (target_property);
   lazy_binding->target = target;
diff --git a/contrib/egg/egg-binding-set.h b/contrib/egg/egg-binding-set.h
index 30ef756..cbe1caf 100644
--- a/contrib/egg/egg-binding-set.h
+++ b/contrib/egg/egg-binding-set.h
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (EggBindingSet, egg_binding_set, EGG, BINDING_SET, GObject)
 
 EggBindingSet *egg_binding_set_new        (void);
-gpointer       egg_binding_set_get_source (EggBindingSet *self);
+GObject       *egg_binding_set_get_source (EggBindingSet *self);
 void           egg_binding_set_set_source (EggBindingSet *self,
                                            gpointer       source);
 void           egg_binding_set_bind       (EggBindingSet *self,
diff --git a/contrib/egg/egg-signal-group.c b/contrib/egg/egg-signal-group.c
index 943b038..f46b451 100644
--- a/contrib/egg/egg-signal-group.c
+++ b/contrib/egg/egg-signal-group.c
@@ -51,7 +51,7 @@ struct _EggSignalGroup
   GObject   *target;
   GPtrArray *handlers;
   GType      target_type;
-  gint       block_count;
+  gsize      block_count;
 };
 
 struct _EggSignalGroupClass
@@ -139,124 +139,141 @@ static void
 egg_signal_group_bind (EggSignalGroup *self,
                        GObject        *target)
 {
+  gsize i;
+
   g_assert (EGG_IS_SIGNAL_GROUP (self));
   g_assert (self->target == NULL);
   g_assert (!target || G_IS_OBJECT (target));
 
-  if (target != NULL)
-    {
-      gsize i;
-
-      self->target = target;
-      g_object_weak_ref (self->target,
-                         egg_signal_group__target_weak_notify,
-                         self);
+  if (target == NULL)
+    return;
 
-      g_object_ref (target);
+  self->target = target;
+  g_object_weak_ref (self->target,
+                     egg_signal_group__target_weak_notify,
+                     self);
 
-      for (i = 0; i < self->handlers->len; i++)
-        {
-          SignalHandler *handler;
+  g_object_ref (target);
 
-          handler = g_ptr_array_index (self->handlers, i);
-          egg_signal_group_bind_handler (self, handler);
-        }
+  for (i = 0; i < self->handlers->len; i++)
+    {
+      SignalHandler *handler;
 
-      g_signal_emit (self, gSignals [BIND], 0, target);
-      g_object_unref (target);
+      handler = g_ptr_array_index (self->handlers, i);
+      egg_signal_group_bind_handler (self, handler);
     }
+
+  g_signal_emit (self, gSignals [BIND], 0, target);
+  g_object_unref (target);
 }
 
 static void
 egg_signal_group_unbind (EggSignalGroup *self)
 {
+  GObject *target;
+  gsize i;
+
   g_return_if_fail (EGG_IS_SIGNAL_GROUP (self));
 
-  if (self->target != NULL)
-    {
-      GObject *target;
-      gsize i;
+  if (self->target == NULL)
+    return;
+
+  target = self->target;
+  self->target = NULL;
 
-      target = self->target;
-      self->target = NULL;
+  g_object_weak_unref (target,
+                       egg_signal_group__target_weak_notify,
+                       self);
 
-      g_object_weak_unref (target,
-                           egg_signal_group__target_weak_notify,
-                           self);
+  for (i = 0; i < self->handlers->len; i++)
+    {
+      SignalHandler *handler;
+      gulong handler_id;
 
-      for (i = 0; i < self->handlers->len; i++)
-        {
-          SignalHandler *handler;
-          gulong handler_id;
+      handler = g_ptr_array_index (self->handlers, i);
 
-          handler = g_ptr_array_index (self->handlers, i);
+      g_assert (handler != NULL);
+      g_assert (handler->detailed_signal != NULL);
+      g_assert (handler->closure != NULL);
+      g_assert_cmpint (handler->handler_id, !=, 0);
 
-          g_assert (handler != NULL);
-          g_assert (handler->detailed_signal != NULL);
-          g_assert (handler->closure != NULL);
-          g_assert_cmpint (handler->handler_id, !=, 0);
+      handler_id = handler->handler_id;
+      handler->handler_id = 0;
 
-          handler_id = handler->handler_id;
-          handler->handler_id = 0;
+      g_signal_handler_disconnect (target, handler_id);
+    }
 
-          g_signal_handler_disconnect (target, handler_id);
-        }
+  g_signal_emit (self, gSignals [UNBIND], 0);
+}
 
-      g_signal_emit (self, gSignals [UNBIND], 0);
+static gboolean
+egg_signal_group_check_target_type (EggSignalGroup *self,
+                                    gpointer        target)
+{
+  if ((target != NULL) &&
+      !g_type_is_a (G_OBJECT_TYPE (target), self->target_type))
+    {
+      g_warning ("Attempt to set EggSignalGroup:target to something other than %s",
+                 g_type_name (self->target_type));
+      return FALSE;
     }
+
+  return TRUE;
 }
 
 void
 egg_signal_group_block (EggSignalGroup *self)
 {
+  gsize i;
+
   g_return_if_fail (EGG_IS_SIGNAL_GROUP (self));
+  g_return_if_fail (self->block_count != G_MAXSIZE);
 
   self->block_count++;
 
-  if (self->target != NULL)
-    {
-      gsize i;
+  if (self->target == NULL)
+    return;
 
-      for (i = 0; i < self->handlers->len; i++)
-        {
-          SignalHandler *handler;
+  for (i = 0; i < self->handlers->len; i++)
+    {
+      SignalHandler *handler;
 
-          handler = g_ptr_array_index (self->handlers, i);
+      handler = g_ptr_array_index (self->handlers, i);
 
-          g_assert (handler != NULL);
-          g_assert (handler->detailed_signal != NULL);
-          g_assert (handler->closure != NULL);
-          g_assert_cmpint (handler->handler_id, !=, 0);
+      g_assert (handler != NULL);
+      g_assert (handler->detailed_signal != NULL);
+      g_assert (handler->closure != NULL);
+      g_assert_cmpint (handler->handler_id, !=, 0);
 
-          g_signal_handler_block (self->target, handler->handler_id);
-        }
+      g_signal_handler_block (self->target, handler->handler_id);
     }
 }
 
 void
 egg_signal_group_unblock (EggSignalGroup *self)
 {
+  gsize i;
+
   g_return_if_fail (EGG_IS_SIGNAL_GROUP (self));
+  g_return_if_fail (self->block_count != 0);
 
   self->block_count--;
 
-  if (self->target != NULL)
-    {
-      gsize i;
+  if (self->target == NULL)
+    return;
 
-      for (i = 0; i < self->handlers->len; i++)
-        {
-          SignalHandler *handler;
+  for (i = 0; i < self->handlers->len; i++)
+    {
+      SignalHandler *handler;
 
-          handler = g_ptr_array_index (self->handlers, i);
+      handler = g_ptr_array_index (self->handlers, i);
 
-          g_assert (handler != NULL);
-          g_assert (handler->detailed_signal != NULL);
-          g_assert (handler->closure != NULL);
-          g_assert_cmpint (handler->handler_id, !=, 0);
+      g_assert (handler != NULL);
+      g_assert (handler->detailed_signal != NULL);
+      g_assert (handler->closure != NULL);
+      g_assert_cmpint (handler->handler_id, !=, 0);
 
-          g_signal_handler_unblock (self->target, handler->handler_id);
-        }
+      g_signal_handler_unblock (self->target, handler->handler_id);
     }
 }
 
@@ -268,7 +285,7 @@ egg_signal_group_unblock (EggSignalGroup *self)
  * All signals that are registered will be connected
  * or disconnected when this property changes.
  *
- * Returns: (transfer none): The #EggSignalGroup:target property.
+ * Returns: (nullable) (transfer none) (type GObject): The #EggSignalGroup:target property.
  */
 gpointer
 egg_signal_group_get_target (EggSignalGroup *self)
@@ -281,7 +298,7 @@ egg_signal_group_get_target (EggSignalGroup *self)
 /**
  * egg_signal_group_set_target:
  * @self: An #EggSignalGroup.
- * @target: (nullable) (ctype GObject*): The instance for which to connect signals.
+ * @target: (nullable) (type GObject): The instance for which to connect signals.
  *
  * Sets the target instance to connect signals to. Any signal that has been registered
  * with egg_signal_group_connect_object() or similar functions will be connected to this
@@ -295,23 +312,11 @@ egg_signal_group_set_target (EggSignalGroup *self,
                              gpointer        target)
 {
   g_return_if_fail (EGG_IS_SIGNAL_GROUP (self));
-  g_return_if_fail (!target || G_IS_OBJECT (target));
 
-  /*
-   * We cannot give meaningful warnings if EggSignalGroup:target is set before
-   * EggSignalGroup:target-type. We might be able to delay some of this until
-   * constructed, but that is more effort than it is worth right now.
-   */
-  if ((target != NULL) &&
-      (self->target_type != G_TYPE_NONE) &&
-      !g_type_is_a (G_OBJECT_TYPE (target), self->target_type))
-    {
-      g_warning ("Attempt to set EggSignalGroup:target to something other than %s",
-                 g_type_name (self->target_type));
-      return;
-    }
+  if (!egg_signal_group_check_target_type (self, target))
+    return;
 
-  if (target != self->target)
+  if (target != (gpointer)self->target)
     {
       egg_signal_group_unbind (self);
       egg_signal_group_bind (self, target);
@@ -324,14 +329,22 @@ signal_handler_free (gpointer data)
 {
   SignalHandler *handler = data;
 
-  if (handler != NULL)
-    {
-      g_clear_pointer (&handler->closure, g_closure_unref);
-      handler->handler_id = 0;
-      handler->detailed_signal = NULL;
-      handler->connect_after = FALSE;
-      g_slice_free (SignalHandler, handler);
-    }
+  g_clear_pointer (&handler->closure, g_closure_unref);
+  handler->handler_id = 0;
+  handler->detailed_signal = NULL;
+  handler->connect_after = FALSE;
+  g_slice_free (SignalHandler, handler);
+}
+
+static void
+egg_signal_group_constructed (GObject *object)
+{
+  EggSignalGroup *self = (EggSignalGroup *)object;
+
+  if (!egg_signal_group_check_target_type (self, self->target))
+    egg_signal_group_set_target (self, NULL);
+
+  G_OBJECT_CLASS (egg_signal_group_parent_class)->constructed (object);
 }
 
 static void
@@ -396,6 +409,7 @@ egg_signal_group_class_init (EggSignalGroupClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
+  object_class->constructed = egg_signal_group_constructed;
   object_class->dispose = egg_signal_group_dispose;
   object_class->get_property = egg_signal_group_get_property;
   object_class->set_property = egg_signal_group_set_property;
@@ -406,7 +420,6 @@ egg_signal_group_class_init (EggSignalGroupClass *klass)
                          _("The target instance for which to connect signals."),
                          G_TYPE_OBJECT,
                          (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (object_class, PROP_TARGET, gParamSpecs [PROP_TARGET]);
 
   gParamSpecs [PROP_TARGET_TYPE] =
     g_param_spec_gtype ("target-type",
@@ -414,7 +427,8 @@ egg_signal_group_class_init (EggSignalGroupClass *klass)
                         _("The GType of the target property."),
                         G_TYPE_OBJECT,
                         (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (object_class, PROP_TARGET_TYPE, gParamSpecs [PROP_TARGET_TYPE]);
+
+  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 
   /**
    * EggSignalGroup::bind:
@@ -430,8 +444,7 @@ egg_signal_group_class_init (EggSignalGroupClass *klass)
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST,
                   0,
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__OBJECT,
+                  NULL, NULL, NULL,
                   G_TYPE_NONE,
                   1,
                   G_TYPE_OBJECT);
@@ -449,8 +462,7 @@ egg_signal_group_class_init (EggSignalGroupClass *klass)
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST,
                   0,
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__VOID,
+                  NULL, NULL, NULL,
                   G_TYPE_NONE,
                   0);
 }
@@ -459,12 +471,14 @@ static void
 egg_signal_group_init (EggSignalGroup *self)
 {
   self->handlers = g_ptr_array_new_with_free_func (signal_handler_free);
-  self->target_type = G_TYPE_NONE;
+  self->target_type = G_TYPE_OBJECT;
 }
 
 EggSignalGroup *
 egg_signal_group_new (GType target_type)
 {
+  g_return_val_if_fail (g_type_is_a (target_type, G_TYPE_OBJECT), NULL);
+
   return g_object_new (EGG_TYPE_SIGNAL_GROUP,
                        "target-type", target_type,
                        NULL);
@@ -474,7 +488,7 @@ void
 egg_signal_group_connect_object (EggSignalGroup *self,
                                  const gchar    *detailed_signal,
                                  GCallback       callback,
-                                 gpointer        data,
+                                 gpointer        object,
                                  GConnectFlags   flags)
 {
   SignalHandler *handler;
@@ -483,11 +497,12 @@ egg_signal_group_connect_object (EggSignalGroup *self,
   g_return_if_fail (EGG_IS_SIGNAL_GROUP (self));
   g_return_if_fail (detailed_signal != NULL);
   g_return_if_fail (callback != NULL);
+  g_return_if_fail (G_IS_OBJECT (object));
 
   if ((flags & G_CONNECT_SWAPPED) != 0)
-    closure = g_cclosure_new_object_swap (callback, data);
+    closure = g_cclosure_new_object_swap (callback, object);
   else
-    closure = g_cclosure_new_object (callback, data);
+    closure = g_cclosure_new_object (callback, object);
 
   handler = g_slice_new0 (SignalHandler);
   handler->detailed_signal = g_intern_string (detailed_signal);
diff --git a/contrib/egg/egg-signal-group.h b/contrib/egg/egg-signal-group.h
index 78d2297..607b8ad 100644
--- a/contrib/egg/egg-signal-group.h
+++ b/contrib/egg/egg-signal-group.h
@@ -31,7 +31,7 @@ EggSignalGroup *egg_signal_group_new            (GType           target_type);
 void            egg_signal_group_connect_object (EggSignalGroup *self,
                                                  const gchar    *detailed_signal,
                                                  GCallback       c_handler,
-                                                 gpointer        data,
+                                                 gpointer        object,
                                                  GConnectFlags   flags);
 void            egg_signal_group_set_target     (EggSignalGroup *self,
                                                  gpointer        target);


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