[clutter-gtk/multi-backend] Make embedding work identically on GDK and X11 backends



commit 1b2bbe3110d31fa8e96603fb0fd92ac9c2f28ff5
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Mon Oct 3 15:19:08 2011 +0100

    Make embedding work identically on GDK and X11 backends
    
    Clutter-GTK now works in the same way whether Clutter is running with
    the X11 or the GDK backend, including multi-device support.

 clutter-gtk/gtk-clutter-embed.c |   40 ++++++++++++++++++++++++++++++--------
 clutter-gtk/gtk-clutter-util.c  |    6 +++++
 2 files changed, 37 insertions(+), 9 deletions(-)
---
diff --git a/clutter-gtk/gtk-clutter-embed.c b/clutter-gtk/gtk-clutter-embed.c
index 7917f37..106e73e 100644
--- a/clutter-gtk/gtk-clutter-embed.c
+++ b/clutter-gtk/gtk-clutter-embed.c
@@ -201,13 +201,6 @@ gtk_clutter_filter_func (GdkXEvent *native_event,
     }
   else
 #endif
-#if defined(CLUTTER_WINDOWING_GDK)
-  if (clutter_check_backend (CLUTTER_GDK_BACKEND))
-    {
-      clutter_gdk_handle_event (event);
-    }
-  else
-#endif
 #if defined(CLUTTER_WINDOWING_WIN32)
   if (clutter_check_backend (CLUTTER_WIN32_BACKEND))
     {
@@ -303,8 +296,6 @@ gtk_clutter_embed_realize (GtkWidget *widget)
   style_context = gtk_widget_get_style_context (widget);
   gtk_style_context_set_background (style_context, window);
 
-  gdk_window_add_filter (NULL, gtk_clutter_filter_func, widget);
-
 #if defined(CLUTTER_WINDOWING_GDK)
   if (clutter_check_backend (CLUTTER_GDK_BACKEND))
     {
@@ -316,7 +307,15 @@ gtk_clutter_embed_realize (GtkWidget *widget)
   if (clutter_check_backend (CLUTTER_X11_BACKEND) &&
       GDK_IS_X11_WINDOW (window))
     {
+      static gboolean has_filter = FALSE;
+
       clutter_x11_set_stage_foreign (CLUTTER_STAGE (priv->stage), GDK_WINDOW_XID (window));
+
+      if (G_UNLIKELY (!has_filter))
+        {
+          gdk_window_add_filter (NULL, gtk_clutter_filter_func, widget);
+          has_filter = TRUE;
+        }
     }
   else
 #endif
@@ -324,7 +323,15 @@ gtk_clutter_embed_realize (GtkWidget *widget)
   if (clutter_check_backend (CLUTTER_WIN32_BACKEND) &&
       GDK_IS_WIN32_WINDOW (window))
     {
+      static gboolean has_filter = FALSE;
+
       clutter_win32_set_stage_foreign (CLUTTER_STAGE (priv->stage), GDK_WINDOW_HWND (window));
+
+      if (G_UNLIKELY (!has_filter))
+        {
+          gdk_window_add_filter (NULL, gtk_clutter_filter_func, widget);
+          has_filter = TRUE;
+        }
     }
 #endif
 
@@ -390,6 +397,8 @@ gtk_clutter_embed_map_event (GtkWidget	 *widget,
 
   clutter_actor_map (priv->stage);
 
+  clutter_actor_queue_redraw (priv->stage);
+
   return res;
 }
 
@@ -641,6 +650,18 @@ gtk_clutter_embed_child_type (GtkContainer *container)
   return GTK_CLUTTER_TYPE_OFFSCREEN;
 }
 
+static gboolean
+gtk_clutter_embed_event (GtkWidget *widget,
+                         GdkEvent  *event)
+{
+#if defined(CLUTTER_WINDOWING_GDK)
+  if (clutter_check_backend (CLUTTER_GDK_BACKEND))
+    clutter_gdk_handle_event (event);
+#endif
+
+  return FALSE;
+}
+
 static void
 gtk_clutter_embed_class_init (GtkClutterEmbedClass *klass)
 {
@@ -665,6 +686,7 @@ gtk_clutter_embed_class_init (GtkClutterEmbedClass *klass)
   widget_class->focus_out_event = gtk_clutter_embed_focus_out;
   widget_class->key_press_event = gtk_clutter_embed_key_event;
   widget_class->key_release_event = gtk_clutter_embed_key_event;
+  widget_class->event = gtk_clutter_embed_event;
 
   container_class->add = gtk_clutter_embed_add;
   container_class->remove = gtk_clutter_embed_remove;
diff --git a/clutter-gtk/gtk-clutter-util.c b/clutter-gtk/gtk-clutter-util.c
index 45dca71..042bd00 100644
--- a/clutter-gtk/gtk-clutter-util.c
+++ b/clutter-gtk/gtk-clutter-util.c
@@ -70,6 +70,10 @@ post_parse_hook (GOptionContext  *context,
 #if defined(GDK_WINDOWING_X11) && defined(CLUTTER_WINDOWING_X11)
   if (clutter_check_backend (CLUTTER_X11_BACKEND))
     {
+      clutter_x11_enable_xinput ();
+
+      clutter_x11_set_use_argb_visual (TRUE);
+
       /* share the X11 Display with GTK+ */
       clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
 
@@ -176,6 +180,8 @@ gtk_clutter_init (int    *argc,
 #endif
 
 #if defined(GDK_WINDOWING_X11) && defined(CLUTTER_WINDOWING_X11)
+  clutter_x11_enable_xinput ();
+
   clutter_x11_set_use_argb_visual (TRUE);
 
   clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]