summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@linux.intel.com>2011-10-03 15:19:08 +0100
committerEmmanuele Bassi <ebassi@linux.intel.com>2011-10-03 15:19:08 +0100
commit1b2bbe3110d31fa8e96603fb0fd92ac9c2f28ff5 (patch)
tree3011eedc2b51a7e68aa8ce9169631a788fbb527b
parent3883c54b195df571e84ff2f5b694480cc17af151 (diff)
downloadclutter-gtk-multi-backend.tar.gz
Make embedding work identically on GDK and X11 backendsmulti-backend
Clutter-GTK now works in the same way whether Clutter is running with the X11 or the GDK backend, including multi-device support.
-rw-r--r--clutter-gtk/gtk-clutter-embed.c40
-rw-r--r--clutter-gtk/gtk-clutter-util.c6
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 ()));