2007-03-21 Matthew Allum <mallum@openedhand.com>
authorMatthew Allum <mallum@openedhand.com>
Wed, 21 Mar 2007 21:39:10 +0000 (21:39 +0000)
committerMatthew Allum <mallum@openedhand.com>
Wed, 21 Mar 2007 21:39:10 +0000 (21:39 +0000)
        * clutter-gtk/gtk-clutter.c:
        * clutter-gtk/gtk-clutter.h:
        Redo to subclass GtkSocket and use XEMBED to embed clutter stage.
        Needs at least clutter 0.2.2. Avoids previous issues with
        white textures when painting onto a GtkWindow.

        * examples/gtk-clutter-test.c: (main):
        Update.

        * configure.ac:
        * clutter-gtk.pc.in:
        Fixups to require clutter-0.2.2

ChangeLog
clutter-gtk.pc.in
clutter-gtk/gtk-clutter.c
clutter-gtk/gtk-clutter.h
configure.ac
examples/gtk-clutter-test.c

index 41f3141..6e45122 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2007-03-21  Matthew Allum  <mallum@openedhand.com>
+
+       * clutter-gtk/gtk-clutter.c:
+       * clutter-gtk/gtk-clutter.h:
+       Redo to subclass GtkSocket and use XEMBED to embed clutter stage.
+       Needs at least clutter 0.2.2. Avoids previous issues with
+       white textures when painting onto a GtkWindow.
+
+       * examples/gtk-clutter-test.c: (main):
+       Update.
+
+       * configure.ac:
+       * clutter-gtk.pc.in:
+       Fixups to require clutter-0.2.2
+
 2006-11-30  Matthew Allum  <mallum@openedhand.com>
 
        * clutter-gtk.doap:
index a62603e..7ccc2fe 100644 (file)
@@ -8,4 +8,4 @@ Description: GTK+ widget for Clutter
 Version: @VERSION@
 Libs: -L${libdir} -lclutter-gtk
 Cflags: -I${includedir}/clutter-0.1/clutter-gtk
-Requires: clutter-0.1 gtk+-2.0
+Requires: clutter-0.2 >= 0.2.2 gtk+-2.0
index 2fff3f3..dde71a9 100644 (file)
@@ -27,7 +27,7 @@
  * SECTION:gtk-clutter
  * @short_description: GTK+ widget displaying a #ClutterStage.
  *
- * #GtkClutter is a GTK+ widget, derived from #GtkDrawingArea that contains a
+ * #GtkClutter is a GTK+ widget, derived from #GtkSocket that contains a
  * #ClutterStage, allowing it to be used in a GTK+ based program like any 
  * normal GTK+ widget.
  */
@@ -38,7 +38,6 @@
 
 #include <gdk/gdkx.h>
 
-#include <gtk/gtkdrawingarea.h>
 #include <gtk/gtkwidget.h>
 
 #include <clutter/clutter-main.h>
 struct _GtkClutterPrivate
 {
   ClutterActor *stage;
+  gboolean embedded;
 };
 
-G_DEFINE_TYPE (GtkClutter, gtk_clutter, GTK_TYPE_DRAWING_AREA);
+G_DEFINE_TYPE (GtkClutter, gtk_clutter, GTK_TYPE_SOCKET);
 
 static void
 gtk_clutter_destroy (GtkObject *object)
@@ -84,6 +84,9 @@ gtk_clutter_size_allocate (GtkWidget     *widget,
 
   if (CLUTTER_ACTOR_IS_VISIBLE (priv->stage))
     clutter_actor_queue_redraw (priv->stage);
+
+  GTK_WIDGET_CLASS (gtk_clutter_parent_class)->size_allocate (widget, 
+                                                             allocation);
 }
 
 static void
@@ -99,44 +102,19 @@ gtk_clutter_size_request (GtkWidget      *widget,
 }
 
 static void
-gtk_clutter_realize (GtkWidget *widget)
+gtk_clutter_map (GtkWidget *widget)
 {
   GtkClutterPrivate *priv;
-  const XVisualInfo *xvinfo;
-  GdkVisual *visual;
-  GdkColormap *colormap;
-
-  priv = GTK_CLUTTER (widget)->priv;
-
-  /* We need to use the colormap from the Clutter visual */
-  xvinfo = clutter_stage_get_xvisual (CLUTTER_STAGE (priv->stage));
-  visual = gdk_x11_screen_lookup_visual (gdk_screen_get_default (),
-                                         xvinfo->visualid);
-  colormap = gdk_colormap_new (visual, FALSE);
-  gtk_widget_set_colormap (widget, colormap);
-
-  /* And turn off double buffering, cos GL doesn't like it */
-  gtk_widget_set_double_buffered (widget, FALSE);
-
-  GTK_WIDGET_CLASS (gtk_clutter_parent_class)->realize (widget);
-
-  gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
 
   priv = GTK_CLUTTER (widget)->priv;
 
-  clutter_stage_set_xwindow_foreign (CLUTTER_STAGE (priv->stage), 
-                                     GDK_WINDOW_XID (widget->window));
-}
-
-static gboolean
-gtk_clutter_expose_event (GtkWidget      *widget,
-                          GdkEventExpose *expose)
-{
-  GtkClutterPrivate *priv = GTK_CLUTTER (widget)->priv;
-
-  clutter_actor_queue_redraw (priv->stage);
+  if (priv->embedded == FALSE) {
+    gtk_socket_add_id (GTK_SOCKET (widget), 
+                      clutter_stage_get_xwindow (CLUTTER_STAGE(priv->stage)));
+    priv->embedded = TRUE;
+  }
 
-  return TRUE;
+  GTK_WIDGET_CLASS (gtk_clutter_parent_class)->map (widget);
 }
 
 static void
@@ -150,8 +128,7 @@ gtk_clutter_class_init (GtkClutterClass *klass)
 
   widget_class->size_request = gtk_clutter_size_request;
   widget_class->size_allocate = gtk_clutter_size_allocate;
-  widget_class->realize = gtk_clutter_realize;
-  widget_class->expose_event = gtk_clutter_expose_event;
+  widget_class->map = gtk_clutter_map;
 
   g_type_class_add_private (gobject_class, sizeof (GtkClutterPrivate));
 }
@@ -166,6 +143,7 @@ gtk_clutter_init (GtkClutter *clutter)
   gtk_widget_set_double_buffered (GTK_WIDGET (clutter), FALSE);
 
   priv->stage = clutter_stage_get_default ();
+  priv->embedded = FALSE;
 }
 
 /**
index 0cf7693..c887bba 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef __GTK_CLUTTER_H__
 #define __GTK_CLUTTER_H__
 
-#include <gtk/gtkdrawingarea.h>
+#include <gtk/gtksocket.h>
 #include <clutter/clutter-actor.h>
 
 G_BEGIN_DECLS
@@ -59,7 +59,7 @@ typedef struct _GtkClutterPrivate       GtkClutterPrivate;
 
 struct _GtkClutter 
 {
-  GtkDrawingArea parent;
+  GtkSocket parent;
 
   /*< private >*/
   GtkClutterPrivate *priv;
@@ -67,7 +67,7 @@ struct _GtkClutter
 
 struct _GtkClutterClass
 {
-  GtkDrawingAreaClass parent_class;
+  GtkSocketClass parent_class;
 
   void (*_gtk_clutter_1) (void);
   void (*_gtk_clutter_2) (void);
index 0242dbd..5462efc 100644 (file)
@@ -67,10 +67,10 @@ AC_FUNC_MALLOC
 AC_FUNC_MMAP
 AC_CHECK_FUNCS([memset munmap strcasecmp strdup])
 
-CLUTTER_REQUIRED=0.1.1
+CLUTTER_REQUIRED=0.2.2
 GTK_REQUIRED=2.10.0
 
-PKG_CHECK_MODULES(CLUTTER, clutter-0.1 >= $CLUTTER_REQUIRED)
+PKG_CHECK_MODULES(CLUTTER, clutter-0.2 >= $CLUTTER_REQUIRED)
 AC_SUBST(CLUTTER_CFLAGS)
 AC_SUBST(CLUTTER_LIBS)
 
index 863fc68..dde4b19 100644 (file)
@@ -111,7 +111,7 @@ main (int argc, char *argv[])
   ClutterTimeline *timeline;
   ClutterActor  *stage;
   ClutterColor     stage_color = { 0x61, 0x64, 0x8c, 0xff };
-  GtkWidget       *window, *clutter;
+  GtkWidget       *window, *clutter, *socket_box;
   GtkWidget       *label, *button, *vbox;
   GdkPixbuf       *pixbuf;
   SuperOH         *oh;
@@ -120,7 +120,6 @@ main (int argc, char *argv[])
   clutter_init (&argc, &argv);
   gtk_init (&argc, &argv);
 
-
   pixbuf = gdk_pixbuf_new_from_file ("redhand.png", NULL);
 
   if (!pixbuf)
@@ -134,12 +133,10 @@ main (int argc, char *argv[])
   gtk_container_add (GTK_CONTAINER (window), vbox);
 
   clutter = gtk_clutter_new ();
-  stage = gtk_clutter_get_stage (GTK_CLUTTER (clutter));
-  
+
   gtk_container_add (GTK_CONTAINER (vbox), clutter);
 
-  /* Set our stage size */
-/*   clutter_actor_set_size (stage, WINWIDTH, WINHEIGHT); */
+  stage = gtk_clutter_get_stage (GTK_CLUTTER (clutter));
 
   label = gtk_label_new ("This is a label");
   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);