[clone] Redraw when the source changes
authorOwen W. Taylor <otaylor@redhat.com>
Fri, 27 Feb 2009 19:43:47 +0000 (14:43 -0500)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Fri, 24 Apr 2009 14:30:59 +0000 (15:30 +0100)
Bug 1484 - Redraw ClutterClone when the source changes, even for
           !visible sources

Connect to ::queue-redraw on the clone source and queue a redraw.
This allows redrawing the Clone when the source changes, even in
case of a non visible source actor.

http://bugzilla.openedhand.com/show_bug.cgi?id=1484

Signed-off-by: Emmanuele Bassi <ebassi@linux.intel.com>
clutter/clutter-clone.c

index 8cb9b2b..017d7cf 100644 (file)
@@ -65,6 +65,8 @@ struct _ClutterClonePrivate
   ClutterActor *clone_source;
 };
 
+static void clutter_clone_set_source_internal (ClutterClone *clone,
+                                              ClutterActor *source);
 static void
 clutter_clone_get_preferred_width (ClutterActor *self,
                                    ClutterUnit   for_height,
@@ -231,13 +233,7 @@ clutter_clone_get_property (GObject    *gobject,
 static void
 clutter_clone_dispose (GObject *gobject)
 {
-  ClutterClonePrivate *priv = CLUTTER_CLONE (gobject)->priv;
-
-  if (priv->clone_source)
-    {
-      g_object_unref (priv->clone_source);
-      priv->clone_source = NULL;
-    }
+  clutter_clone_set_source_internal (CLUTTER_CLONE (gobject), NULL);
 
   G_OBJECT_CLASS (clutter_clone_parent_class)->dispose (gobject);
 }
@@ -302,18 +298,17 @@ clutter_clone_new (ClutterActor *source)
   return g_object_new (CLUTTER_TYPE_CLONE, "source", source,  NULL);
 }
 
-/**
- * clutter_clone_set_source:
- * @clone: a #ClutterClone
- * @source: a #ClutterActor, or %NULL
- *
- * Sets @source as the source actor to be cloned by @clone.
- *
- * Since: 1.0
- */
-void
-clutter_clone_set_source (ClutterClone *clone,
-                          ClutterActor *source)
+static void
+clone_source_queue_redraw_cb (ClutterActor *source,
+                             ClutterActor *origin,
+                             ClutterClone *clone)
+{
+  clutter_actor_queue_redraw (CLUTTER_ACTOR (clone));
+}
+
+static void
+clutter_clone_set_source_internal (ClutterClone *clone,
+                                  ClutterActor *source)
 {
   ClutterClonePrivate *priv;
 
@@ -324,12 +319,19 @@ clutter_clone_set_source (ClutterClone *clone,
 
   if (priv->clone_source)
     {
+      g_signal_handlers_disconnect_by_func (priv->clone_source,
+                                           (void *) clone_source_queue_redraw_cb,
+                                           clone);
       g_object_unref (priv->clone_source);
       priv->clone_source = NULL;
     }
 
   if (source)
-    priv->clone_source = g_object_ref (source);
+    {
+      priv->clone_source = g_object_ref (source);
+      g_signal_connect (priv->clone_source, "queue-redraw",
+                       G_CALLBACK (clone_source_queue_redraw_cb), clone);
+    }
 
   g_object_notify (G_OBJECT (clone), "source");
 
@@ -337,6 +339,26 @@ clutter_clone_set_source (ClutterClone *clone,
 }
 
 /**
+ * clutter_clone_set_source:
+ * @clone: a #ClutterClone
+ * @source: a #ClutterActor, or %NULL
+ *
+ * Sets @source as the source actor to be cloned by @clone.
+ *
+ * Since: 1.0
+ */
+void
+clutter_clone_set_source (ClutterClone *clone,
+                          ClutterActor *source)
+{
+  g_return_if_fail (CLUTTER_IS_CLONE (clone));
+  g_return_if_fail (source == NULL || CLUTTER_IS_ACTOR (source));
+
+  clutter_clone_set_source_internal (clone, source);
+  clutter_actor_queue_relayout (CLUTTER_ACTOR (clone));
+}
+
+/**
  * clutter_clone_get_source:
  * @clone: a #ClutterClone
  *