[clutter-gst] actor: fix player new-frame signal connection when set through property



commit 0779203ee47d827e03ac0f3dd15b836363b34f43
Author: Lionel Landwerlin <llandwerlin gmail com>
Date:   Thu Mar 14 15:58:05 2013 +0000

    actor: fix player new-frame signal connection when set through property

 clutter-gst/clutter-gst-actor.c |   88 ++++++++++++++++++++------------------
 1 files changed, 46 insertions(+), 42 deletions(-)
---
diff --git a/clutter-gst/clutter-gst-actor.c b/clutter-gst/clutter-gst-actor.c
index cc8385d..0c01459 100644
--- a/clutter-gst/clutter-gst-actor.c
+++ b/clutter-gst/clutter-gst-actor.c
@@ -104,6 +104,49 @@ clutter_gst_actor_paint (ClutterActor *actor)
     }
 }
 
+static void
+_player_new_frame (ClutterGstPlayer *player,
+                   ClutterGstFrame  *frame,
+                   ClutterGstActor  *self)
+{
+  ClutterGstActorPrivate *priv = self->priv;
+
+  if (priv->frame)
+    g_boxed_free (CLUTTER_GST_TYPE_FRAME, priv->frame);
+  priv->frame = g_boxed_copy (CLUTTER_GST_TYPE_FRAME, frame);
+
+  clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
+}
+
+static void
+clutter_gst_actor_set_player_internal (ClutterGstActor  *self,
+                                       ClutterGstPlayer *player)
+{
+  ClutterGstActorPrivate *priv = self->priv;
+
+  if (priv->player) {
+    g_boxed_free (CLUTTER_GST_TYPE_FRAME, priv->frame);
+    priv->frame = NULL;
+    g_signal_handlers_disconnect_by_func (priv->player,
+                                          _player_new_frame,
+                                          self);
+
+    g_clear_object (&priv->player);
+  }
+
+  if (player != NULL) {
+    priv->player = g_object_ref_sink (player);
+    priv->frame = g_boxed_copy (CLUTTER_GST_TYPE_FRAME,
+                                clutter_gst_player_get_frame (player));
+
+    g_signal_connect (priv->player, "new-frame",
+                      G_CALLBACK (_player_new_frame), self);
+  }
+
+  clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
+  g_object_notify (G_OBJECT (self), "player");
+}
+
 /*
  * GObject implementation
  */
@@ -150,13 +193,12 @@ clutter_gst_actor_set_property (GObject      *object,
                                 GParamSpec   *pspec)
 {
   ClutterGstActor *actor = CLUTTER_GST_ACTOR (object);
-  ClutterGstActorPrivate *priv = actor->priv;
 
   switch (property_id)
     {
     case PROP_PLAYER:
-      g_clear_object (&priv->player);
-      priv->player = g_value_dup_object (value);
+      clutter_gst_actor_set_player_internal (actor,
+                                             CLUTTER_GST_PLAYER (g_value_get_object (value)));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -205,20 +247,6 @@ clutter_gst_actor_init (ClutterGstActor *actor)
                                              ClutterGstActorPrivate);
 }
 
-static void
-_player_new_frame (ClutterGstPlayer *player,
-                   ClutterGstFrame  *frame,
-                   ClutterGstActor  *self)
-{
-  ClutterGstActorPrivate *priv = self->priv;
-
-  if (priv->frame)
-    g_boxed_free (CLUTTER_GST_TYPE_FRAME, priv->frame);
-  priv->frame = g_boxed_copy (CLUTTER_GST_TYPE_FRAME, frame);
-
-  clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
-}
-
 /*
  * Public symbols
  */
@@ -259,32 +287,8 @@ void
 clutter_gst_actor_set_player (ClutterGstActor  *self,
                               ClutterGstPlayer *player)
 {
-  ClutterGstActorPrivate *priv;
-
   g_return_if_fail (CLUTTER_GST_IS_ACTOR (self));
   g_return_if_fail (CLUTTER_GST_IS_PLAYER (player) || player == NULL);
 
-  priv = self->priv;
-
-  if (priv->player) {
-    g_boxed_free (CLUTTER_GST_TYPE_FRAME, priv->frame);
-    priv->frame = NULL;
-    g_signal_handlers_disconnect_by_func (priv->player,
-                                          _player_new_frame,
-                                          self);
-
-    g_clear_object (&priv->player);
-  }
-
-  if (player != NULL) {
-    priv->player = g_object_ref_sink (player);
-    priv->frame = g_boxed_copy (CLUTTER_GST_TYPE_FRAME,
-                                clutter_gst_player_get_frame (player));
-
-    g_signal_connect (priv->player, "new-frame",
-                      G_CALLBACK (_player_new_frame), self);
-  }
-
-  clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
-  g_object_notify (G_OBJECT (self), "player");
+  clutter_gst_actor_set_player_internal (self, player);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]