summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2015-06-10 12:02:13 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2015-06-10 19:13:00 +0100
commitab63b30a9b1812b0e53bcddcd55f00fd507347dc (patch)
tree855779199de86588c3401962f9c6a60c6499e6d1
parent44fc1c87489bb7bbe1d28eb0f551794db333e1fb (diff)
downloadclutter-ab63b30a9b1812b0e53bcddcd55f00fd507347dc.tar.gz
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 (cherry picked from commit 2d5b5aa82aacab7cc523e5877afbb864592b7651) Signed-off-by: Emmanuele Bassi <ebassi@gnome.org>
-rw-r--r--clutter/gdk/clutter-backend-gdk.c48
-rw-r--r--clutter/gdk/clutter-gdk.h3
-rw-r--r--doc/reference/clutter/clutter-sections.txt1
3 files changed, 52 insertions, 0 deletions
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/clutter-sections.txt b/doc/reference/clutter/clutter-sections.txt
index 327f185b0..d521dc166 100644
--- a/doc/reference/clutter/clutter-sections.txt
+++ b/doc/reference/clutter/clutter-sections.txt
@@ -1516,6 +1516,7 @@ clutter_gdk_handle_event
clutter_gdk_set_display
clutter_gdk_get_default_display
clutter_gdk_set_stage_foreign
+clutter_gdk_get_visual
</SECTION>
<SECTION>