* configure.ac: Added a --with-flavour option to select between
authorNeil Roberts <neil@openedhand.com>
Tue, 15 Apr 2008 16:24:08 +0000 (16:24 +0000)
committerNeil Roberts <neil@openedhand.com>
Tue, 15 Apr 2008 16:24:08 +0000 (16:24 +0000)
x11 and win32 versions. Defaults to x11.

* clutter-gtk/gtk-clutter-embed.c: ifdef out X11 specific calls
and replace with Win32 equivalents.
(gtk_clutter_embed_key_event, gtk_clutter_embed_button_event): Set
the stage pointer when generating fake Clutter events otherwise
they just get ignored.
(gtk_clutter_embed_realize): Always request button and key events
in the window event mask. They aren't included by default on
Windows.

* README (Requirements): Added a note about the minimum Clutter
version for the Win32 backend.

ChangeLog
README
clutter-gtk/gtk-clutter-embed.c
configure.ac

index e6e2835..3de6c13 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2008-04-15  Neil Roberts  <neil@o-hand.com>
+
+       * configure.ac: Added a --with-flavour option to select between
+       x11 and win32 versions. Defaults to x11.
+
+       * clutter-gtk/gtk-clutter-embed.c: ifdef out X11 specific calls
+       and replace with Win32 equivalents.
+       (gtk_clutter_embed_key_event, gtk_clutter_embed_button_event): Set
+       the stage pointer when generating fake Clutter events otherwise
+       they just get ignored.
+       (gtk_clutter_embed_realize): Always request button and key events
+       in the window event mask. They aren't included by default on
+       Windows.
+       
+       * README (Requirements): Added a note about the minimum Clutter
+       version for the Win32 backend.
+
 2008-04-11  Emmanuele Bassi  <ebassi@openedhand.com>
 
        * clutter-gtk/gtk-clutter-embed.c:
diff --git a/README b/README
index 13c8f82..ab9df8e 100644 (file)
--- a/README
+++ b/README
@@ -9,7 +9,7 @@ ClutterStage.
 
 Requirements:
 
-  Clutter >= 0.6.0 (X11 backend)
+  Clutter >= 0.6.0 (X11 backend) or >= 0.8.0 (Win32 backend)
   GTK+ >= 2.12
 
 Copyright (C) 2006  OpenedHand
index 55d3e5b..7349871 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>
 
+#if defined(HAVE_CLUTTER_GTK_X11)
+
 #include <clutter/clutter-x11.h>
+#include <gdk/gdkx.h>
+
+#elif defined(HAVE_CLUTTER_GTK_WIN32)
+
+#include <clutter/clutter-win32.h>
+#include <gdk/gdkwin32.h>
+
+#endif /* HAVE_CLUTTER_GTK_{X11,WIN32} */
 
 #include "gtk-clutter-embed.h"
 
@@ -134,7 +143,9 @@ gtk_clutter_embed_realize (GtkWidget *widget)
   attributes.wclass = GDK_INPUT_OUTPUT;
   attributes.visual = gtk_widget_get_visual (widget);
   attributes.colormap = gtk_widget_get_colormap (widget);
-  attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
+  attributes.event_mask = gtk_widget_get_events (widget)
+    | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
+    | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK;
 
   attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
 
@@ -148,8 +159,14 @@ gtk_clutter_embed_realize (GtkWidget *widget)
   
   gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
 
+#if defined(HAVE_CLUTTER_GTK_X11)
   clutter_x11_set_stage_foreign (CLUTTER_STAGE (priv->stage), 
                                  GDK_WINDOW_XID (widget->window));
+#elif defined(HAVE_CLUTTER_GTK_WIN32)
+  clutter_win32_set_stage_foreign (CLUTTER_STAGE (priv->stage), 
+                                  GDK_WINDOW_HWND (widget->window));
+#endif /* HAVE_CLUTTER_GTK_{X11,WIN32} */
+
   clutter_redraw (CLUTTER_STAGE(priv->stage));
 
   gtk_clutter_embed_send_configure (GTK_CLUTTER_EMBED (widget));
@@ -184,6 +201,7 @@ static gboolean
 gtk_clutter_embed_button_event (GtkWidget      *widget,
                                 GdkEventButton *event)
 {
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv;
   ClutterEvent cevent = { 0, };
 
   if (event->type == GDK_BUTTON_PRESS ||
@@ -195,6 +213,7 @@ gtk_clutter_embed_button_event (GtkWidget      *widget,
   else
     return FALSE;
 
+  cevent.any.stage = CLUTTER_STAGE (priv->stage);
   cevent.button.x = event->x;
   cevent.button.y = event->y;
   cevent.button.time = event->time;
@@ -214,6 +233,7 @@ static gboolean
 gtk_clutter_embed_key_event (GtkWidget   *widget,
                              GdkEventKey *event)
 {
+  GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv;
   ClutterEvent cevent = { 0, };
 
   if (event->type == GDK_KEY_PRESS)
@@ -223,6 +243,7 @@ gtk_clutter_embed_key_event (GtkWidget   *widget,
   else
     return FALSE;
 
+  cevent.any.stage = CLUTTER_STAGE (priv->stage);
   cevent.key.time = event->time;
   cevent.key.modifier_state = event->state;
   cevent.key.keyval = event->keyval;
@@ -363,9 +384,11 @@ static void
 gtk_clutter_embed_init (GtkClutterEmbed *embed)
 {
   GtkClutterEmbedPrivate *priv;
+#ifdef HAVE_CLUTTER_GTK_X11
   const XVisualInfo *xvinfo;
   GdkVisual *visual;
   GdkColormap *colormap;
+#endif
 
   embed->priv = priv = GTK_CLUTTER_EMBED_GET_PRIVATE (embed);
 
@@ -376,12 +399,14 @@ gtk_clutter_embed_init (GtkClutterEmbed *embed)
   /* we always create new stages rather than use the default */
   /* priv->stage = clutter_stage_get_default (); */
 
+#ifdef HAVE_CLUTTER_GTK_X11
   /* We need to use the colormap from the Clutter visual */
   xvinfo = clutter_x11_get_stage_visual (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 (GTK_WIDGET (embed), colormap);
+#endif
 }
 
 /**
@@ -401,8 +426,12 @@ gtk_clutter_init (int *argc, char ***argv)
   if (!gtk_init_check (argc, argv))
     return CLUTTER_INIT_ERROR_GTK;
 
-  clutter_x11_set_display (GDK_DISPLAY ());
+#if defined(HAVE_CLUTTER_GTK_X11)
+  clutter_x11_set_display (GDK_DISPLAY());
   clutter_x11_disable_event_retrieval ();
+#elif defined(HAVE_CLUTTER_GTK_WIN32)
+  clutter_win32_disable_event_retrieval ();
+#endif /* HAVE_CLUTTER_GTK_{X11,WIN32} */
 
   return clutter_init (argc, argv);
 }
index 2623739..8a53670 100644 (file)
@@ -69,7 +69,29 @@ AC_CHECK_FUNCS([memset munmap strcasecmp strdup])
 
 CLUTTER_REQUIRED=0.7.0
 
-PKG_CHECK_MODULES(CLUTTER, clutter-x11-0.7 >= $CLUTTER_REQUIRED)
+cluttergtkflavour=x11
+AC_ARG_WITH([flavour],
+            AC_HELP_STRING([--with-flavour=@<:@x11/win32@:>@],
+                           [Select the Clutter backend]),
+            cluttergtkflavour=$with_flavour)
+
+case $cluttergtkflavour in
+
+  x11)
+    AC_DEFINE([HAVE_CLUTTER_GTK_X11], 1, [Using the X11 flavour])
+    PKG_CHECK_MODULES(CLUTTER, clutter-x11-0.7 >= $CLUTTER_REQUIRED)
+    ;;
+    
+  win32)
+    AC_DEFINE([HAVE_CLUTTER_GTK_WIN32], 1, [Using the Win32 flavour])
+    PKG_CHECK_MODULES(CLUTTER, clutter-win32-0.7 >= $CLUTTER_REQUIRED)
+    ;;
+    
+  *)
+    AC_MSG_ERROR([Invalid flavour for Clutter-GTK: use x11 or win32])
+    ;;
+esac
+
 AC_SUBST(CLUTTER_CFLAGS)
 AC_SUBST(CLUTTER_LIBS)
 
@@ -135,6 +157,7 @@ echo "                 ==================="
 echo ""
 echo "                   prefix:   ${prefix}"
 echo ""
+echo "                  Flavour:   ${cluttergtkflavour}"
 echo "              Debug level:   ${enable_debug}"
 echo "            Documentation:   ${enable_gtk_doc}"
 echo ""