From 97dcfe5bf14de873425b6759954e74096ea3eefb Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 29 Mar 2012 12:01:03 +0100 Subject: [PATCH] actor: Ensure that we correctly remove transitions The check on :remove-on-complete was inverted, but we also need to check that the current repeat of the timeline is also the last. --- clutter/clutter-actor.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index 084d03333..a79549af1 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -17025,7 +17025,7 @@ on_transition_completed (ClutterTransition *transition, info = _clutter_actor_get_animation_info (actor); /* this will take care of cleaning clos for us */ - if (clutter_transition_get_remove_on_complete (transition)) + if (!clutter_transition_get_remove_on_complete (transition)) { /* we take a reference here because removing the closure * will release the reference on the transition, and we @@ -17036,6 +17036,25 @@ on_transition_completed (ClutterTransition *transition, g_object_ref (transition); g_hash_table_remove (info->transitions, clos->name); } + else + { + ClutterTimeline *timeline = CLUTTER_TIMELINE (transition); + gint n_repeats, cur_repeat; + + /* ensure that we remove the transition only at the end + * of its run; we emit ::completed for every repeat + */ + + n_repeats = clutter_timeline_get_repeat_count (timeline); + cur_repeat = clutter_timeline_get_current_repeat (timeline); + + if (cur_repeat == n_repeats) + { + /* see the comment above on why this ref() is necessary */ + g_object_ref (transition); + g_hash_table_remove (info->transitions, clos->name); + } + } /* if it's the last transition then we clean up */ if (g_hash_table_size (info->transitions) == 0)