[gnome-builder] egg: Various cleanups and fixes
- From: Garrett Regier <gregier src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] egg: Various cleanups and fixes
- Date: Sun, 3 May 2015 20:18:23 +0000 (UTC)
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]