2008-04-11 Emmanuele Bassi <ebassi@openedhand.com>
authorEmmanuele Bassi <ebassi@openedhand.com>
Fri, 11 Apr 2008 15:41:44 +0000 (15:41 +0000)
committerEmmanuele Bassi <ebassi@openedhand.com>
Fri, 11 Apr 2008 15:41:44 +0000 (15:41 +0000)
* clutter-gtk/gtk-clutter-embed.c:
(clutter_container_iface_init): Make GtkClutterEmbed implement
ClutterContainer, and proxy all virtual functions to the
embedded Stage.

* examples/gtk-clutter-test.c: (main): Add the group straight
to the GtkClutterEmbed widget to test the Container interface
implementation.

ChangeLog
clutter-gtk/gtk-clutter-embed.c
examples/gtk-clutter-test.c

index f745b24..e6e2835 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,17 @@
 2008-04-11  Emmanuele Bassi  <ebassi@openedhand.com>
 
        * clutter-gtk/gtk-clutter-embed.c:
+       (clutter_container_iface_init): Make GtkClutterEmbed implement
+       ClutterContainer, and proxy all virtual functions to the
+       embedded Stage.
+
+       * examples/gtk-clutter-test.c: (main): Add the group straight
+       to the GtkClutterEmbed widget to test the Container interface
+       implementation.
+
+2008-04-11  Emmanuele Bassi  <ebassi@openedhand.com>
+
+       * clutter-gtk/gtk-clutter-embed.c:
        (gtk_clutter_init): Call gtk_init_check(); this is safe, because
        multiple calls to gtk_init() are safe.
 
index ef2e08b..55d3e5b 100644 (file)
 
 #include <glib-object.h>
 
-#include <clutter/clutter-main.h>
-#include <clutter/clutter-stage.h>
-
 #include <gdk/gdk.h>
 #include <gdk/gdkx.h>
 #include <gtk/gtkmain.h>
+
+#include <clutter/clutter-main.h>
+#include <clutter/clutter-stage.h>
+#include <clutter/clutter-container.h>
+
 #include <clutter/clutter-x11.h>
 
 #include "gtk-clutter-embed.h"
 
-G_DEFINE_TYPE (GtkClutterEmbed, gtk_clutter_embed, GTK_TYPE_WIDGET);
+static void clutter_container_iface_init (ClutterContainerIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GtkClutterEmbed,
+                         gtk_clutter_embed,
+                         GTK_TYPE_WIDGET,
+                         G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER,
+                                                clutter_container_iface_init));
 
 #define GTK_CLUTTER_EMBED_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_CLUTTER_EMBED, GtkClutterEmbedPrivate))
 
@@ -251,6 +259,85 @@ gtk_clutter_embed_map_event (GtkWidget          *widget,
 }
 
 static void
+gtk_clutter_embed_add (ClutterContainer *container,
+                       ClutterActor     *actor)
+{
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (container)->priv;
+  ClutterContainer *stage = CLUTTER_CONTAINER (priv->stage);
+
+  clutter_container_add_actor (stage, actor);
+  g_signal_emit_by_name (container, "actor-added", actor);
+}
+
+static void
+gtk_clutter_embed_remove (ClutterContainer *container,
+                          ClutterActor     *actor)
+{
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (container)->priv;
+  ClutterContainer *stage = CLUTTER_CONTAINER (priv->stage);
+
+  g_object_ref (actor);
+
+  clutter_container_remove_actor (stage, actor);
+  g_signal_emit_by_name (container, "actor-removed", actor);
+
+  g_object_unref (actor);
+}
+
+static void
+gtk_clutter_embed_foreach (ClutterContainer *container,
+                           ClutterCallback   callback,
+                           gpointer          callback_data)
+{
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (container)->priv;
+  ClutterContainer *stage = CLUTTER_CONTAINER (priv->stage);
+
+  clutter_container_foreach (stage, callback, callback_data);
+}
+
+static void
+gtk_clutter_embed_raise (ClutterContainer *container,
+                         ClutterActor     *child,
+                         ClutterActor     *sibling)
+{
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (container)->priv;
+  ClutterContainer *stage = CLUTTER_CONTAINER (priv->stage);
+
+  clutter_container_raise_child (stage, child, sibling);
+}
+
+static void
+gtk_clutter_embed_lower (ClutterContainer *container,
+                         ClutterActor     *child,
+                         ClutterActor     *sibling)
+{
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (container)->priv;
+  ClutterContainer *stage = CLUTTER_CONTAINER (priv->stage);
+
+  clutter_container_lower_child (stage, child, sibling);
+}
+
+static void
+gtk_clutter_embed_sort_depth_order (ClutterContainer *container)
+{
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (container)->priv;
+  ClutterContainer *stage = CLUTTER_CONTAINER (priv->stage);
+
+  clutter_container_sort_depth_order (stage);
+}
+
+static void
+clutter_container_iface_init (ClutterContainerIface *iface)
+{
+  iface->add = gtk_clutter_embed_add;
+  iface->remove = gtk_clutter_embed_remove;
+  iface->foreach = gtk_clutter_embed_foreach;
+  iface->raise = gtk_clutter_embed_raise;
+  iface->lower = gtk_clutter_embed_lower;
+  iface->sort_depth_order = gtk_clutter_embed_sort_depth_order;
+}
+
+static void
 gtk_clutter_embed_class_init (GtkClutterEmbedClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
index 7df3fb5..59e606c 100644 (file)
@@ -165,7 +165,7 @@ main (int argc, char *argv[])
 #endif
 
   /* create a new group to hold multiple actors in a group */
-  oh->group = CLUTTER_GROUP (clutter_group_new());
+  oh->group = CLUTTER_GROUP (clutter_group_new ());
   
   for (i = 0; i < NHANDS; i++)
     {
@@ -175,7 +175,7 @@ main (int argc, char *argv[])
       if (i == 0)
        oh->hand[i] = clutter_texture_new_from_pixbuf (pixbuf);
      else
-       oh->hand[i] = clutter_clone_texture_new (CLUTTER_TEXTURE(oh->hand[0]));
+       oh->hand[i] = clutter_clone_texture_new (CLUTTER_TEXTURE (oh->hand[0]));
 #else
       ClutterColor colour = { 255, 0, 0, 255 };
 
@@ -196,7 +196,8 @@ main (int argc, char *argv[])
     }
 
   /* Add the group to the stage */
-  clutter_group_add (CLUTTER_GROUP (stage), CLUTTER_ACTOR(oh->group));
+  clutter_container_add_actor (CLUTTER_CONTAINER (clutter),
+                               CLUTTER_ACTOR (oh->group));
 
   g_signal_connect (stage, "button-press-event",
                    G_CALLBACK (input_cb),