[clutter] animation: Use the timeline's new-frame signal
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter] animation: Use the timeline's new-frame signal
- Date: Fri, 7 Oct 2011 15:59:57 +0000 (UTC)
commit b5109e852aed1ce96383d25892908c8ec4880561
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Fri Oct 7 16:56:21 2011 +0100
animation: Use the timeline's new-frame signal
Instead of using the ClutterAlpha's notify::alpha. This makes the code
less dependent on GObject's property notification.
clutter/clutter-animation.c | 60 ++++++++++++++++++++++++------------------
1 files changed, 34 insertions(+), 26 deletions(-)
---
diff --git a/clutter/clutter-animation.c b/clutter/clutter-animation.c
index 555a615..8124373 100644
--- a/clutter/clutter-animation.c
+++ b/clutter/clutter-animation.c
@@ -196,7 +196,7 @@ struct _ClutterAnimationPrivate
guint timeline_started_id;
guint timeline_completed_id;
- guint alpha_notify_id;
+ guint timeline_frame_id;
};
static guint animation_signals[LAST_SIGNAL] = { 0, };
@@ -318,24 +318,24 @@ clutter_animation_dispose (GObject *gobject)
if (timeline != NULL && priv->timeline_completed_id != 0)
g_signal_handler_disconnect (timeline, priv->timeline_completed_id);
+ if (timeline != NULL && priv->timeline_frame_id != 0)
+ g_signal_handler_disconnect (timeline, priv->timeline_frame_id);
+
priv->timeline_started_id = 0;
priv->timeline_completed_id = 0;
+ priv->timeline_frame_id = 0;
if (priv->alpha != NULL)
{
- if (priv->alpha_notify_id != 0)
- g_signal_handler_disconnect (priv->alpha, priv->alpha_notify_id);
-
g_object_unref (priv->alpha);
+ priv->alpha = NULL;
}
- priv->alpha_notify_id = 0;
- priv->alpha = NULL;
-
if (priv->object != NULL)
- g_object_unref (priv->object);
-
- priv->object = NULL;
+ {
+ g_object_unref (priv->object);
+ priv->object = NULL;
+ }
G_OBJECT_CLASS (clutter_animation_parent_class)->dispose (gobject);
}
@@ -1074,9 +1074,9 @@ on_timeline_completed (ClutterTimeline *timeline,
}
static void
-on_alpha_notify (GObject *gobject,
- GParamSpec *pspec,
- ClutterAnimation *animation)
+on_timeline_frame (ClutterTimeline *timeline,
+ gint elapsed,
+ ClutterAnimation *animation)
{
ClutterAnimationPrivate *priv;
GList *properties, *p;
@@ -1089,7 +1089,7 @@ on_alpha_notify (GObject *gobject,
priv = animation->priv;
- alpha_value = clutter_alpha_get_alpha (CLUTTER_ALPHA (gobject));
+ alpha_value = clutter_alpha_get_alpha (priv->alpha);
if (CLUTTER_IS_ANIMATABLE (priv->object))
{
@@ -1156,11 +1156,6 @@ clutter_animation_get_alpha_internal (ClutterAnimation *animation)
alpha = clutter_alpha_new ();
clutter_alpha_set_mode (alpha, CLUTTER_LINEAR);
- priv->alpha_notify_id =
- g_signal_connect (alpha, "notify::alpha",
- G_CALLBACK (on_alpha_notify),
- animation);
-
priv->alpha = g_object_ref_sink (alpha);
g_object_notify_by_pspec (G_OBJECT (animation), obj_props[PROP_ALPHA]);
@@ -1193,6 +1188,11 @@ clutter_animation_get_timeline_internal (ClutterAnimation *animation)
G_CALLBACK (on_timeline_completed),
animation);
+ priv->timeline_frame_id =
+ g_signal_connect (timeline, "new-frame",
+ G_CALLBACK (on_timeline_frame),
+ animation);
+
clutter_alpha_set_timeline (alpha, timeline);
/* the alpha owns the timeline now */
@@ -1489,8 +1489,12 @@ clutter_animation_set_timeline (ClutterAnimation *animation,
if (cur_timeline != NULL && priv->timeline_completed_id != 0)
g_signal_handler_disconnect (cur_timeline, priv->timeline_completed_id);
+ if (cur_timeline != NULL && priv->timeline_frame_id != 0)
+ g_signal_handler_disconnect (cur_timeline, priv->timeline_frame_id);
+
priv->timeline_started_id = 0;
priv->timeline_completed_id = 0;
+ priv->timeline_frame_id = 0;
alpha = clutter_animation_get_alpha_internal (animation);
clutter_alpha_set_timeline (alpha, timeline);
@@ -1508,6 +1512,10 @@ clutter_animation_set_timeline (ClutterAnimation *animation,
g_signal_connect (timeline, "completed",
G_CALLBACK (on_timeline_completed),
animation);
+ priv->timeline_frame_id =
+ g_signal_connect (timeline, "new-frame",
+ G_CALLBACK (on_timeline_frame),
+ animation);
}
g_object_thaw_notify (G_OBJECT (animation));
@@ -1579,10 +1587,10 @@ clutter_animation_set_alpha (ClutterAnimation *animation,
}
/* then we need to disconnect the signal handler from the old alpha */
- if (priv->alpha_notify_id != 0)
+ if (timeline != NULL && priv->timeline_frame_id != 0)
{
- g_signal_handler_disconnect (priv->alpha, priv->alpha_notify_id);
- priv->alpha_notify_id = 0;
+ g_signal_handler_disconnect (timeline, priv->timeline_frame_id);
+ priv->timeline_frame_id = 0;
}
if (priv->alpha != NULL)
@@ -1596,10 +1604,6 @@ clutter_animation_set_alpha (ClutterAnimation *animation,
goto out;
priv->alpha = g_object_ref_sink (alpha);
- priv->alpha_notify_id =
- g_signal_connect (priv->alpha, "notify::alpha",
- G_CALLBACK (on_alpha_notify),
- animation);
/* if the alpha has a timeline then we use it, otherwise we create one */
timeline = clutter_alpha_get_timeline (priv->alpha);
@@ -1613,6 +1617,10 @@ clutter_animation_set_alpha (ClutterAnimation *animation,
g_signal_connect (timeline, "completed",
G_CALLBACK (on_timeline_completed),
animation);
+ priv->timeline_frame_id =
+ g_signal_connect (timeline, "new-frame",
+ G_CALLBACK (on_timeline_frame),
+ animation);
}
else
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]