From 9048a4ab9403cb18ec9c1273c440f2a4fff06ed7 Mon Sep 17 00:00:00 2001 From: Matthew Allum Date: Wed, 21 Mar 2007 21:39:10 +0000 Subject: [PATCH] 2007-03-21 Matthew Allum * 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 | 15 +++++++++++++ clutter-gtk.pc.in | 2 +- clutter-gtk/gtk-clutter.c | 52 +++++++++++++------------------------------ clutter-gtk/gtk-clutter.h | 6 ++--- configure.ac | 4 ++-- examples/gtk-clutter-test.c | 9 +++----- 6 files changed, 39 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index 41f3141..6e45122 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2007-03-21 Matthew Allum + + * 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 * clutter-gtk.doap: diff --git a/clutter-gtk.pc.in b/clutter-gtk.pc.in index a62603e..7ccc2fe 100644 --- a/clutter-gtk.pc.in +++ b/clutter-gtk.pc.in @@ -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 diff --git a/clutter-gtk/gtk-clutter.c b/clutter-gtk/gtk-clutter.c index 2fff3f3..dde71a9 100644 --- a/clutter-gtk/gtk-clutter.c +++ b/clutter-gtk/gtk-clutter.c @@ -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 -#include #include #include @@ -52,9 +51,10 @@ 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; } /** diff --git a/clutter-gtk/gtk-clutter.h b/clutter-gtk/gtk-clutter.h index 0cf7693..c887bba 100644 --- a/clutter-gtk/gtk-clutter.h +++ b/clutter-gtk/gtk-clutter.h @@ -26,7 +26,7 @@ #ifndef __GTK_CLUTTER_H__ #define __GTK_CLUTTER_H__ -#include +#include #include 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); diff --git a/configure.ac b/configure.ac index 0242dbd..5462efc 100644 --- a/configure.ac +++ b/configure.ac @@ -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) diff --git a/examples/gtk-clutter-test.c b/examples/gtk-clutter-test.c index 863fc68..dde4b19 100644 --- a/examples/gtk-clutter-test.c +++ b/examples/gtk-clutter-test.c @@ -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); -- 1.7.9.5