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.
#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))
}
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);
#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++)
{
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 };
}
/* 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),