diff options
Diffstat (limited to 'plugins/gtkui/gtkglext-gtk3/gdk/gdkglwindow.c')
-rw-r--r-- | plugins/gtkui/gtkglext-gtk3/gdk/gdkglwindow.c | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/plugins/gtkui/gtkglext-gtk3/gdk/gdkglwindow.c b/plugins/gtkui/gtkglext-gtk3/gdk/gdkglwindow.c new file mode 100644 index 00000000..ca65ee7e --- /dev/null +++ b/plugins/gtkui/gtkglext-gtk3/gdk/gdkglwindow.c @@ -0,0 +1,347 @@ +/* GdkGLExt - OpenGL Extension to GDK + * Copyright (C) 2002-2004 Naofumi Yasufuku + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include <gdk/gdk.h> + +#include "gdkglprivate.h" +#include "gdkglconfig.h" +#include "gdkglconfigimpl.h" +#include "gdkglwindow.h" +#include "gdkglwindowimpl.h" + +static GdkGLContext *_gdk_gl_window_create_gl_context (GdkGLDrawable *gldrawable, + GdkGLContext *share_list, + gboolean direct, + int render_type); +static gboolean _gdk_gl_window_is_double_buffered (GdkGLDrawable *gldrawable); +static void _gdk_gl_window_swap_buffers (GdkGLDrawable *gldrawable); +static void _gdk_gl_window_wait_gl (GdkGLDrawable *gldrawable); +static void _gdk_gl_window_wait_gdk (GdkGLDrawable *gldrawable); +static GdkGLConfig *_gdk_gl_window_get_gl_config (GdkGLDrawable *gldrawable); + +static void gdk_gl_window_gl_drawable_interface_init (GdkGLDrawableClass *iface); + +G_DEFINE_TYPE_EXTENDED (GdkGLWindow, + gdk_gl_window, + G_TYPE_OBJECT, + 0, + G_IMPLEMENT_INTERFACE ( + GDK_TYPE_GL_DRAWABLE, + gdk_gl_window_gl_drawable_interface_init)) + +static void +gdk_gl_window_init (GdkGLWindow *self) +{ + GDK_GL_NOTE_FUNC_PRIVATE (); + + self->window = NULL; +} + +static void +gdk_gl_window_finalize (GObject *object) +{ + GdkGLWindow *glwindow = GDK_GL_WINDOW (object); + + GDK_GL_NOTE_FUNC_PRIVATE (); + + if (glwindow->window != NULL) + g_object_remove_weak_pointer (G_OBJECT (glwindow->window), + (gpointer *) &(glwindow->window)); + + G_OBJECT_CLASS (gdk_gl_window_parent_class)->finalize (object); +} + +static void +gdk_gl_window_class_init (GdkGLWindowClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + GDK_GL_NOTE_FUNC_PRIVATE (); + + object_class->finalize = gdk_gl_window_finalize; +} + +static void +gdk_gl_window_gl_drawable_interface_init (GdkGLDrawableClass *iface) +{ + GDK_GL_NOTE_FUNC_PRIVATE (); + + iface->create_gl_context = _gdk_gl_window_create_gl_context; + iface->is_double_buffered = _gdk_gl_window_is_double_buffered; + iface->swap_buffers = _gdk_gl_window_swap_buffers; + iface->wait_gl = _gdk_gl_window_wait_gl; + iface->wait_gdk = _gdk_gl_window_wait_gdk; + iface->get_gl_config = _gdk_gl_window_get_gl_config; +} + +static GdkGLContext * +_gdk_gl_window_create_gl_context (GdkGLDrawable *gldrawable, + GdkGLContext *share_list, + gboolean direct, + int render_type) +{ + GdkGLWindow *glwindow; + + g_return_val_if_fail(GDK_IS_GL_WINDOW(gldrawable), NULL); + + glwindow = GDK_GL_WINDOW (gldrawable); + + return GDK_GL_WINDOW_IMPL_GET_CLASS (glwindow->impl)->create_gl_context (glwindow, + share_list, + direct, + render_type); +} + +static gboolean +_gdk_gl_window_is_double_buffered (GdkGLDrawable *gldrawable) +{ + GdkGLWindow *glwindow; + + g_return_val_if_fail(GDK_IS_GL_WINDOW(gldrawable), FALSE); + + glwindow = GDK_GL_WINDOW (gldrawable); + + return GDK_GL_WINDOW_IMPL_GET_CLASS (glwindow->impl)->is_double_buffered (glwindow); +} + +static void +_gdk_gl_window_swap_buffers (GdkGLDrawable *gldrawable) +{ + GdkGLWindow *glwindow; + + g_return_if_fail(GDK_IS_GL_WINDOW(gldrawable)); + + glwindow = GDK_GL_WINDOW (gldrawable); + + GDK_GL_WINDOW_IMPL_GET_CLASS (glwindow->impl)->swap_buffers (glwindow); +} + +static void +_gdk_gl_window_wait_gl (GdkGLDrawable *gldrawable) +{ + GdkGLWindow *glwindow; + + g_return_if_fail(GDK_IS_GL_WINDOW(gldrawable)); + + glwindow = GDK_GL_WINDOW (gldrawable); + + GDK_GL_WINDOW_IMPL_GET_CLASS (glwindow->impl)->wait_gl (glwindow); +} + +static void +_gdk_gl_window_wait_gdk (GdkGLDrawable *gldrawable) +{ + GdkGLWindow *glwindow; + + g_return_if_fail(GDK_IS_GL_WINDOW(gldrawable)); + + glwindow = GDK_GL_WINDOW (gldrawable); + + GDK_GL_WINDOW_IMPL_GET_CLASS (glwindow->impl)->wait_gdk (glwindow); +} + +static GdkGLConfig * +_gdk_gl_window_get_gl_config (GdkGLDrawable *gldrawable) +{ + GdkGLWindow *glwindow; + + g_return_val_if_fail(GDK_IS_GL_WINDOW(gldrawable), NULL); + + glwindow = GDK_GL_WINDOW (gldrawable); + + return GDK_GL_WINDOW_IMPL_GET_CLASS (glwindow->impl)->get_gl_config (glwindow); +} + +/** + * gdk_gl_window_new: + * @glconfig: a #GdkGLConfig. + * @window: the #GdkWindow to be used as the rendering area. + * @attrib_list: this must be set to NULL or empty (first attribute of None). + * + * Creates an on-screen rendering area. + * attrib_list is currently unused. This must be set to NULL or empty + * (first attribute of None). See GLX 1.3 spec. + * + * Return value: the new #GdkGLWindow. + **/ +GdkGLWindow * +gdk_gl_window_new (GdkGLConfig *glconfig, + GdkWindow *window, + const int *attrib_list) +{ + g_return_val_if_fail (GDK_IS_GL_CONFIG (glconfig), NULL); + + return GDK_GL_CONFIG_IMPL_GET_CLASS (glconfig->impl)->create_gl_window (glconfig, + window, + attrib_list); +} + +/** + * gdk_gl_window_get_window: + * @glwindow: a #GdkGLWindow. + * + * Returns the #GdkWindow associated with @glwindow. + * + * Return value: the #GdkWindow associated with @glwindow. + **/ +GdkWindow * +gdk_gl_window_get_window (GdkGLWindow *glwindow) +{ + g_return_val_if_fail (GDK_IS_GL_WINDOW (glwindow), NULL); + + return glwindow->window; +} + +/* + * OpenGL extension to GdkWindow + */ + +static const gchar quark_gl_window_string[] = "gdk-gl-window-gl-window"; +static GQuark quark_gl_window = 0; + +/** + * gdk_window_set_gl_capability: + * @window: the #GdkWindow to be used as the rendering area. + * @glconfig: a #GdkGLConfig. + * @attrib_list: this must be set to NULL or empty (first attribute of None). + * + * Set the OpenGL-capability to the @window. + * This function creates a new #GdkGLWindow held by the @window. + * attrib_list is currently unused. This must be set to NULL or empty + * (first attribute of None). + * + * Return value: the #GdkGLWindow used by the @window if it is successful, + * NULL otherwise. + **/ +GdkGLWindow * +gdk_window_set_gl_capability (GdkWindow *window, + GdkGLConfig *glconfig, + const int *attrib_list) +{ + GdkGLWindow *glwindow; + + GDK_GL_NOTE_FUNC (); + + g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); + g_return_val_if_fail (GDK_IS_GL_CONFIG (glconfig), NULL); + + if (quark_gl_window == 0) + quark_gl_window = g_quark_from_static_string (quark_gl_window_string); + + /* If already set */ + glwindow = g_object_get_qdata (G_OBJECT (window), quark_gl_window); + if (glwindow != NULL) + return glwindow; + + /* + * Create GdkGLWindow + */ + + glwindow = gdk_gl_window_new (glconfig, window, attrib_list); + if (glwindow == NULL) + { + g_warning ("cannot create GdkGLWindow\n"); + return NULL; + } + + g_object_set_qdata_full (G_OBJECT (window), quark_gl_window, glwindow, + (GDestroyNotify) g_object_unref); + + /* + * Set a background of "None" on window to avoid AIX X server crash + */ + + GDK_GL_NOTE (MISC, + g_message (" - window->bg_pixmap = %p", + (void*)gdk_window_get_background_pattern (window))); + + gdk_window_set_background_pattern (window, NULL); + + GDK_GL_NOTE (MISC, + g_message (" - window->bg_pixmap = %p", + (void*)gdk_window_get_background_pattern (window))); + + return glwindow; +} + +/** + * gdk_window_unset_gl_capability: + * @window: a #GdkWindow. + * + * Unset the OpenGL-capability of the @window. + * This function destroys the #GdkGLWindow held by the @window. + * + **/ +void +gdk_window_unset_gl_capability (GdkWindow *window) +{ + GdkGLWindow *glwindow; + + GDK_GL_NOTE_FUNC (); + + if (quark_gl_window == 0) + quark_gl_window = g_quark_from_static_string (quark_gl_window_string); + + /* + * Destroy OpenGL resources explicitly, then unref. + */ + + glwindow = g_object_get_qdata (G_OBJECT (window), quark_gl_window); + if (glwindow == NULL) + return; + + GDK_GL_WINDOW_IMPL_GET_CLASS(glwindow->impl)->destroy_gl_window_impl(glwindow); + + g_object_set_qdata (G_OBJECT (window), quark_gl_window, NULL); +} + +/** + * gdk_window_is_gl_capable: + * @window: a #GdkWindow. + * + * Returns whether the @window is OpenGL-capable. + * + * Return value: TRUE if the @window is OpenGL-capable, FALSE otherwise. + **/ +gboolean +gdk_window_is_gl_capable (GdkWindow *window) +{ + g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); + + return g_object_get_qdata (G_OBJECT (window), quark_gl_window) != NULL ? TRUE : FALSE; +} + +/** + * gdk_window_get_gl_window: + * @window: a #GdkWindow. + * + * Returns the #GdkGLWindow held by the @window. + * + * Return value: the #GdkGLWindow. + **/ +GdkGLWindow * +gdk_window_get_gl_window (GdkWindow *window) +{ + g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); + + return g_object_get_qdata (G_OBJECT (window), quark_gl_window); +} |