[gnome-builder] egg-binding-set: Use a binding helper



commit f1ee453a4e0bb67e74b3f676457c5d3ea864ae83
Author: Garrett Regier <garrettregier gmail com>
Date:   Sun May 17 17:14:50 2015 -0700

    egg-binding-set: Use a binding helper
    
    This removes the duplicated code for bind_full()
    and bind_with_closures().

 contrib/egg/egg-binding-set.c |  177 +++++++++++++++++++++--------------------
 1 files changed, 89 insertions(+), 88 deletions(-)
---
diff --git a/contrib/egg/egg-binding-set.c b/contrib/egg/egg-binding-set.c
index 1e18d61..d28a5b6 100644
--- a/contrib/egg/egg-binding-set.c
+++ b/contrib/egg/egg-binding-set.c
@@ -50,18 +50,17 @@ struct _EggBindingSet
 
 typedef struct
 {
-  EggBindingSet         *set;
-  const gchar           *source_property;
-  const gchar           *target_property;
-  GObject               *target;
-  GBinding              *binding;
-  gpointer               user_data;
-  GDestroyNotify         user_data_destroy;
-  GBindingTransformFunc  transform_to;
-  GBindingTransformFunc  transform_from;
-  GClosure              *transform_to_closure;
-  GClosure              *transform_from_closure;
-  GBindingFlags          binding_flags;
+  EggBindingSet  *set;
+  const gchar    *source_property;
+  const gchar    *target_property;
+  GObject        *target;
+  GBinding       *binding;
+  gpointer        user_data;
+  GDestroyNotify  user_data_destroy;
+  gpointer        transform_to;
+  gpointer        transform_from;
+  GBindingFlags   binding_flags;
+  guint           using_closures : 1;
 } LazyBinding;
 
 G_DEFINE_TYPE (EggBindingSet, egg_binding_set, G_TYPE_OBJECT)
@@ -139,8 +138,7 @@ egg_binding_set_connect (EggBindingSet *self,
   }
 #endif
 
-  if (lazy_binding->transform_to_closure == NULL &&
-      lazy_binding->transform_from_closure == NULL)
+  if (!lazy_binding->using_closures)
     {
       binding = g_object_bind_property_full (self->source,
                                              lazy_binding->source_property,
@@ -159,8 +157,8 @@ egg_binding_set_connect (EggBindingSet *self,
                                                       lazy_binding->target,
                                                       lazy_binding->target_property,
                                                       lazy_binding->binding_flags,
-                                                      lazy_binding->transform_to_closure,
-                                                      lazy_binding->transform_from_closure);
+                                                      lazy_binding->transform_to,
+                                                      lazy_binding->transform_from);
     }
 
   lazy_binding->binding = binding;
@@ -246,8 +244,11 @@ lazy_binding_free (gpointer data)
   if (lazy_binding->user_data_destroy)
     lazy_binding->user_data_destroy (lazy_binding->user_data);
 
-  g_clear_pointer (&lazy_binding->transform_to_closure, g_closure_unref);
-  g_clear_pointer (&lazy_binding->transform_from_closure, g_closure_unref);
+  if (lazy_binding->using_closures)
+    {
+      g_clear_pointer (&lazy_binding->transform_to, g_closure_unref);
+      g_clear_pointer (&lazy_binding->transform_from, g_closure_unref);
+    }
 
   g_slice_free (LazyBinding, lazy_binding);
 }
@@ -465,6 +466,64 @@ egg_binding_set_set_source (EggBindingSet *self,
   g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_SOURCE]);
 }
 
+void
+egg_binding_set_bind_helper (EggBindingSet  *self,
+                             const gchar    *source_property,
+                             gpointer        target,
+                             const gchar    *target_property,
+                             GBindingFlags   flags,
+                             gpointer        transform_to,
+                             gpointer        transform_from,
+                             gpointer        user_data,
+                             GDestroyNotify  user_data_destroy,
+                             gboolean        using_closures)
+{
+  LazyBinding *lazy_binding;
+
+  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 ||
+                    strcmp (source_property, target_property) != 0);
+
+  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;
+  lazy_binding->binding_flags = flags | G_BINDING_SYNC_CREATE;
+  lazy_binding->user_data = user_data;
+  lazy_binding->user_data_destroy = user_data_destroy;
+  lazy_binding->transform_to = transform_to;
+  lazy_binding->transform_from = transform_from;
+
+  if (using_closures)
+    {
+      lazy_binding->using_closures = TRUE;
+
+      if (transform_to != NULL)
+        g_closure_sink (g_closure_ref (transform_to));
+
+      if (transform_from != NULL)
+        g_closure_sink (g_closure_ref (transform_from));
+    }
+
+  g_object_weak_ref (target,
+                     egg_binding_set__target_weak_notify,
+                     self);
+
+  g_ptr_array_add (self->lazy_bindings, lazy_binding);
+
+  if (self->source != NULL)
+    egg_binding_set_connect (self, lazy_binding);
+}
+
 /**
  * egg_binding_set_bind:
  * @self: the #EggBindingSet
@@ -528,39 +587,12 @@ egg_binding_set_bind_full (EggBindingSet         *self,
                            gpointer               user_data,
                            GDestroyNotify         user_data_destroy)
 {
-  LazyBinding *lazy_binding;
-
-  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 ||
-                    strcmp (source_property, target_property) != 0);
-
-  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;
-  lazy_binding->binding_flags = flags | G_BINDING_SYNC_CREATE;
-  lazy_binding->transform_to = transform_to;
-  lazy_binding->transform_from = transform_from;
-  lazy_binding->user_data = user_data;
-  lazy_binding->user_data_destroy = user_data_destroy;
-
-  g_object_weak_ref (target,
-                     egg_binding_set__target_weak_notify,
-                     self);
-
-  g_ptr_array_add (self->lazy_bindings, lazy_binding);
-
-  if (self->source != NULL)
-    egg_binding_set_connect (self, lazy_binding);
+  egg_binding_set_bind_helper (self, source_property,
+                               target, target_property,
+                               flags,
+                               transform_to, transform_from,
+                               user_data, user_data_destroy,
+                               FALSE);
 }
 
 /**
@@ -597,41 +629,10 @@ egg_binding_set_bind_with_closures (EggBindingSet *self,
                                     GClosure      *transform_to,
                                     GClosure      *transform_from)
 {
-  LazyBinding *lazy_binding;
-
-  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 ||
-                    strcmp (source_property, target_property) != 0);
-
-  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;
-  lazy_binding->binding_flags = flags | G_BINDING_SYNC_CREATE;
-  lazy_binding->transform_to_closure = transform_to;
-  lazy_binding->transform_from_closure = transform_from;
-
-  if (transform_to != NULL)
-    g_closure_sink (g_closure_ref (transform_to));
-
-  if (transform_from != NULL)
-    g_closure_sink (g_closure_ref (transform_from));
-
-  g_object_weak_ref (target,
-                     egg_binding_set__target_weak_notify,
-                     self);
-
-  g_ptr_array_add (self->lazy_bindings, lazy_binding);
-
-  if (self->source != NULL)
-    egg_binding_set_connect (self, lazy_binding);
+  egg_binding_set_bind_helper (self, source_property,
+                               target, target_property,
+                               flags,
+                               transform_to, transform_from,
+                               NULL, NULL,
+                               TRUE);
 }


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