From 2d5b5aa82aacab7cc523e5877afbb864592b7651 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 10 Jun 2015 12:02:13 +0100 Subject: [PATCH] gdk: Add function to retrieve the GdkVisual Straight from Cogl. This allows us to propagate the GdkVisual Cogl and Clutter use to embedding toolkits, like GTK+. The function is annotated as being added to the 1.22 development cycle because it will be backported to the stable branch, so that downstream developers can package up a version of Clutter that does not crash on nVidia. https://bugzilla.gnome.org/show_bug.cgi?id=747489 --- clutter/gdk/clutter-backend-gdk.c | 48 ++++++++++++++++++++++++++++++ clutter/gdk/clutter-gdk.h | 3 ++ doc/reference/clutter-sections.txt | 1 + 3 files changed, 52 insertions(+) diff --git a/clutter/gdk/clutter-backend-gdk.c b/clutter/gdk/clutter-backend-gdk.c index 47bd67164..01ba8cbf3 100644 --- a/clutter/gdk/clutter-backend-gdk.c +++ b/clutter/gdk/clutter-backend-gdk.c @@ -498,3 +498,51 @@ clutter_gdk_disable_event_retrieval (void) disable_event_retrieval = TRUE; } + +/** + * clutter_gdk_get_visual: + * + * Retrieves the #GdkVisual used by Clutter. + * + * This function should be used when embedding Clutter inside GDK-based + * foreign toolkits, to ensure that the visual applied to the #GdkWindow + * used to render the #ClutterStage is the correct one. + * + * Returns: (transfer none): a #GdkVisual instance + * + * Since: 1.22 + */ +GdkVisual * +clutter_gdk_get_visual (void) +{ + ClutterBackend *backend = clutter_get_default_backend (); + GdkScreen *screen; + + if (backend == NULL) + { + g_critical ("The Clutter backend has not been initialised"); + return NULL; + } + + if (!CLUTTER_IS_BACKEND_GDK (backend)) + { + g_critical ("The Clutter backend is not a GDK backend"); + return NULL; + } + + screen = CLUTTER_BACKEND_GDK (backend)->screen; + g_assert (screen != NULL); + +#if defined(GDK_WINDOWING_X11) && defined(COGL_HAS_XLIB_SUPPORT) + { + XVisualInfo *xvisinfo = cogl_clutter_winsys_xlib_get_visual_info (); + if (xvisinfo != NULL) + return gdk_x11_screen_lookup_visual (screen, xvisinfo->visualid); + } +#endif + + if (gdk_screen_get_rgba_visual (screen) != NULL) + return gdk_screen_get_rgba_visual (screen); + + return gdk_screen_get_system_visual (screen); +} diff --git a/clutter/gdk/clutter-gdk.h b/clutter/gdk/clutter-gdk.h index a009378c5..c5b979bc1 100644 --- a/clutter/gdk/clutter-gdk.h +++ b/clutter/gdk/clutter-gdk.h @@ -61,6 +61,9 @@ ClutterStage * clutter_gdk_get_stage_from_window (GdkWindow *window); CLUTTER_AVAILABLE_IN_1_10 void clutter_gdk_disable_event_retrieval (void); +CLUTTER_AVAILABLE_IN_1_22 +GdkVisual * clutter_gdk_get_visual (void); + G_END_DECLS #endif /* __CLUTTER_GDK_H__ */ diff --git a/doc/reference/clutter-sections.txt b/doc/reference/clutter-sections.txt index 1591b06e4..56389db31 100644 --- a/doc/reference/clutter-sections.txt +++ b/doc/reference/clutter-sections.txt @@ -1519,6 +1519,7 @@ clutter_gdk_handle_event clutter_gdk_set_display clutter_gdk_get_default_display clutter_gdk_set_stage_foreign +clutter_gdk_get_visual