2007-11-18 Emmanuele Bassi <ebassi@openedhand.com>
authorEmmanuele Bassi <ebassi@openedhand.com>
Sun, 18 Nov 2007 15:36:04 +0000 (15:36 +0000)
committerEmmanuele Bassi <ebassi@openedhand.com>
Sun, 18 Nov 2007 15:36:04 +0000 (15:36 +0000)
* clutter.symbols: Update exported symbols.

* clutter/clutter-actor.[ch]: Remove clutter_actor_rotate_*
and clutter_actor_get_rx* and provide a simpler rotation API:
clutter_actor_set_rotation() and clutter_actor_get_rotation().

* clutter/clutter-deprecated.h: Deprecate the old rotation API.

* clutter/clutter-behaviour-bspline.c:
* clutter/clutter-behaviour-rotate.c:
* clutter/clutter-effect.c: Update internal usage of the
rotation API.

* tests/test-project.c: Ditto as above.

ChangeLog
clutter.symbols
clutter/clutter-actor.c
clutter/clutter-actor.h
clutter/clutter-behaviour-bspline.c
clutter/clutter-behaviour-rotate.c
clutter/clutter-deprecated.h
clutter/clutter-effect.c
tests/test-project.c

index ddf76ca..04b6e99 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2007-11-18  Emmanuele Bassi  <ebassi@openedhand.com>
+
+       * clutter.symbols: Update exported symbols.
+
+       * clutter/clutter-actor.[ch]: Remove clutter_actor_rotate_*
+       and clutter_actor_get_rx* and provide a simpler rotation API:
+       clutter_actor_set_rotation() and clutter_actor_get_rotation().
+
+       * clutter/clutter-deprecated.h: Deprecate the old rotation API.
+
+       * clutter/clutter-behaviour-bspline.c:
+       * clutter/clutter-behaviour-rotate.c:
+       * clutter/clutter-effect.c: Update internal usage of the
+       rotation API.
+
+       * tests/test-project.c: Ditto as above.
+
 2007-11-17  Emmanuele Bassi  <ebassi@openedhand.com>
 
        Optimise Atoms usage in the X11 and X11-based backends.
index 3302958..b832ebb 100644 (file)
@@ -26,18 +26,10 @@ clutter_actor_get_x
 clutter_actor_set_x
 clutter_actor_get_y
 clutter_actor_set_y
-clutter_actor_rotate_x
-clutter_actor_rotate_y
-clutter_actor_rotate_z
-clutter_actor_rotate_xx
-clutter_actor_rotate_yx
-clutter_actor_rotate_zx
-clutter_actor_get_rxang
-clutter_actor_get_ryang
-clutter_actor_get_rzang
-clutter_actor_get_rxangx
-clutter_actor_get_ryangx
-clutter_actor_get_rzangx
+clutter_actor_set_rotation
+clutter_actor_set_rotationx
+clutter_actor_get_rotation
+clutter_actor_get_rotationx
 clutter_actor_set_opacity
 clutter_actor_get_opacity
 clutter_actor_set_name
@@ -221,7 +213,6 @@ clutter_container_remove_actor
 clutter_container_remove_valist
 clutter_container_get_children
 clutter_container_foreach
-clutter_container_find_child_by_id 
 clutter_container_find_child_by_name
 clutter_container_raise_child
 clutter_container_lower_child
index ed14911..d4be787 100644 (file)
@@ -2534,261 +2534,184 @@ clutter_actor_get_depth (ClutterActor *self)
 }
 
 /**
- * clutter_actor_rotate_z:
- * @self: A #ClutterActor
- * @angle: Angle of rotation
- * @x:     X co-ord to rotate actor around ( relative to actor position )
- * @y:     Y co-ord to rotate actor around ( relative to actor position )
+ * clutter_actor_set_rotationx:
+ * @self: a #ClutterActor
+ * @angle: the angle of rotation
+ * @axis: the axis of rotation
+ * @x: X coordinate of the rotation center
+ * @y: Y coordinate of the rotation center
+ * @z: Z coordinate of the rotation center
  *
- * Rotates actor around the Z axis.
- */
-void
-clutter_actor_rotate_z (ClutterActor *self,
-                       gfloat        angle,
-                       gint          x,
-                       gint          y)
-{
-  g_return_if_fail (CLUTTER_IS_ACTOR (self));
-
-  self->priv->rzang = CLUTTER_FLOAT_TO_FIXED (angle);
-  self->priv->rzx   = x;
-  self->priv->rzy   = y;
-
-  if (CLUTTER_ACTOR_IS_VISIBLE (self))
-    clutter_actor_queue_redraw (self);
-}
-
-/**
- * clutter_actor_rotate_x:
- * @self:  A #ClutterActor
- * @angle: Angle of rotation
- * @y:     Y co-ord to rotate actor around ( relative to actor position )
- * @z:     Z co-ord to rotate actor around ( relative to actor position )
+ * Sets the rotation angle of @self around the given axis.
  *
- * Rotates actor around the X axis.
- */
-void
-clutter_actor_rotate_x (ClutterActor *self,
-                       gfloat        angle,
-                       gint          y,
-                       gint          z)
-{
-  g_return_if_fail (CLUTTER_IS_ACTOR (self));
-
-  self->priv->rxang = CLUTTER_FLOAT_TO_FIXED(angle);
-  self->priv->rxy   = y;
-  self->priv->rxz   = z;
-
-  if (CLUTTER_ACTOR_IS_VISIBLE (self))
-    clutter_actor_queue_redraw (self);
-}
-
-/**
- * clutter_actor_rotate_y:
- * @self:  A #ClutterActor
- * @angle: Angle of rotation
- * @x:     X co-ord to rotate actor around ( relative to actor position )
- * @z:     Z co-ord to rotate actor around ( relative to actor position )
+ * This function is the fixed point variant of clutter_actor_set_rotation().
  *
- * Rotates actor around the X axis.
- */
-void
-clutter_actor_rotate_y (ClutterActor *self,
-                       gfloat        angle,
-                       gint          x,
-                       gint          z)
-{
-  g_return_if_fail (CLUTTER_IS_ACTOR (self));
-
-  self->priv->ryang = CLUTTER_FLOAT_TO_FIXED(angle);
-
-  self->priv->ryx   = x;
-  self->priv->ryz   = z;
-
-  if (CLUTTER_ACTOR_IS_VISIBLE (self))
-    clutter_actor_queue_redraw (self);
-}
-
-/**
- * clutter_actor_rotate_zx:
- * @self: A #ClutterActor
- * @angle: Angle of rotation
- * @x:     X co-ord to rotate actor around ( relative to actor position )
- * @y:     Y co-ord to rotate actor around ( relative to actor position )
- *
- * Rotates actor around the Z axis.
+ * Since: 0.6
  */
 void
-clutter_actor_rotate_zx (ClutterActor *self,
-                        ClutterFixed  angle,
-                        gint          x,
-                        gint          y)
+clutter_actor_set_rotationx (ClutterActor      *self,
+                             ClutterFixed       angle,
+                             ClutterRotateAxis  axis,
+                             gint               x,
+                             gint               y,
+                             gint               z)
 {
-  g_return_if_fail (CLUTTER_IS_ACTOR (self));
-
-  self->priv->rzang = angle;
-  self->priv->rzx   = x;
-  self->priv->rzy   = y;
-
-  if (CLUTTER_ACTOR_IS_VISIBLE (self))
-    clutter_actor_queue_redraw (self);
-}
+  ClutterActorPrivate *priv;
 
-/**
- * clutter_actor_rotate_xx:
- * @self:  A #ClutterActor
- * @angle: Angle of rotation
- * @y:     Y co-ord to rotate actor around ( relative to actor position )
- * @z:     Z co-ord to rotate actor around ( relative to actor position )
- *
- * Rotates actor around the X axis.
- */
-void
-clutter_actor_rotate_xx (ClutterActor *self,
-                        ClutterFixed  angle,
-                        gint          y,
-                        gint          z)
-{
   g_return_if_fail (CLUTTER_IS_ACTOR (self));
 
-  self->priv->rxang = angle;
-  self->priv->rxy   = y;
-  self->priv->rxz   = z;
+  priv = self->priv;
 
-  if (CLUTTER_ACTOR_IS_VISIBLE (self))
-    clutter_actor_queue_redraw (self);
-}
+  switch (axis)
+    {
+    case CLUTTER_X_AXIS:
+      priv->rxang = angle;
+      priv->rxy = y;
+      priv->rxz = z;
+      break;
 
-/**
- * clutter_actor_rotate_yx:
- * @self:  A #ClutterActor
- * @angle: Angle of rotation
- * @x:     X co-ord to rotate actor around ( relative to actor position )
- * @z:     Z co-ord to rotate actor around ( relative to actor position )
- *
- * Rotates actor around the X axis.
- */
-void
-clutter_actor_rotate_yx (ClutterActor *self,
-                        ClutterFixed  angle,
-                        gint          x,
-                        gint          z)
-{
-  g_return_if_fail (CLUTTER_IS_ACTOR (self));
+    case CLUTTER_Y_AXIS:
+      priv->ryang = angle;
+      priv->ryx = x;
+      priv->ryz = z;
+      break;
 
-  self->priv->ryang = angle;
-  self->priv->ryx   = x;
-  self->priv->ryz   = z;
+    case CLUTTER_Z_AXIS:
+      priv->rzang = angle;
+      priv->rzx = x;
+      priv->rzy = y;
+      break;
+    }
 
   if (CLUTTER_ACTOR_IS_VISIBLE (self))
     clutter_actor_queue_redraw (self);
 }
 
 /**
- * clutter_actor_get_rxangx:
- * @self: A #ClutterActor
+ * clutter_actor_set_rotation:
+ * @self: a #ClutterActor
+ * @angle: the angle of rotation
+ * @axis: the axis of rotation
+ * @x: X coordinate of the rotation center
+ * @y: Y coordinate of the rotation center
+ * @z: Z coordinate of the rotation center
  *
- * Gets the angle of rotation around the X axis.
+ * Sets the rotation angle of @self around the given axis.
  *
- * Returns: the angle or rotation, as a fixed point value
+ * The rotation center coordinates depend on the value of @axis:
+ * <itemizedlist>
+ *   <listitem><para>%CLUTTER_X_AXIS requires @y and @z</para></listitem>
+ *   <listitem><para>%CLUTTER_Y_AXIS requires @x and @z</para></listitem>
+ *   <listitem><para>%CLUTTER_Z_AXIS requires @x and @y</para></listitem>
+ * </itemizedlist>
  *
- * Since: 0.4
+ * Since: 0.6
  */
-ClutterFixed
-clutter_actor_get_rxangx (ClutterActor *self)
+void
+clutter_actor_set_rotation (ClutterActor      *self,
+                            gdouble            angle,
+                            ClutterRotateAxis  axis,
+                            gint               x,
+                            gint               y,
+                            gint               z)
 {
-  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0);
+  g_return_if_fail (CLUTTER_IS_ACTOR (self));
 
-  return self->priv->rxang;
+  clutter_actor_set_rotationx (self, CLUTTER_FLOAT_TO_FIXED (angle),
+                               axis,
+                               x, y, z);
 }
 
 /**
- * clutter_actor_get_rxang:
+ * clutter_actor_get_rotationx:
  * @self: a #ClutterActor
+ * @axis: the axis of rotation
+ * @x: return value for the X coordinate of the center of rotation
+ * @y: return value for the Y coordinate of the center of rotation
+ * @z: return value for the Z coordinate of the center of rotation
  *
- * Gets the angle of rotation around the X axis.
- *
- * Return value: the angle of rotation
- *
- * Since: 0.4
- */
-gdouble
-clutter_actor_get_rxang (ClutterActor *self)
-{
-  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.);
-
-  return CLUTTER_FIXED_TO_FLOAT (self->priv->rxang);
-}
-
-/**
- * clutter_actor_get_ryangx:
- * @self: A #ClutterActor
+ * Retrieves the angle and center of rotation on the given axis,
+ * set using clutter_actor_set_rotation().
  *
- * Gets the angle of rotation around the Y axis.
+ * This function is the fixed point variant of clutter_actor_get_rotation().
  *
- * Return value: the angle of rotation, as a fixed point value
+ * Return value: the angle of rotation as a fixed point value.
  *
- * Since: 0.4
+ * Since: 0.6
  */
 ClutterFixed
-clutter_actor_get_ryangx (ClutterActor *self)
+clutter_actor_get_rotationx (ClutterActor      *self,
+                             ClutterRotateAxis  axis,
+                             gint              *x,
+                             gint              *y,
+                             gint              *z)
 {
+  ClutterActorPrivate *priv;
+  ClutterFixed retval = 0;
+
   g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0);
 
-  return self->priv->ryang;
-}
+  priv = self->priv;
 
-/**
- * clutter_actor_get_ryang:
- * @self: a #ClutterActor
- *
- * Gets the angle of rotation around the Y axis.
- *
- * Return value: the angle of rotation
- *
- * Since: 0.4
- */
-gdouble
-clutter_actor_get_ryang (ClutterActor *self)
-{
-  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.);
+  switch (axis)
+    {
+    case CLUTTER_X_AXIS:
+      retval = priv->rxang;
+      if (y)
+        *y = priv->rxy;
+      if (z)
+        *z = priv->rxz;
+      break;
 
-  return CLUTTER_FIXED_TO_FLOAT (self->priv->ryang);
-}
+    case CLUTTER_Y_AXIS:
+      retval = priv->ryang;
+      if (x)
+        *x = priv->ryx;
+      if (z)
+        *z = priv->ryz;
+      break;
 
-/**
- * clutter_actor_get_rzangx:
- * @self: A #ClutterActor
- *
- * Gets the angle of rotation around x axis in degrees.
- *
- * Return value: the angle of rotation, as a fixed point value
- *
- * Since: 0.4
- */
-ClutterFixed
-clutter_actor_get_rzangx (ClutterActor *self)
-{
-  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0);
-  return self->priv->rzang;
+    case CLUTTER_Z_AXIS:
+      retval = priv->rzang;
+      if (x)
+        *x = priv->rzx;
+      if (y)
+        *y = priv->rzy;
+      break;
+    }
+
+  return retval;
 }
 
 /**
- * clutter_actor_get_rzang:
+ * clutter_actor_get_rotation:
  * @self: a #ClutterActor
+ * @axis: the axis of rotation
+ * @x: return value for the X coordinate of the center of rotation
+ * @y: return value for the Y coordinate of the center of rotation
+ * @z: return value for the Z coordinate of the center of rotation
  *
- * Gets the angle of rotation around the Z axis.
+ * Retrieves the angle and center of rotation on the given axis,
+ * set using clutter_actor_set_angle().
  *
- * Return value: the angle of rotation
+ * The coordinates of the center depend on the axis used.
  *
- * Since: 0.4
+ * Return value: the angle of rotation.
+ *
+ * Since: 0.6
  */
 gdouble
-clutter_actor_get_rzang (ClutterActor *self)
+clutter_actor_get_rotation (ClutterActor      *self,
+                            ClutterRotateAxis  axis,
+                            gint              *x,
+                            gint              *y,
+                            gint              *z)
 {
-  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.);
+  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 0.0);
 
-  return CLUTTER_FIXED_TO_FLOAT (self->priv->rzang);
+  return CLUTTER_FIXED_TO_FLOAT (clutter_actor_get_rotationx (self,
+                                                              axis,
+                                                              x, y, z));
 }
 
 /**
index 9fd477d..067f082 100644 (file)
@@ -273,6 +273,27 @@ void                  clutter_actor_set_x            (ClutterActor          *sel
 void                  clutter_actor_set_y            (ClutterActor          *self,
                                                       gint                   y);
 
+void                  clutter_actor_set_rotation     (ClutterActor          *self,
+                                                      gdouble                angle,
+                                                      ClutterRotateAxis      axis,
+                                                      gint                   x,
+                                                      gint                   y,
+                                                      gint                   z);void                  clutter_actor_set_rotationx    (ClutterActor          *self,
+                                                      ClutterFixed           fixed,
+                                                      ClutterRotateAxis      axis,
+                                                      gint                   x,
+                                                      gint                   y,
+                                                      gint                   z);
+gdouble               clutter_actor_get_rotation     (ClutterActor          *self,
+                                                      ClutterRotateAxis      axis,
+                                                      gint                  *x,
+                                                      gint                  *y,
+                                                      gint                  *z);
+ClutterFixed          clutter_actor_get_rotationx    (ClutterActor          *self,
+                                                      ClutterRotateAxis      axis,
+                                                      gint                  *x,
+                                                      gint                  *y,
+                                                      gint                  *z);
 void                  clutter_actor_rotate_x         (ClutterActor          *self,
                                                      gfloat                 angle,
                                                      gint                   y,
index 5299052..ebb4849 100644 (file)
@@ -35,7 +35,7 @@
  * control points given when creating a new #ClutterBehaviourBspline instance.
  *
  * Additional bezier curves can be added to the end of the bspline using
- * clutter_behaviour_bspline_append() family of functions, control points can
+ * clutter_behaviour_bspline_append_* family of functions, control points can
  * be moved using clutter_behaviour_bspline_adjust(). The bspline can be split
  * into two with clutter_behaviour_bspline_split(), and bsplines can be
  * concatenated using clutter_behaviour_bspline_join().
@@ -725,7 +725,7 @@ clutter_scriptable_iface_init (ClutterScriptableIface *iface)
  *
  * Bspline is defined by 3n + 1 points, n >=1; any trailing points passed
  * into this function are stored internally and used during any subsequent
- * clutter_behaviour_bspline_append() operations.
+ * clutter_behaviour_bspline_append_* operations.
  *
  * Return value: a #ClutterBehaviour
  *
@@ -860,7 +860,7 @@ clutter_behaviour_bspline_append_knots_valist (ClutterBehaviourBspline *bs,
 }
 
 /**
- * clutter_behaviour_bspline_append_knots
+ * clutter_behaviour_bspline_append_knots:
  * @bs: a #ClutterBehaviourBspline
  * @first_knot: first #ClutterKnot
  * @VarArgs: a NULL-terminated array of #ClutterKnot control points.
index 816aa28..e460a28 100644 (file)
@@ -88,33 +88,18 @@ alpha_notify_foreach (ClutterBehaviour *behaviour,
                      ClutterActor     *actor,
                      gpointer          data)
 {
-  ClutterFixed                   angle;
-  ClutterBehaviourRotate        *rotate_behaviour;
+  ClutterFixed angle = GPOINTER_TO_UINT (data);
+  ClutterBehaviourRotate *rotate_behaviour;
   ClutterBehaviourRotatePrivate *priv;
 
   rotate_behaviour = CLUTTER_BEHAVIOUR_ROTATE (behaviour);
   priv = rotate_behaviour->priv;
 
-  angle = GPOINTER_TO_UINT(data);
-
-  switch (priv->axis)
-    {
-    case CLUTTER_X_AXIS:
-      clutter_actor_rotate_xx (actor,
-                              angle,
-                              priv->center_y, priv->center_z);
-      break;
-    case CLUTTER_Y_AXIS:
-      clutter_actor_rotate_yx (actor,
-                              angle,
-                              priv->center_x, priv->center_z);
-      break;
-    case CLUTTER_Z_AXIS:
-      clutter_actor_rotate_zx (actor,
-                              angle,
-                              priv->center_x, priv->center_y);
-      break;
-    }
+  clutter_actor_set_rotationx (actor, angle,
+                               priv->axis,
+                               priv->center_x,
+                               priv->center_y,
+                               priv->center_z);
 }
 
 static void
index f199b5f..9d339ff 100644 (file)
@@ -8,7 +8,7 @@
  *
  * Functions that are simply renamed should give errors containing
  * _REPLACED_BY_ whilst functions that are deprecated by new functions with
- * new functionality should giver errors containing _DEPRECATED_BY_.
+ * new functionality should giver errors containing _DEPRECATED_BY_.
  */
 
 #define clutter_behaviour_ellipse_set_angle_begin    clutter_behaviour_ellipse_set_angle_begin_REPLACED_BY_clutter_behaviour_set_angle_start
 #define clutter_behaviour_ellipse_get_angle_begin    clutter_behaviour_ellipse_get_angle_begin_REPLACED_BY_clutter_behaviour_get_angle_start
 #define clutter_behaviour_ellipse_get_angle_beginx   clutter_behaviour_ellipse_get_angle_beginx_REPLACED_BY_clutter_behaviour_get_angle_startx
 #define clutter_behaviour_bspline_append             clutter_behaviour_bspline_append_REPLACED_BY_clutter_behaviour_bspline_append_knots
+
 #define clutter_actor_get_id                         clutter_actor_get_id_REPLACED_BY_clutter_actor_get_gid
 
+#define clutter_actor_rotate_x                       clutter_actor_rotate_x_DEPRECATED_BY_clutter_actor_set_rotation
+#define clutter_actor_rotate_y                       clutter_actor_rotate_y_DEPRECATED_BY_clutter_actor_set_rotation
+#define clutter_actor_rotate_z                       clutter_actor_rotate_z_DEPRECATED_BY_clutter_actor_set_rotation
+#define clutter_actor_rotate_xx                      clutter_actor_rotate_xx_DEPRECATED_BY_clutter_actor_set_rotationx
+#define clutter_actor_rotate_yx                      clutter_actor_rotate_yx_DEPRECATED_BY_clutter_actor_set_rotationx
+#define clutter_actor_rotate_zx                      clutter_actor_rotate_zx_DEPRECATED_BY_clutter_actor_set_rotationx
+#define clutter_actor_get_rxang                      clutter_actor_get_rxang_DEPRECATED_BY_clutter_actor_get_rotation
+#define clutter_actor_get_ryang                      clutter_actor_get_ryang_DEPRECATED_BY_clutter_actor_get_rotation
+#define clutter_actor_get_rzang                      clutter_actor_get_rzang_DEPRECATED_BY_clutter_actor_get_rotation
+#define clutter_actor_get_rxangx                     clutter_actor_get_rxangx_DEPRECATED_BY_clutter_actor_get_rotationx
+#define clutter_actor_get_ryangx                     clutter_actor_get_ryangx_DEPRECATED_BY_clutter_actor_get_rotationx
+#define clutter_actor_get_rzangx                     clutter_actor_get_rzangx_DEPRECATED_BY_clutter_actor_get_rotationx
+
 #endif /* CLUTTER_DEPRECATED_H */
index 8a2d5b6..4d04863 100644 (file)
@@ -743,7 +743,9 @@ clutter_effect_rotate_x (ClutterEffectTemplate     *template_,
   c->completed_data = completed_data;
 
 
-  clutter_actor_rotate_x (actor, angle_start, center_y, center_y);
+  clutter_actor_set_rotation (actor, angle_start,
+                              CLUTTER_X_AXIS,
+                              0, center_y, center_z);
 
   c->behave = clutter_behaviour_rotate_new (c->alpha,
                                            CLUTTER_X_AXIS,
@@ -803,7 +805,9 @@ clutter_effect_rotate_y (ClutterEffectTemplate     *template_,
   c->completed_data = completed_data;
 
 
-  clutter_actor_rotate_y (actor, angle_start, center_x, center_z);
+  clutter_actor_set_rotation (actor, angle_start,
+                              CLUTTER_Y_AXIS,
+                              center_x, 0, center_z);
 
   c->behave = clutter_behaviour_rotate_new (c->alpha,
                                            CLUTTER_Y_AXIS,
@@ -863,7 +867,9 @@ clutter_effect_rotate_z (ClutterEffectTemplate     *template_,
   c->completed_data = completed_data;
 
 
-  clutter_actor_rotate_z (actor, angle_start, center_x, center_y);
+  clutter_actor_set_rotation (actor, angle_start,
+                              CLUTTER_Z_AXIS,
+                              center_x, center_y, 0);
 
   c->behave = clutter_behaviour_rotate_new (c->alpha,
                                            CLUTTER_Z_AXIS,
index 35d10b9..37e53c2 100644 (file)
@@ -216,7 +216,7 @@ main (int argc, char *argv[])
   rect = clutter_rectangle_new_with_color (&white);
   clutter_actor_set_size (rect, 320, 240);
   clutter_actor_set_position (rect, 180, 120);
-  clutter_actor_rotate_y (rect, 60, 0, 0);
+  clutter_actor_set_rotation (rect, 60, CLUTTER_Y_AXIS, 0, 0, 0);
   clutter_group_add (CLUTTER_GROUP (main_stage), rect);
 
   label = clutter_label_new_with_text ("Mono 8pt", "Drag the blue rectangles");