From d83119a87464ea57cfdee6d37fed2bbab7f84ec1 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jul 2012 15:24:35 +0200 Subject: [PATCH] Added explicit access to native handles. --- include/GL/glfw3native.h | 97 ++++++++++++++++++++++++++++++++++++++++ readme.html | 1 + src/CMakeLists.txt | 8 ++-- src/cocoa_native.m | 74 ++++++++++++++++++++++++++++++ src/win32_native.c | 74 ++++++++++++++++++++++++++++++ src/x11_native.c | 84 ++++++++++++++++++++++++++++++++++ 6 files changed, 335 insertions(+), 3 deletions(-) create mode 100644 include/GL/glfw3native.h create mode 100644 src/cocoa_native.m create mode 100644 src/win32_native.c create mode 100644 src/x11_native.c diff --git a/include/GL/glfw3native.h b/include/GL/glfw3native.h new file mode 100644 index 00000000..b8b01f9a --- /dev/null +++ b/include/GL/glfw3native.h @@ -0,0 +1,97 @@ +/************************************************************************* + * GLFW - An OpenGL library + * API version: 3.0 + * WWW: http://www.glfw.org/ + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2010 Camilla Berglund + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef __glfw3_platform_h__ +#define __glfw3_platform_h__ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32_WGL) + + /* We are building for Win32 and WGL */ + #include + +#elif defined(GLFW_EXPOSE_NATIVE_COCOA_NSGL) + + /* We are building for Cocoa and NSOpenGL */ + #if defined(__OBJC__) + #import + #else + typedef void* id; + #endif + +#elif defined(GLFW_EXPOSE_NATIVE_X11_GLX) + + /* We are building for X11 and GLX */ + #include + +#else + + #error "No platform specified" + +#endif + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32_WGL) + +GLFWAPI HWND glfwGetWin32Window(GLFWwindow window); +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow window); + +#elif defined(GLFW_EXPOSE_NATIVE_COCOA_NSGL) + +GLFWAPI id glfwGetCocoaWindow(GLFWwindow window); +GLFWAPI id glfwGetNSGLContext(GLFWwindow window); + +#elif defined(GLFW_EXPOSE_NATIVE_X11_GLX) + +GLFWAPI Display* glfwGetX11Display(void); + +GLFWAPI Window glfwGetX11Window(GLFWwindow window); +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow window); + +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* __glfw3_platform_h__ */ + diff --git a/readme.html b/readme.html index b854a59c..e0e7056e 100644 --- a/readme.html +++ b/readme.html @@ -287,6 +287,7 @@ version of GLFW.

  • Added windows simple multi-window test program
  • Added sharing simple OpenGL object sharing test program
  • Added modes video mode enumeration and setting test program
  • +
  • Added glfw3native.h header and platform-specific functions for explicit access to native display, window and context handles
  • Added a parameter to glfwOpenWindow for specifying a context the new window's context will share objects with
  • Added initial window title parameter to glfwOpenWindow
  • Added glfwSetGamma, glfwSetGammaRamp and glfwGetGammaRamp functions and GLFWgammaramp type for monitor gamma ramp control
  • diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index add05982..25a80e3a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,7 +11,7 @@ if (_GLFW_COCOA_NSGL) set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h) set(glfw_SOURCES ${common_SOURCES} cocoa_clipboard.m cocoa_fullscreen.m cocoa_gamma.c cocoa_init.m cocoa_input.m cocoa_joystick.m - cocoa_opengl.m cocoa_time.c cocoa_window.m) + cocoa_native.m cocoa_opengl.m cocoa_time.c cocoa_window.m) # For some reason, CMake doesn't know about .m set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) @@ -19,12 +19,14 @@ elseif (_GLFW_WIN32_WGL) set(glfw_HEADERS ${common_HEADERS} win32_platform.h) set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_fullscreen.c win32_gamma.c win32_init.c win32_input.c win32_joystick.c - win32_opengl.c win32_time.c win32_window.c win32_dllmain.c) + win32_native.c win32_opengl.c win32_time.c win32_window.c + win32_dllmain.c) elseif (_GLFW_X11_GLX) set(glfw_HEADERS ${common_HEADERS} x11_platform.h) set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c x11_gamma.c x11_init.c x11_input.c x11_joystick.c - x11_keysym2unicode.c x11_opengl.c x11_time.c x11_window.c) + x11_keysym2unicode.c x11_native.c x11_opengl.c x11_time.c + x11_window.c) endif() add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) diff --git a/src/cocoa_native.m b/src/cocoa_native.m new file mode 100644 index 00000000..2b90bc24 --- /dev/null +++ b/src/cocoa_native.m @@ -0,0 +1,74 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: Cocoa/NSOpenGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + +#define GLFW_EXPOSE_NATIVE_COCOA_NSGL +#include "../include/GL/glfw3native.h" + + +////////////////////////////////////////////////////////////////////////// +////// GLFW native API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// Returns the X11 handle of the specified window +//======================================================================== + +GLFWAPI id glfwGetCocoaWindow(GLFWwindow window) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return 0; + } + + return window->NS.object; +} + + +//======================================================================== +// Return the GLX context of the specified window +//======================================================================== + +GLFWAPI id glfwGetNSGLContext(GLFWwindow window) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return NULL; + } + + return window->NSGL.context; +} + diff --git a/src/win32_native.c b/src/win32_native.c new file mode 100644 index 00000000..80cc5730 --- /dev/null +++ b/src/win32_native.c @@ -0,0 +1,74 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: Win32/WGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + +#define GLFW_EXPOSE_NATIVE_WIN32_WGL +#include "../include/GL/glfw3native.h" + + +////////////////////////////////////////////////////////////////////////// +////// GLFW native API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// Returns the Win32 handle of the specified window +//======================================================================== + +GLFWAPI HWND glfwGetWin32Window(GLFWwindow handle) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return NULL; + } + + return window->Win32.handle; +} + + +//======================================================================== +// Return the WGL context of the specified window +//======================================================================== + +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow handle) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return NULL; + } + + return window->WGL.context; +} + diff --git a/src/x11_native.c b/src/x11_native.c new file mode 100644 index 00000000..22f30112 --- /dev/null +++ b/src/x11_native.c @@ -0,0 +1,84 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: Win32/WGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + +#define GLFW_EXPOSE_NATIVE_X11_GLX +#include "../include/GL/glfw3native.h" + + +////////////////////////////////////////////////////////////////////////// +////// GLFW native API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// Returns the X11 display +//======================================================================== + +GLFWAPI Display* glfwGetX11Display(void) +{ + return _glfwLibrary.X11.display; +} + + +//======================================================================== +// Returns the X11 handle of the specified window +//======================================================================== + +GLFWAPI Window glfwGetX11Window(GLFWwindow handle) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return 0; + } + + return window->X11.handle; +} + + +//======================================================================== +// Return the GLX context of the specified window +//======================================================================== + +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow handle) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return NULL; + } + + return window->GLX.context; +} +