diff options
author | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-10-03 15:19:08 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-10-03 15:19:08 +0100 |
commit | 1b2bbe3110d31fa8e96603fb0fd92ac9c2f28ff5 (patch) | |
tree | 3011eedc2b51a7e68aa8ce9169631a788fbb527b | |
parent | 3883c54b195df571e84ff2f5b694480cc17af151 (diff) | |
download | clutter-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.c | 40 | ||||
-rw-r--r-- | 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 ())); |