summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2014-08-11 21:24:29 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2014-08-12 10:39:29 +0100
commit6b0fc7c4d822a090adc0adcb560d87a8d6c7d6be (patch)
tree9464aab69c8b0761d04ee87c573f4a2f88061688
parent6d71c440e99698f40d35af83edd43cf66192ce77 (diff)
downloadgtk+-6b0fc7c4d822a090adc0adcb560d87a8d6c7d6be.tar.gz
gl: Add a back pointer from the window to the context
This way we can check if a GdkWindow has a GdkGLContext associated to it.
-rw-r--r--gdk/gdkglcontext.c30
-rw-r--r--gdk/gdkinternals.h5
2 files changed, 33 insertions, 2 deletions
diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c
index f5e543c6a4..528bd26779 100644
--- a/gdk/gdkglcontext.c
+++ b/gdk/gdkglcontext.c
@@ -38,6 +38,7 @@
#include "gdkdisplayprivate.h"
#include "gdkglpixelformat.h"
#include "gdkvisual.h"
+#include "gdkinternals.h"
#include "gdkintl.h"
@@ -393,15 +394,21 @@ gdk_gl_context_set_window (GdkGLContext *context,
GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
g_return_if_fail (GDK_IS_GL_CONTEXT (context));
- g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
+ g_return_if_fail (window == NULL || (GDK_IS_WINDOW (window) && !GDK_WINDOW_DESTROYED (window)));
if (priv->window == window)
return;
+ if (priv->window != NULL)
+ gdk_window_set_gl_context (priv->window, NULL);
+
g_clear_object (&priv->window);
if (window != NULL)
- priv->window = g_object_ref (window);
+ {
+ priv->window = g_object_ref (window);
+ gdk_window_set_gl_context (window, context);
+ }
GDK_GL_CONTEXT_GET_CLASS (context)->set_window (context, window);
}
@@ -490,3 +497,22 @@ gdk_gl_context_get_swap_interval (GdkGLContext *context)
return priv->swap_interval;
}
+
+gboolean
+gdk_window_has_gl_context (GdkWindow *window)
+{
+ return g_object_get_data (G_OBJECT (window), "-gdk-gl-context") != NULL;
+}
+
+void
+gdk_window_set_gl_context (GdkWindow *window,
+ GdkGLContext *context)
+{
+ g_object_set_data (G_OBJECT (window), "-gdk-gl-context", context);
+}
+
+GdkGLContext *
+gdk_window_get_gl_context (GdkWindow *window)
+{
+ return g_object_get_data (G_OBJECT (window), "-gdk-gl-context");
+}
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index 791fa87b22..9dfd9b544c 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -407,6 +407,11 @@ void _gdk_synthesize_crossing_events_for_geometry_change (GdkWindow *changed_win
gboolean _gdk_window_has_impl (GdkWindow *window);
GdkWindow * _gdk_window_get_impl_window (GdkWindow *window);
+gboolean gdk_window_has_gl_context (GdkWindow *window);
+void gdk_window_set_gl_context (GdkWindow *window,
+ GdkGLContext *context);
+GdkGLContext * gdk_window_get_gl_context (GdkWindow *window);
+
/*****************************
* offscreen window routines *
*****************************/