2008-04-11 Emmanuele Bassi <ebassi@openedhand.com>
[clutter-gtk] / clutter-gtk / gtk-clutter-embed.c
index 91066ae..55d3e5b 100644 (file)
 
 #include <glib-object.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 <gdk/gdk.h>
-#include <gdk/gdkx.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))
 
@@ -250,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);
@@ -299,8 +387,8 @@ gtk_clutter_embed_init (GtkClutterEmbed *embed)
 /**
  * gtk_clutter_init:
  *
- * This function should be called instead of #clutter_init() and after
- * #gtk_init()
+ * This function should be called instead of clutter_init() and
+ * gtk_init().
  *
  * Return value: %CLUTTER_INIT_SUCCESS on success, a negative integer
  *   on failure.
@@ -310,10 +398,11 @@ gtk_clutter_embed_init (GtkClutterEmbed *embed)
 ClutterInitError
 gtk_clutter_init (int *argc, char ***argv)
 {
-  clutter_x11_set_display (GDK_DISPLAY());
-  clutter_x11_disable_event_retrieval ();
+  if (!gtk_init_check (argc, argv))
+    return CLUTTER_INIT_ERROR_GTK;
 
-  /* FIXME: call gtk_init() here? */
+  clutter_x11_set_display (GDK_DISPLAY ());
+  clutter_x11_disable_event_retrieval ();
 
   return clutter_init (argc, argv);
 }