From a75c02a5d688a85608b628a89bdd4949e3b53faa Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 17 Jun 2010 17:33:10 +0100 Subject: [PATCH] constraints: Allow Align and Bind sources to be NULL Since constructing AlignConstraint and BindConstraint instances could be deferred (think ClutterScript) we need to make their :source properties setters accept NULL. This does not break the constraints because they need to handle that condition in case they actor to which they are applied is destroyed and somebody is holding a reference on them anyway. --- clutter/clutter-align-constraint.c | 27 ++++++++++++++++----------- clutter/clutter-bind-constraint.c | 26 +++++++++++++++----------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/clutter/clutter-align-constraint.c b/clutter/clutter-align-constraint.c index 0350a102e..c98c697d9 100644 --- a/clutter/clutter-align-constraint.c +++ b/clutter/clutter-align-constraint.c @@ -257,7 +257,8 @@ clutter_align_constraint_init (ClutterAlignConstraint *self) /** * clutter_align_constraint_new: - * @source: the #ClutterActor to use as the source of the alignment + * @source: (allow-none): the #ClutterActor to use as the source of the + * alignment, or %NULL * @axis: the axis to be used to compute the alignment * @factor: the alignment factor, between 0.0 and 1.0 * @@ -274,7 +275,7 @@ clutter_align_constraint_new (ClutterActor *source, ClutterAlignAxis axis, gfloat factor) { - g_return_val_if_fail (CLUTTER_IS_ACTOR (source), NULL); + g_return_val_if_fail (source == NULL || CLUTTER_IS_ACTOR (source), NULL); return g_object_new (CLUTTER_TYPE_ALIGN_CONSTRAINT, "source", source, @@ -286,7 +287,7 @@ clutter_align_constraint_new (ClutterActor *source, /** * clutter_align_constraint_set_source: * @align: a #ClutterAlignConstraint - * @source: a #ClutterActor + * @source: (allow-none): a #ClutterActor, or %NULL to unset the source * * Sets the source of the alignment constraint * @@ -299,7 +300,7 @@ clutter_align_constraint_set_source (ClutterAlignConstraint *align, ClutterActor *old_source; g_return_if_fail (CLUTTER_IS_ALIGN_CONSTRAINT (align)); - g_return_if_fail (CLUTTER_IS_ACTOR (source)); + g_return_if_fail (source == NULL || CLUTTER_IS_ACTOR (source)); if (align->source == source) return; @@ -316,14 +317,18 @@ clutter_align_constraint_set_source (ClutterAlignConstraint *align, } align->source = source; - g_signal_connect (align->source, "notify", - G_CALLBACK (source_position_changed), - align); - g_signal_connect (align->source, "destroy", - G_CALLBACK (source_destroyed), - align); - update_actor_position (align); + if (align->source != NULL) + { + g_signal_connect (align->source, "notify", + G_CALLBACK (source_position_changed), + align); + g_signal_connect (align->source, "destroy", + G_CALLBACK (source_destroyed), + align); + + update_actor_position (align); + } g_object_notify (G_OBJECT (align), "source"); } diff --git a/clutter/clutter-bind-constraint.c b/clutter/clutter-bind-constraint.c index f3669b799..5a7674ec4 100644 --- a/clutter/clutter-bind-constraint.c +++ b/clutter/clutter-bind-constraint.c @@ -257,7 +257,8 @@ clutter_bind_constraint_init (ClutterBindConstraint *self) /** * clutter_bind_constraint_new: - * @source: the #ClutterActor to use as the source of the binding + * @source: (allow-none): the #ClutterActor to use as the source of + * the binding, or %NULL * @coordinate: the coordinate to bind * @offset: the offset to apply to the binding, in pixels * @@ -273,7 +274,7 @@ clutter_bind_constraint_new (ClutterActor *source, ClutterBindCoordinate coordinate, gfloat offset) { - g_return_val_if_fail (CLUTTER_IS_ACTOR (source), NULL); + g_return_val_if_fail (source == NULL || CLUTTER_IS_ACTOR (source), NULL); return g_object_new (CLUTTER_TYPE_BIND_CONSTRAINT, "source", source, @@ -285,7 +286,7 @@ clutter_bind_constraint_new (ClutterActor *source, /** * clutter_bind_constraint_set_source: * @constraint: a #ClutterBindConstraint - * @source: a #ClutterActor + * @source: (allow-none): a #ClutterActor, or %NULL to unset the source * * Sets the source #ClutterActor for the constraint * @@ -298,7 +299,7 @@ clutter_bind_constraint_set_source (ClutterBindConstraint *constraint, ClutterActor *old_source; g_return_if_fail (CLUTTER_IS_BIND_CONSTRAINT (constraint)); - g_return_if_fail (CLUTTER_IS_ACTOR (source)); + g_return_if_fail (source == NULL || CLUTTER_IS_ACTOR (source)); old_source = constraint->source; if (old_source != NULL) @@ -312,14 +313,17 @@ clutter_bind_constraint_set_source (ClutterBindConstraint *constraint, } constraint->source = source; - g_signal_connect (constraint->source, "notify", - G_CALLBACK (source_position_changed), - constraint); - g_signal_connect (constraint->source, "destroy", - G_CALLBACK (source_destroyed), - constraint); + if (constraint->source != NULL) + { + g_signal_connect (constraint->source, "notify", + G_CALLBACK (source_position_changed), + constraint); + g_signal_connect (constraint->source, "destroy", + G_CALLBACK (source_destroyed), + constraint); - update_actor_position (constraint); + update_actor_position (constraint); + } g_object_notify (G_OBJECT (constraint), "source"); }