[animation] Do not unref on ::complete by default

Bug 1535 - Complete animation always unrefs ClutterAnimation (even
           after g_object_ref_sink)

Animations created through clutter_animation_new() should not
automagically unref themselves by default on ::complete. We
only want that behaviour for Animations created by the
clutter_actor_animate* family of functions, since those provide
the automagic memory management.
This commit is contained in:
Emmanuele Bassi 2009-04-03 12:39:35 +01:00
parent bd8d3f6bd8
commit df738d0a8c

View File

@ -109,6 +109,7 @@ clutter_animation_finalize (GObject *gobject)
{
ClutterAnimationPrivate *priv = CLUTTER_ANIMATION (gobject)->priv;
CLUTTER_NOTE (ANIMATION, "Destroying properties hash table");
g_hash_table_destroy (priv->properties);
G_OBJECT_CLASS (clutter_animation_parent_class)->finalize (gobject);
@ -237,19 +238,6 @@ clutter_animation_get_property (GObject *gobject,
}
}
static void
clutter_animation_real_completed (ClutterAnimation *animation)
{
CLUTTER_NOTE (ANIMATION, "Animation [%p] complete: unreffing",
animation);
/* the signal emission takes a reference on the animation, which
* means that even if we unref it here, it'll be valid for the
* whole duration of the emission chain
*/
g_object_unref (animation);
}
static void
clutter_animation_class_init (ClutterAnimationClass *klass)
{
@ -261,8 +249,6 @@ clutter_animation_class_init (ClutterAnimationClass *klass)
g_type_class_add_private (klass, sizeof (ClutterAnimationPrivate));
klass->completed = clutter_animation_real_completed;
gobject_class->set_property = clutter_animation_set_property;
gobject_class->get_property = clutter_animation_get_property;
gobject_class->dispose = clutter_animation_dispose;
@ -1232,9 +1218,14 @@ clutter_animation_get_alpha (ClutterAnimation *animation)
* clutter_animation_completed:
* @animation: a #ClutterAnimation
*
* Emits the ::completed signal on @animation. After this function
* terminates @animation will be unreferenced and it will not be
* valid anymore, unless g_object_ref() was called before
* Emits the ::completed signal on @animation
*
* When using this function with a #ClutterAnimation created
* by the clutter_actor_animate() family of functions, @animation
* will be unreferenced and it will not be valid anymore,
* unless g_object_ref() was called before calling this function
* or unless a reference was taken inside a handler for the
* #ClutterAnimation::completed signal
*
* Since: 1.0
*/
@ -1246,6 +1237,15 @@ clutter_animation_completed (ClutterAnimation *animation)
g_signal_emit (animation, animation_signals[COMPLETED], 0);
}
static void
on_animation_completed (ClutterAnimation *animation)
{
CLUTTER_NOTE (ANIMATION, "Animation[%p] completed, unreferencing",
animation);
g_object_unref (animation);
}
/*
* starts the timeline
*/
@ -1401,6 +1401,10 @@ clutter_animation_setupv (ClutterAnimation *animation,
&values[i],
pspec);
}
g_signal_connect (animation, "completed",
G_CALLBACK (on_animation_completed),
NULL);
}
static void
@ -1459,6 +1463,10 @@ clutter_animation_setup_valist (ClutterAnimation *animation,
property_name = va_arg (var_args, gchar*);
}
g_signal_connect (animation, "completed",
G_CALLBACK (on_animation_completed),
NULL);
}
/**
@ -1637,9 +1645,9 @@ clutter_actor_animate_with_timeline (ClutterActor *actor,
* to control the animation or to know when the animation has been
* completed.
*
* If a name argument starts with "signal::" the two following arguments are
* used as callback function and userdata for a signal handler installed on the
* #ClutterAnimation object, for instance:
* If a name argument starts with "signal::" the two following arguments
* are used as callback function and userdata for a signal handler installed
* on the #ClutterAnimation object, for instance:
*
* |[
*
@ -1656,7 +1664,6 @@ clutter_actor_animate_with_timeline (ClutterActor *actor,
* NULL);
* ]|
*
*
* Calling this function on an actor that is already being animated
* will cause the current animation to change with the new final values,
* the new easing mode and the new duration - that is, this code: