diff --git a/CMakeLists.txt b/CMakeLists.txt index aa2f01f0..06acbef0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,19 +15,6 @@ include(CheckSymbolExists) find_package(OpenGL REQUIRED) -set(common_SOURCES - ${GLFW_SOURCE_DIR}/src/enable.c - ${GLFW_SOURCE_DIR}/src/error.c - ${GLFW_SOURCE_DIR}/src/fullscreen.c - ${GLFW_SOURCE_DIR}/src/gamma.c - ${GLFW_SOURCE_DIR}/src/init.c - ${GLFW_SOURCE_DIR}/src/input.c - ${GLFW_SOURCE_DIR}/src/joystick.c - ${GLFW_SOURCE_DIR}/src/opengl.c - ${GLFW_SOURCE_DIR}/src/time.c - ${GLFW_SOURCE_DIR}/src/window.c -) - #-------------------------------------------------------------------- # Set up GLFW for Win32 and WGL on Windows #-------------------------------------------------------------------- @@ -41,9 +28,6 @@ if (WIN32) set(CMAKE_REQUIRED_LIBRARIES ${OPENGL_gl_LIBRARY}) list(APPEND GLFW_INCLUDE_DIR ${OPENGL_INCLUDE_DIR}) list(APPEND GLFW_LIBRARIES ${OPENGL_gl_LIBRARY}) - - # Select platform specific code - add_subdirectory(src/win32) endif (WIN32) #-------------------------------------------------------------------- @@ -105,9 +89,6 @@ if (UNIX AND NOT APPLE AND NOT CYGWIN) if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(_GLFW_USE_LINUX_JOYSTICKS 1) endif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - - # Select platform specific code - add_subdirectory(src/x11) endif(UNIX AND NOT APPLE AND NOT CYGWIN) #-------------------------------------------------------------------- @@ -135,14 +116,12 @@ if (UNIX AND APPLE) find_library(COCOA_FRAMEWORK Cocoa) list(APPEND GLFW_LIBRARIES ${COCOA_FRAMEWORK}) list(APPEND GLFW_LIBRARIES ${OPENGL_gl_LIBRARY}) - - # Select platform specific code - add_subdirectory(src/cocoa) endif(UNIX AND APPLE) #-------------------------------------------------------------------- -# Add example and test programs +# Add subdirectories #-------------------------------------------------------------------- +add_subdirectory(src) add_subdirectory(examples) add_subdirectory(tests) @@ -176,11 +155,14 @@ install(FILES COPYING.txt readme.html #-------------------------------------------------------------------- # Uninstall operation +# Don't generate this target if a higher-level project already has #-------------------------------------------------------------------- -configure_file(${GLFW_SOURCE_DIR}/cmake_uninstall.cmake.in - ${GLFW_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY) +if(NOT TARGET uninstall) + configure_file(${GLFW_SOURCE_DIR}/cmake_uninstall.cmake.in + ${GLFW_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY) -add_custom_target(uninstall - ${CMAKE_COMMAND} -P - ${GLFW_BINARY_DIR}/cmake_uninstall.cmake) + add_custom_target(uninstall + ${CMAKE_COMMAND} -P + ${GLFW_BINARY_DIR}/cmake_uninstall.cmake) +endif() diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 1c8c4e1c..1836d134 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -147,6 +147,10 @@ extern "C" { /* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ +/* Include the declaration of the size_t type used below. + */ +#include + /* Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is * convenient for the user to only have to include . This also * solves the problem with Windows and needing some @@ -409,10 +413,11 @@ extern "C" { #define GLFW_FSAA_SAMPLES 0x00020012 #define GLFW_OPENGL_VERSION_MAJOR 0x00020013 #define GLFW_OPENGL_VERSION_MINOR 0x00020014 -#define GLFW_OPENGL_FORWARD_COMPAT 0x00020015 -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00020016 -#define GLFW_OPENGL_PROFILE 0x00020017 -#define GLFW_OPENGL_ROBUSTNESS 0x00020018 +#define GLFW_OPENGL_REVISION 0x00020015 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00020016 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00020017 +#define GLFW_OPENGL_PROFILE 0x00020018 +#define GLFW_OPENGL_ROBUSTNESS 0x00020019 /* GLFW_OPENGL_ROBUSTNESS mode tokens */ #define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000 @@ -532,9 +537,7 @@ GLFWAPI void glfwSetGammaRamp(const GLFWgammaramp* ramp); /* Window handling */ GLFWAPI GLFWwindow glfwOpenWindow(int width, int height, int mode, const char* title, GLFWwindow share); GLFWAPI void glfwOpenWindowHint(int target, int hint); -GLFWAPI void glfwMakeWindowCurrent(GLFWwindow window); GLFWAPI int glfwIsWindow(GLFWwindow window); -GLFWAPI GLFWwindow glfwGetCurrentWindow(void); GLFWAPI void glfwCloseWindow(GLFWwindow window); GLFWAPI void glfwSetWindowTitle(GLFWwindow, const char* title); GLFWAPI void glfwGetWindowSize(GLFWwindow, int* width, int* height); @@ -578,11 +581,13 @@ GLFWAPI double glfwGetTime(void); GLFWAPI void glfwSetTime(double time); /* OpenGL support */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow window); +GLFWAPI GLFWwindow glfwGetCurrentContext(void); GLFWAPI void glfwSwapBuffers(void); GLFWAPI void glfwSwapInterval(int interval); GLFWAPI int glfwExtensionSupported(const char* extension); GLFWAPI void* glfwGetProcAddress(const char* procname); -GLFWAPI void glfwGetGLVersion(int* major, int* minor, int* rev); +GLFWAPI void glfwCopyContext(GLFWwindow src, GLFWwindow dst, unsigned long mask); /* Enable/disable functions */ GLFWAPI void glfwEnable(GLFWwindow window, int token); diff --git a/readme.html b/readme.html index 314b1cdd..481444d0 100644 --- a/readme.html +++ b/readme.html @@ -263,7 +263,7 @@ version of GLFW.

  • Added GLFWwindow window handle type and updated window-related functions and callbacks to take a window handle
  • Added glfwIsWindow function for verifying that a given window handle is (still) valid
  • -
  • Added glfwMakeWindowCurrent function for making the context of the specified window current
  • +
  • Added glfwMakeContextCurrent function for making the context of the specified window current
  • Added glfwGetError and glfwErrorString error reporting functions and a number of error tokens
  • Added glfwSetErrorCallback function and GLFWerrorfun type for receiving more specific and/or nested errors
  • Added glfwSetWindowUserPointer and glfwGetWindowUserPointer functions for per-window user pointers
  • @@ -271,10 +271,12 @@ version of GLFW.

  • Added glfwGetWindowPos function for querying the position of the specified window
  • Added glfwSetWindowFocusCallback function and GLFWwindowfocusfun type for receiving window focus events
  • Added glfwSetWindowIconifyCallback function and GLFWwindowiconifyfun type for receiving window iconification events
  • -
  • Added glfwGetCurrentWindow function for retrieving the window whose OpenGL context is current
  • +
  • Added glfwGetCurrentContext function for retrieving the window whose OpenGL context is current
  • Added glfwInitWithModels function and GLFWallocator and GLFWthreadmodel types for pluggable memory allocation and threading models
  • +
  • Added glfwCopyContext function for copying OpenGL state categories between contexts
  • Added GLFW_OPENGL_ES2_PROFILE profile for creating OpenGL ES 2.0 contexts using the GLX_EXT_create_context_es2_profile and WGL_EXT_create_context_es2_profile extensions
  • Added GLFW_OPENGL_ROBUSTNESS window hint and associated strategy tokens for GL_ARB_robustness support
  • +
  • Added GLFW_OPENGL_REVISION window parameter to make up for removal of glfwGetGLVersion
  • Added windows simple multi-window test program
  • Added sharing simple OpenGL object sharing test program
  • Added a parameter to glfwOpenWindow for specifying a context the new window's context will share objects with
  • @@ -294,6 +296,7 @@ version of GLFW.

  • Removed deprecated Carbon port
  • Removed glfwSleep function
  • Removed glfwGetNumberOfProcessors function
  • +
  • Removed glfwGetGLVersion function
  • Removed GLFW_OPENED window parameter
  • Removed nonsensical key actions for Unicode character input
  • Removed GLFWCALL and GLFWAPIENTRY macros for stdcall calling convention
  • diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..dd844fc1 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,82 @@ + +if(CYGWIN) + + # These lines are intended to remove the --export-all-symbols + # flag added in the Modules/Platform/CYGWIN.cmake file of the + # CMake distribution. + # This is a HACK. If you have trouble _linking_ the GLFW + # _shared_ library on Cygwin, try disabling this. + set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-shared") + set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}) + +endif(CYGWIN) + +if(UNIX) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake + ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig) +endif(UNIX) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + ${GLFW_SOURCE_DIR}/src + ${GLFW_BINARY_DIR}/src + ${GLFW_INCLUDE_DIR}) + +set(common_SOURCES enable.c error.c fullscreen.c gamma.c init.c input.c + joystick.c opengl.c time.c window.c) + +if(_GLFW_COCOA_NSGL) + set(libglfw_SOURCES ${common_SOURCES} cocoa_enable.m cocoa_fullscreen.m + cocoa_gamma.m cocoa_init.m cocoa_joystick.m + cocoa_opengl.m cocoa_time.m cocoa_window.m) + + # For some reason, CMake doesn't know about .m + set_source_files_properties(${libglfw_SOURCES} PROPERTIES LANGUAGE C) +elseif(_GLFW_WIN32_WGL) + set(libglfw_SOURCES ${common_SOURCES} win32_enable.c win32_fullscreen.c + win32_gamma.c win32_init.c win32_joystick.c + win32_opengl.c win32_time.c win32_window.c + win32_dllmain.c) +elseif(_GLFW_X11_GLX) + set(libglfw_SOURCES ${common_SOURCES} x11_enable.c x11_fullscreen.c + x11_gamma.c x11_init.c x11_joystick.c + x11_keysym2unicode.c x11_opengl.c x11_time.c + x11_window.c) +else() + message(FATAL_ERROR "No supported platform was selected") +endif(_GLFW_COCOA_NSGL) + +add_library(libglfwStatic STATIC ${libglfw_SOURCES}) +add_library(libglfwShared SHARED ${libglfw_SOURCES}) +target_link_libraries(libglfwShared ${GLFW_LIBRARIES}) +set_target_properties(libglfwStatic libglfwShared PROPERTIES + CLEAN_DIRECT_OUTPUT 1 + OUTPUT_NAME glfw) + +if(WIN32) + # The GLFW DLL needs a special compile-time macro and import library name + set_target_properties(libglfwShared PROPERTIES + DEFINE_SYMBOL GLFW_BUILD_DLL + PREFIX "" + IMPORT_PREFIX "" + IMPORT_SUFFIX "dll.lib") +endif(WIN32) + +if(CYGWIN) + # Build for the regular Win32 environment (not Cygwin) + set_target_properties(libglfwStatic libglfwShared PROPERTIES + COMPILE_FLAGS "-mwin32 -mno-cygwin" + LINK_FLAGS "-mwin32 -mno-cygwin") +endif(CYGWIN) + +if(APPLE) + # Append -fno-common to the compile flags to work around a bug in the Apple GCC + get_target_property(CFLAGS libglfwShared COMPILE_FLAGS) + if(NOT CFLAGS) + set(CFLAGS "") + endif(NOT CFLAGS) + set_target_properties(libglfwShared PROPERTIES COMPILE_FLAGS "${CFLAGS} -fno-common") +endif(APPLE) + +install(TARGETS libglfwStatic libglfwShared DESTINATION lib) + diff --git a/src/cocoa/CMakeLists.txt b/src/cocoa/CMakeLists.txt deleted file mode 100644 index f0bc3c4c..00000000 --- a/src/cocoa/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake - ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR} - ${GLFW_SOURCE_DIR}/src - ${GLFW_BINARY_DIR}/src - ${GLFW_INCLUDE_DIR}) - -set(cocoa_SOURCES cocoa_enable.m - cocoa_fullscreen.m - cocoa_gamma.m - cocoa_init.m - cocoa_joystick.m - cocoa_opengl.m - cocoa_time.m - cocoa_window.m) - -# For some reason, CMake doesn't know about .m -set_source_files_properties(${cocoa_SOURCES} PROPERTIES LANGUAGE C) - -set(libglfw_SOURCES ${common_SOURCES} ${cocoa_SOURCES}) - -add_library(libglfwStatic STATIC ${libglfw_SOURCES}) -add_library(libglfwShared SHARED ${libglfw_SOURCES}) -target_link_libraries(libglfwShared ${GLFW_LIBRARIES}) -set_target_properties(libglfwStatic libglfwShared PROPERTIES - CLEAN_DIRECT_OUTPUT 1 - OUTPUT_NAME glfw) - -# Append -fno-common to the compile flags to work around a bug in the Apple GCC -get_target_property(CFLAGS libglfwShared COMPILE_FLAGS) -if(NOT CFLAGS) - set(CFLAGS "") -endif(NOT CFLAGS) -set_target_properties(libglfwShared PROPERTIES COMPILE_FLAGS "${CFLAGS} -fno-common") - -install(TARGETS libglfwStatic libglfwShared DESTINATION lib) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig) - diff --git a/src/cocoa/libglfw.pc.cmake b/src/cocoa/libglfw.pc.cmake deleted file mode 100644 index 37de53a3..00000000 --- a/src/cocoa/libglfw.pc.cmake +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@PREFIX@ -exec_prefix=@PREFIX@ -libdir=@PREFIX@/lib -includedir=@PREFIX@/include - -Name: GLFW -Description: A portable library for OpenGL development -Version: 3.0 -URL: http://www.glfw.org/ -Libs: -L${libdir} -lglfw -framework AGL -framework OpenGL -framework Carbon -Cflags: -I${includedir} diff --git a/src/cocoa/cocoa_enable.m b/src/cocoa_enable.m similarity index 100% rename from src/cocoa/cocoa_enable.m rename to src/cocoa_enable.m diff --git a/src/cocoa/cocoa_fullscreen.m b/src/cocoa_fullscreen.m similarity index 100% rename from src/cocoa/cocoa_fullscreen.m rename to src/cocoa_fullscreen.m diff --git a/src/cocoa/cocoa_gamma.m b/src/cocoa_gamma.m similarity index 100% rename from src/cocoa/cocoa_gamma.m rename to src/cocoa_gamma.m diff --git a/src/cocoa/cocoa_init.m b/src/cocoa_init.m similarity index 100% rename from src/cocoa/cocoa_init.m rename to src/cocoa_init.m diff --git a/src/cocoa/cocoa_joystick.m b/src/cocoa_joystick.m similarity index 100% rename from src/cocoa/cocoa_joystick.m rename to src/cocoa_joystick.m diff --git a/src/cocoa/cocoa_opengl.m b/src/cocoa_opengl.m similarity index 80% rename from src/cocoa/cocoa_opengl.m rename to src/cocoa_opengl.m index b633d472..bd3827fc 100644 --- a/src/cocoa/cocoa_opengl.m +++ b/src/cocoa_opengl.m @@ -34,6 +34,19 @@ ////// GLFW platform API ////// ////////////////////////////////////////////////////////////////////////// +//======================================================================== +// Make the OpenGL context associated with the specified window current +//======================================================================== + +void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) +{ + if (window) + [window->NSGL.context makeCurrentContext]; + else + [NSOpenGLContext clearCurrentContext]; +} + + //======================================================================== // Swap buffers //======================================================================== @@ -86,3 +99,12 @@ void* _glfwPlatformGetProcAddress(const char* procname) return symbol; } +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) +{ + [dst->NSGL.context copyAttributesFromContext:src->NSGL.context withMask:mask]; +} + diff --git a/src/cocoa/platform.h b/src/cocoa_platform.h similarity index 100% rename from src/cocoa/platform.h rename to src/cocoa_platform.h diff --git a/src/cocoa/cocoa_time.m b/src/cocoa_time.m similarity index 100% rename from src/cocoa/cocoa_time.m rename to src/cocoa_time.m diff --git a/src/cocoa/cocoa_window.m b/src/cocoa_window.m similarity index 96% rename from src/cocoa/cocoa_window.m rename to src/cocoa_window.m index b6c97fbd..df2f708f 100644 --- a/src/cocoa/cocoa_window.m +++ b/src/cocoa_window.m @@ -363,7 +363,11 @@ static int convertMacKeyCode(unsigned int macKeyCode) } if (_glfwLibrary.mousePosCallback) - _glfwLibrary.mousePosCallback(window, window->mousePosX, window->mousePosY); + { + _glfwLibrary.mousePosCallback(window, + window->mousePosX, + window->mousePosY); + } } - (void)rightMouseDown:(NSEvent *)event @@ -475,14 +479,18 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, // Fail if OpenGL 3.0 or above was requested if (wndconfig->glMajor > 2) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Cocoa/NSOpenGL: Mac OS X does not support OpenGL version 3.0 or above"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Cocoa/NSOpenGL: Mac OS X does not support OpenGL " + "version 3.0 or above"); return GL_FALSE; } // Fail if a robustness strategy was requested if (wndconfig->glRobustness) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Cocoa/NSOpenGL: Mac OS X does not support OpenGL robustness strategies"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Cocoa/NSOpenGL: Mac OS X does not support OpenGL " + "robustness strategies"); return GL_FALSE; } @@ -493,7 +501,9 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, _glfwLibrary.NS.delegate = [[GLFWApplicationDelegate alloc] init]; if (_glfwLibrary.NS.delegate == nil) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Cocoa/NSOpenGL: Failed to create application delegate"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Cocoa/NSOpenGL: Failed to create application " + "delegate"); return GL_FALSE; } @@ -503,7 +513,8 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, window->NS.delegate = [[GLFWWindowDelegate alloc] initWithGlfwWindow:window]; if (window->NS.delegate == nil) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Cocoa/NSOpenGL: Failed to create window delegate"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Cocoa/NSOpenGL: Failed to create window delegate"); return GL_FALSE; } @@ -634,7 +645,8 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; if (window->NSGL.pixelFormat == nil) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Cocoa/NSOpenGL: Failed to create pixel format"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Cocoa/NSOpenGL: Failed to create pixel format"); return GL_FALSE; } @@ -648,7 +660,8 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, shareContext:share]; if (window->NSGL.context == nil) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Cocoa/NSOpenGL: Failed to create OpenGL context"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Cocoa/NSOpenGL: Failed to create OpenGL context"); return GL_FALSE; } @@ -662,7 +675,7 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, withOptions:nil]; } - glfwMakeWindowCurrent(window); + glfwMakeContextCurrent(window); NSPoint point = [[NSCursor currentCursor] hotSpot]; window->mousePosX = point.x; @@ -673,18 +686,6 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, return GL_TRUE; } -//======================================================================== -// Make the OpenGL context associated with the specified window current -//======================================================================== - -void _glfwPlatformMakeWindowCurrent(_GLFWwindow* window) -{ - if (window) - [window->NSGL.context makeCurrentContext]; - else - [NSOpenGLContext clearCurrentContext]; -} - //======================================================================== // Properly kill the window / video display diff --git a/src/internal.h b/src/internal.h index c942707b..19bf299a 100644 --- a/src/internal.h +++ b/src/internal.h @@ -58,11 +58,18 @@ #include "config.h" -#include "../../include/GL/glfw3.h" -#include "../../include/GL/glext.h" - -#include "platform.h" +#include "../include/GL/glfw3.h" +#include "../include/GL/glext.h" +#if defined(_GLFW_COCOA_NSGL) +#include "cocoa_platform.h" +#elif defined(_GLFW_WIN32_WGL) +#include "win32_platform.h" +#elif defined(_GLFW_X11_GLX) +#include "x11_platform.h" +#else +#error "No supported platform selected" +#endif typedef struct _GLFWhints _GLFWhints; typedef struct _GLFWwndconfig _GLFWwndconfig; @@ -289,7 +296,6 @@ void _glfwPlatformSetTime(double time); // Window management int _glfwPlatformOpenWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig); -void _glfwPlatformMakeWindowCurrent(_GLFWwindow* window); void _glfwPlatformCloseWindow(_GLFWwindow* window); void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title); void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height); @@ -305,11 +311,13 @@ void _glfwPlatformPollEvents(void); void _glfwPlatformWaitEvents(void); // OpenGL context management +void _glfwPlatformMakeContextCurrent(_GLFWwindow* window); void _glfwPlatformSwapBuffers(void); void _glfwPlatformSwapInterval(int interval); void _glfwPlatformRefreshWindowParams(void); int _glfwPlatformExtensionSupported(const char* extension); void* _glfwPlatformGetProcAddress(const char* procname); +void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask); //======================================================================== diff --git a/src/libglfw.pc.cmake b/src/libglfw.pc.cmake new file mode 100644 index 00000000..e69de29b diff --git a/src/opengl.c b/src/opengl.c index a08f97f9..9b39d0e7 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -423,6 +423,44 @@ int _glfwStringInExtensionString(const char* string, ////// GLFW public API ////// ////////////////////////////////////////////////////////////////////////// +//======================================================================== +// Make the OpenGL context associated with the specified window current +//======================================================================== + +GLFWAPI void glfwMakeContextCurrent(GLFWwindow handle) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return; + } + + if (_glfwLibrary.currentWindow == window) + return; + + _glfwPlatformMakeContextCurrent(window); + _glfwLibrary.currentWindow = window; +} + + +//======================================================================== +// Returns the window whose OpenGL context is current +//======================================================================== + +GLFWAPI GLFWwindow glfwGetCurrentContext(void) +{ + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return GL_FALSE; + } + + return _glfwLibrary.currentWindow; +} + + //======================================================================== // Swap buffers (double-buffering) //======================================================================== @@ -557,12 +595,13 @@ GLFWAPI void* glfwGetProcAddress(const char* procname) //======================================================================== -// Returns the OpenGL version +// Copies the specified OpenGL state categories from src to dst //======================================================================== -GLFWAPI void glfwGetGLVersion(int* major, int* minor, int* rev) +GLFWAPI void glfwCopyContext(GLFWwindow hsrc, GLFWwindow hdst, unsigned long mask) { - _GLFWwindow* window; + _GLFWwindow* src; + _GLFWwindow* dst; if (!_glfwInitialized) { @@ -570,20 +609,15 @@ GLFWAPI void glfwGetGLVersion(int* major, int* minor, int* rev) return; } - window = _glfwLibrary.currentWindow; - if (!window) + src = (_GLFWwindow*) hsrc; + dst = (_GLFWwindow*) hdst; + + if (_glfwLibrary.currentWindow == dst) { - _glfwSetError(GLFW_NO_CURRENT_WINDOW, NULL); + _glfwSetError(GLFW_INVALID_VALUE, "Cannot copy OpenGL state to a current context"); return; } - if (major != NULL) - *major = window->glMajor; - - if (minor != NULL) - *minor = window->glMinor; - - if (rev != NULL) - *rev = window->glRevision; + _glfwPlatformCopyContext(src, dst, mask); } diff --git a/src/win32/CMakeLists.txt b/src/win32/CMakeLists.txt deleted file mode 100644 index 1220313d..00000000 --- a/src/win32/CMakeLists.txt +++ /dev/null @@ -1,59 +0,0 @@ - -if(CYGWIN) - - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake - ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY) - -# These lines are intended to remove the --export-all-symbols -# flag added in the Modules/Platform/CYGWIN.cmake file of the -# CMake distribution. -# This is a HACK. If you have trouble _linking_ the GLFW -# _shared_ library on Cygwin, try disabling this. - set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-shared") - set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}) - -endif(CYGWIN) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR} - ${GLFW_SOURCE_DIR}/src - ${GLFW_BINARY_DIR}/src - ${GLFW_INCLUDE_DIR}) - -set(libglfw_SOURCES ${common_SOURCES} - win32_enable.c - win32_fullscreen.c - win32_gamma.c - win32_init.c - win32_joystick.c - win32_opengl.c - win32_time.c - win32_window.c - win32_dllmain.c) - -add_library(libglfwStatic STATIC ${libglfw_SOURCES}) -add_library(libglfwShared SHARED ${libglfw_SOURCES}) - -target_link_libraries(libglfwShared ${OPENGL_gl_LIBRARY}) -set_target_properties(libglfwShared PROPERTIES - DEFINE_SYMBOL GLFW_BUILD_DLL - PREFIX "" - IMPORT_PREFIX "" - IMPORT_SUFFIX "dll.lib") - -set_target_properties(libglfwStatic libglfwShared PROPERTIES - CLEAN_DIRECT_OUTPUT 1 - OUTPUT_NAME glfw) - -if(CYGWIN) - # Build for the regular Win32 environment (not Cygwin) - set_target_properties(libglfwStatic libglfwShared PROPERTIES - COMPILE_FLAGS "-mwin32 -mno-cygwin" - LINK_FLAGS "-mwin32 -mno-cygwin") -endif(CYGWIN) - -install(TARGETS libglfwStatic libglfwShared DESTINATION lib) - -if(CYGWIN) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig) -endif(CYGWIN) - diff --git a/src/win32/libglfw.pc.cmake b/src/win32/libglfw.pc.cmake deleted file mode 100644 index 9449ce2e..00000000 --- a/src/win32/libglfw.pc.cmake +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: GLFW -Description: A portable library for OpenGL development -Version: 3.0 -URL: http://www.glfw.org/ -Libs: -L${libdir} -lglfw @GLFW_LIBRARIES@ -Cflags: -I${includedir} -mwin32 diff --git a/src/win32/win32_dllmain.c b/src/win32_dllmain.c similarity index 100% rename from src/win32/win32_dllmain.c rename to src/win32_dllmain.c diff --git a/src/win32/win32_enable.c b/src/win32_enable.c similarity index 100% rename from src/win32/win32_enable.c rename to src/win32_enable.c diff --git a/src/win32/win32_fullscreen.c b/src/win32_fullscreen.c similarity index 100% rename from src/win32/win32_fullscreen.c rename to src/win32_fullscreen.c diff --git a/src/win32/win32_gamma.c b/src/win32_gamma.c similarity index 100% rename from src/win32/win32_gamma.c rename to src/win32_gamma.c diff --git a/src/win32/win32_init.c b/src/win32_init.c similarity index 100% rename from src/win32/win32_init.c rename to src/win32_init.c diff --git a/src/win32/win32_joystick.c b/src/win32_joystick.c similarity index 100% rename from src/win32/win32_joystick.c rename to src/win32_joystick.c diff --git a/src/win32/win32_opengl.c b/src/win32_opengl.c similarity index 80% rename from src/win32/win32_opengl.c rename to src/win32_opengl.c index efce1531..e60d1e70 100644 --- a/src/win32/win32_opengl.c +++ b/src/win32_opengl.c @@ -35,6 +35,19 @@ ////// GLFW platform API ////// ////////////////////////////////////////////////////////////////////////// +//======================================================================== +// Make the OpenGL context associated with the specified window current +//======================================================================== + +void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) +{ + if (window) + wglMakeCurrent(window->WGL.DC, window->WGL.context); + else + wglMakeCurrent(NULL, NULL); +} + + //======================================================================== // Swap buffers (double-buffering) //======================================================================== @@ -103,3 +116,14 @@ void* _glfwPlatformGetProcAddress(const char* procname) return (void*) wglGetProcAddress(procname); } + +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) +{ + if (!wglCopyContext(src->WGL.context, dst->WGL.context, mask)) + _glfwSetError(GLFW_PLATFORM_ERROR, "Win32/WGL: Failed to copy OpenGL context attributes"); +} + diff --git a/src/win32/platform.h b/src/win32_platform.h similarity index 100% rename from src/win32/platform.h rename to src/win32_platform.h diff --git a/src/win32/win32_time.c b/src/win32_time.c similarity index 100% rename from src/win32/win32_time.c rename to src/win32_time.c diff --git a/src/win32/win32_window.c b/src/win32_window.c similarity index 95% rename from src/win32/win32_window.c rename to src/win32_window.c index 183f08e7..56b5908e 100644 --- a/src/win32/win32_window.c +++ b/src/win32_window.c @@ -155,7 +155,9 @@ static int getPixelFormatAttrib(_GLFWwindow* window, int pixelFormat, int attrib { int value = 0; - if (!window->WGL.GetPixelFormatAttribivARB(window->WGL.DC, pixelFormat, 0, 1, &attrib, &value)) + if (!window->WGL.GetPixelFormatAttribivARB(window->WGL.DC, + pixelFormat, + 0, 1, &attrib, &value)) { // NOTE: We should probably handle this error somehow return 0; @@ -180,7 +182,12 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) if (window->WGL.has_WGL_ARB_pixel_format) count = getPixelFormatAttrib(window, 1, WGL_NUMBER_PIXEL_FORMATS_ARB); else - count = _glfw_DescribePixelFormat(window->WGL.DC, 1, sizeof(PIXELFORMATDESCRIPTOR), NULL); + { + count = _glfw_DescribePixelFormat(window->WGL.DC, + 1, + sizeof(PIXELFORMATDESCRIPTOR), + NULL); + } if (!count) { @@ -191,7 +198,8 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) result = (_GLFWfbconfig*) _glfwMalloc(sizeof(_GLFWfbconfig) * count); if (!result) { - _glfwSetError(GLFW_OUT_OF_MEMORY, "Win32/WGL: Failed to allocate _GLFWfbconfig array"); + _glfwSetError(GLFW_OUT_OF_MEMORY, + "Win32/WGL: Failed to allocate _GLFWfbconfig array"); return NULL; } @@ -259,8 +267,13 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) { // Get pixel format attributes through old-fashioned PFDs - if (!_glfw_DescribePixelFormat(window->WGL.DC, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd)) + if (!_glfw_DescribePixelFormat(window->WGL.DC, + i, + sizeof(PIXELFORMATDESCRIPTOR), + &pfd)) + { continue; + } if (!(pfd.dwFlags & PFD_DRAW_TO_WINDOW) || !(pfd.dwFlags & PFD_SUPPORT_OPENGL) || @@ -324,13 +337,15 @@ static GLboolean createContext(_GLFWwindow* window, if (!_glfw_DescribePixelFormat(window->WGL.DC, pixelFormat, sizeof(pfd), &pfd)) { - _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "Win32/WGL: Failed to retrieve PFD for selected pixel format"); + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "Win32/WGL: Failed to retrieve PFD for selected pixel format"); return GL_FALSE; } if (!_glfw_SetPixelFormat(window->WGL.DC, pixelFormat, &pfd)) { - _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "Win32/WGL: Failed to set selected pixel format"); + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "Win32/WGL: Failed to set selected pixel format"); return GL_FALSE; } @@ -371,14 +386,18 @@ static GLboolean createContext(_GLFWwindow* window, if (!window->WGL.has_WGL_ARB_create_context_profile) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Win32/WGL: OpenGL profile requested but WGL_ARB_create_context_profile is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: OpenGL profile requested but " + "WGL_ARB_create_context_profile is unavailable"); return GL_FALSE; } if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && !window->WGL.has_WGL_EXT_create_context_es2_profile) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Win32/WGL: OpenGL ES 2.x profile requested but WGL_EXT_create_context_es2_profile is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: OpenGL ES 2.x profile requested but " + "WGL_EXT_create_context_es2_profile is unavailable"); return GL_FALSE; } @@ -399,7 +418,10 @@ static GLboolean createContext(_GLFWwindow* window, if (!window->WGL.has_WGL_ARB_create_context_robustness) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Win32/WGL: An OpenGL robustness strategy was requested but WGL_ARB_create_context_robustness is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: An OpenGL robustness strategy was " + "requested but WGL_ARB_create_context_robustness " + "is unavailable"); return GL_FALSE; } @@ -419,7 +441,8 @@ static GLboolean createContext(_GLFWwindow* window, attribs); if (!window->WGL.context) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Win32/WGL: Failed to create OpenGL context"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: Failed to create OpenGL context"); return GL_FALSE; } } @@ -428,7 +451,8 @@ static GLboolean createContext(_GLFWwindow* window, window->WGL.context = wglCreateContext(window->WGL.DC); if (!window->WGL.context) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Win32/WGL: Failed to create OpenGL context"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Win32/WGL: Failed to create OpenGL context"); return GL_FALSE; } @@ -436,7 +460,9 @@ static GLboolean createContext(_GLFWwindow* window, { if (!wglShareLists(share, window->WGL.context)) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Win32/WGL: Failed to enable sharing with specified OpenGL context"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Win32/WGL: Failed to enable sharing with " + "specified OpenGL context"); return GL_FALSE; } } @@ -992,7 +1018,11 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, } if (_glfwLibrary.windowSizeCallback) - _glfwLibrary.windowSizeCallback(window, window->width, window->height); + { + _glfwLibrary.windowSizeCallback(window, + window->width, + window->height); + } return 0; } @@ -1178,7 +1208,8 @@ static ATOM registerWindowClass(void) classAtom = RegisterClass(&wc); if (!classAtom) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Win32/WGL: Failed to register window class"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Win32/WGL: Failed to register window class"); return 0; } @@ -1299,7 +1330,8 @@ static int createWindow(_GLFWwindow* window, window->WGL.DC = GetDC(window->Win32.handle); if (!window->WGL.DC) { - _glfwSetError(GLFW_PLATFORM_ERROR, "Win32/WGL: Failed to retrieve DC for window"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "Win32/WGL: Failed to retrieve DC for window"); return GL_FALSE; } @@ -1310,7 +1342,7 @@ static int createWindow(_GLFWwindow* window, if (!createContext(window, wndconfig, pixelFormat)) return GL_FALSE; - glfwMakeWindowCurrent(window); + glfwMakeContextCurrent(window); initWGLExtensions(window); @@ -1333,7 +1365,7 @@ static void destroyWindow(_GLFWwindow* window) // This is duplicated from glfwCloseWindow // TODO: Stop duplicating code if (window == _glfwLibrary.currentWindow) - glfwMakeWindowCurrent(NULL); + glfwMakeContextCurrent(NULL); // This is duplicated from glfwCloseWindow // TODO: Stop duplicating code @@ -1417,7 +1449,10 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, { if (!window->WGL.has_WGL_ARB_create_context) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Win32/WGL: A forward compatible or debug OpenGL context requested but WGL_ARB_create_context is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: A forward compatible or debug OpenGL " + "context requested but WGL_ARB_create_context is " + "unavailable"); return GL_FALSE; } @@ -1428,7 +1463,9 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, { if (!window->WGL.has_WGL_ARB_create_context_profile) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "Win32/WGL: OpenGL profile requested but WGL_ARB_create_context_profile is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "Win32/WGL: OpenGL profile requested but " + "WGL_ARB_create_context_profile is unavailable"); return GL_FALSE; } @@ -1484,19 +1521,6 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, } -//======================================================================== -// Make the OpenGL context associated with the specified window current -//======================================================================== - -void _glfwPlatformMakeWindowCurrent(_GLFWwindow* window) -{ - if (window) - wglMakeCurrent(window->WGL.DC, window->WGL.context); - else - wglMakeCurrent(NULL, NULL); -} - - //======================================================================== // Properly kill the window / video display //======================================================================== diff --git a/src/window.c b/src/window.c index 086b9188..9c985b13 100644 --- a/src/window.c +++ b/src/window.c @@ -336,7 +336,7 @@ GLFWAPI GLFWwindow glfwOpenWindow(int width, int height, } // Cache the actual (as opposed to desired) window parameters - glfwMakeWindowCurrent(window); + glfwMakeContextCurrent(window); _glfwPlatformRefreshWindowParams(); if (!_glfwIsValidContext(window, &wndconfig)) @@ -359,28 +359,6 @@ GLFWAPI GLFWwindow glfwOpenWindow(int width, int height, } -//======================================================================== -// Make the OpenGL context associated with the specified window current -//======================================================================== - -GLFWAPI void glfwMakeWindowCurrent(GLFWwindow handle) -{ - _GLFWwindow* window = (_GLFWwindow*) handle; - - if (!_glfwInitialized) - { - _glfwSetError(GLFW_NOT_INITIALIZED, NULL); - return; - } - - if (_glfwLibrary.currentWindow == window) - return; - - _glfwPlatformMakeWindowCurrent(window); - _glfwLibrary.currentWindow = window; -} - - //======================================================================== // Returns GL_TRUE if the specified window handle is an actual window //======================================================================== @@ -409,22 +387,6 @@ GLFWAPI int glfwIsWindow(GLFWwindow handle) } -//======================================================================== -// Returns GL_TRUE if the specified window handle is an actual window -//======================================================================== - -GLFWAPI GLFWwindow glfwGetCurrentWindow(void) -{ - if (!_glfwInitialized) - { - _glfwSetError(GLFW_NOT_INITIALIZED, NULL); - return GL_FALSE; - } - - return _glfwLibrary.currentWindow; -} - - //======================================================================== // Set hints for opening the window //======================================================================== @@ -532,7 +494,7 @@ GLFWAPI void glfwCloseWindow(GLFWwindow handle) // Clear the current context if this window's context is current if (window == _glfwLibrary.currentWindow) - glfwMakeWindowCurrent(NULL); + glfwMakeContextCurrent(NULL); // Clear the active window pointer if this is the active window if (window == _glfwLibrary.activeWindow) @@ -777,6 +739,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param) return window->glMajor; case GLFW_OPENGL_VERSION_MINOR: return window->glMinor; + case GLFW_OPENGL_REVISION: + return window->glRevision; case GLFW_OPENGL_FORWARD_COMPAT: return window->glForward; case GLFW_OPENGL_DEBUG_CONTEXT: diff --git a/src/x11/CMakeLists.txt b/src/x11/CMakeLists.txt deleted file mode 100644 index 6369a334..00000000 --- a/src/x11/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake - ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR} - ${GLFW_SOURCE_DIR}/src - ${GLFW_BINARY_DIR}/src - ${GLFW_INCLUDE_DIR}) - -set(libglfw_SOURCES ${common_SOURCES} - x11_enable.c - x11_fullscreen.c - x11_gamma.c - x11_init.c - x11_joystick.c - x11_keysym2unicode.c - x11_opengl.c - x11_time.c - x11_window.c) - -add_library(libglfwStatic STATIC ${libglfw_SOURCES}) -add_library(libglfwShared SHARED ${libglfw_SOURCES}) -target_link_libraries(libglfwShared ${GLFW_LIBRARIES}) -set_target_properties(libglfwStatic libglfwShared PROPERTIES - CLEAN_DIRECT_OUTPUT 1 - OUTPUT_NAME glfw) - -install(TARGETS libglfwStatic libglfwShared DESTINATION lib) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig) - diff --git a/src/x11/libglfw.pc.cmake b/src/x11/libglfw.pc.cmake deleted file mode 100644 index c9b8a690..00000000 --- a/src/x11/libglfw.pc.cmake +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: GLFW -Description: A portable library for OpenGL development -Version: 3.0 -URL: http://www.glfw.org/ -Libs: -L${libdir} -lglfw @GLFW_LIBRARIES@ -Cflags: -I${includedir} diff --git a/src/x11/x11_enable.c b/src/x11_enable.c similarity index 100% rename from src/x11/x11_enable.c rename to src/x11_enable.c diff --git a/src/x11/x11_fullscreen.c b/src/x11_fullscreen.c similarity index 100% rename from src/x11/x11_fullscreen.c rename to src/x11_fullscreen.c diff --git a/src/x11/x11_gamma.c b/src/x11_gamma.c similarity index 100% rename from src/x11/x11_gamma.c rename to src/x11_gamma.c diff --git a/src/x11/x11_init.c b/src/x11_init.c similarity index 100% rename from src/x11/x11_init.c rename to src/x11_init.c diff --git a/src/x11/x11_joystick.c b/src/x11_joystick.c similarity index 100% rename from src/x11/x11_joystick.c rename to src/x11_joystick.c diff --git a/src/x11/x11_keysym2unicode.c b/src/x11_keysym2unicode.c similarity index 100% rename from src/x11/x11_keysym2unicode.c rename to src/x11_keysym2unicode.c diff --git a/src/x11/x11_opengl.c b/src/x11_opengl.c similarity index 81% rename from src/x11/x11_opengl.c rename to src/x11_opengl.c index 33b19ff9..a261d616 100644 --- a/src/x11/x11_opengl.c +++ b/src/x11_opengl.c @@ -56,6 +56,23 @@ void (*glXGetProcAddressEXT(const GLubyte* procName))(); ////// GLFW internal API ////// ////////////////////////////////////////////////////////////////////////// +//======================================================================== +// Make the OpenGL context associated with the specified window current +//======================================================================== + +void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) +{ + if (window) + { + glXMakeCurrent(_glfwLibrary.X11.display, + window->X11.handle, + window->GLX.context); + } + else + glXMakeCurrent(_glfwLibrary.X11.display, None, NULL); +} + + //======================================================================== // Swap OpenGL buffers //======================================================================== @@ -116,3 +133,16 @@ void* _glfwPlatformGetProcAddress(const char* procname) return (void*) _glfw_glXGetProcAddress((const GLubyte*) procname); } + +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +void _glfwPlatformCopyContext(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) +{ + glXCopyContext(_glfwLibrary.X11.display, + src->GLX.context, + dst->GLX.context, + mask); +} + diff --git a/src/x11/platform.h b/src/x11_platform.h similarity index 100% rename from src/x11/platform.h rename to src/x11_platform.h diff --git a/src/x11/x11_time.c b/src/x11_time.c similarity index 100% rename from src/x11/x11_time.c rename to src/x11_time.c diff --git a/src/x11/x11_window.c b/src/x11_window.c similarity index 95% rename from src/x11/x11_window.c rename to src/x11_window.c index 47af01f6..5a54f389 100644 --- a/src/x11/x11_window.c +++ b/src/x11_window.c @@ -277,7 +277,8 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) { if (!window->GLX.has_GLX_SGIX_fbconfig) { - _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11/GLX: GLXFBConfig support not found"); + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "X11/GLX: GLXFBConfig support not found"); return NULL; } } @@ -290,16 +291,20 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) &count); if (!count) { - _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11/GLX: No GLXFBConfigs returned"); + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "X11/GLX: No GLXFBConfigs returned"); return NULL; } } else { - fbconfigs = glXGetFBConfigs(_glfwLibrary.X11.display, _glfwLibrary.X11.screen, &count); + fbconfigs = glXGetFBConfigs(_glfwLibrary.X11.display, + _glfwLibrary.X11.screen, + &count); if (!count) { - _glfwSetError(GLFW_OPENGL_UNAVAILABLE, "X11/GLX: No GLXFBConfigs returned"); + _glfwSetError(GLFW_OPENGL_UNAVAILABLE, + "X11/GLX: No GLXFBConfigs returned"); return NULL; } } @@ -307,7 +312,8 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) result = (_GLFWfbconfig*) _glfwMalloc(sizeof(_GLFWfbconfig) * count); if (!result) { - _glfwSetError(GLFW_OUT_OF_MEMORY, "X11/GLX: Failed to allocate _GLFWfbconfig array"); + _glfwSetError(GLFW_OUT_OF_MEMORY, + "X11/GLX: Failed to allocate _GLFWfbconfig array"); return NULL; } @@ -320,7 +326,9 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) continue; } - if (!(getFBConfigAttrib(window, fbconfigs[i], GLX_RENDER_TYPE) & GLX_RGBA_BIT)) + if (!(getFBConfigAttrib(window, + fbconfigs[i], + GLX_RENDER_TYPE) & GLX_RGBA_BIT)) { // Only consider RGBA GLXFBConfigs continue; @@ -408,7 +416,8 @@ static int createContext(_GLFWwindow* window, if (fbconfig == NULL) { - _glfwSetError(GLFW_PLATFORM_ERROR, "X11/GLX: Failed to retrieve the selected GLXFBConfig"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/GLX: Failed to retrieve the selected GLXFBConfig"); return GL_FALSE; } } @@ -429,7 +438,8 @@ static int createContext(_GLFWwindow* window, { XFree(fbconfig); - _glfwSetError(GLFW_PLATFORM_ERROR, "X11/GLX: Failed to retrieve visual for GLXFBConfig"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/GLX: Failed to retrieve visual for GLXFBConfig"); return GL_FALSE; } @@ -467,14 +477,18 @@ static int createContext(_GLFWwindow* window, if (!window->GLX.has_GLX_ARB_create_context_profile) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "X11/GLX: An OpenGL profile requested but GLX_ARB_create_context_profile is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "X11/GLX: An OpenGL profile requested but " + "GLX_ARB_create_context_profile is unavailable"); return GL_FALSE; } if (wndconfig->glProfile == GLFW_OPENGL_ES2_PROFILE && !window->GLX.has_GLX_EXT_create_context_es2_profile) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "X11/GLX: OpenGL ES 2.x profile requested but GLX_EXT_create_context_es2_profile is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "X11/GLX: OpenGL ES 2.x profile requested but " + "GLX_EXT_create_context_es2_profile is unavailable"); return GL_FALSE; } @@ -494,7 +508,10 @@ static int createContext(_GLFWwindow* window, if (!window->GLX.has_GLX_ARB_create_context_robustness) { - _glfwSetError(GLFW_VERSION_UNAVAILABLE, "X11/GLX: An OpenGL robustness strategy was requested but GLX_ARB_create_context_robustness is unavailable"); + _glfwSetError(GLFW_VERSION_UNAVAILABLE, + "X11/GLX: An OpenGL robustness strategy was " + "requested but GLX_ARB_create_context_robustness " + "is unavailable"); return GL_FALSE; } @@ -503,7 +520,10 @@ static int createContext(_GLFWwindow* window, else if (wndconfig->glRobustness == GLFW_OPENGL_LOSE_CONTEXT_ON_RESET) strategy = GLX_LOSE_CONTEXT_ON_RESET_ARB; - setGLXattrib(attribs, index, GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, strategy); + setGLXattrib(attribs, + index, + GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, + strategy); } setGLXattrib(attribs, index, None, None); @@ -551,7 +571,8 @@ static int createContext(_GLFWwindow* window, { // TODO: Handle all the various error codes here - _glfwSetError(GLFW_PLATFORM_ERROR, "X11/GLX: Failed to create OpenGL context"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/GLX: Failed to create OpenGL context"); return GL_FALSE; } @@ -699,7 +720,8 @@ static GLboolean createWindow(_GLFWwindow* window, { // TODO: Handle all the various error codes here - _glfwSetError(GLFW_PLATFORM_ERROR, "X11/GLX: Failed to create window"); + _glfwSetError(GLFW_PLATFORM_ERROR, + "X11/GLX: Failed to create window"); return GL_FALSE; } } @@ -760,7 +782,8 @@ static GLboolean createWindow(_GLFWwindow* window, XWMHints* hints = XAllocWMHints(); if (!hints) { - _glfwSetError(GLFW_OUT_OF_MEMORY, "X11/GLX: Failed to allocate WM hints"); + _glfwSetError(GLFW_OUT_OF_MEMORY, + "X11/GLX: Failed to allocate WM hints"); return GL_FALSE; } @@ -776,7 +799,8 @@ static GLboolean createWindow(_GLFWwindow* window, XSizeHints* hints = XAllocSizeHints(); if (!hints) { - _glfwSetError(GLFW_OUT_OF_MEMORY, "X11/GLX: Failed to allocate size hints"); + _glfwSetError(GLFW_OUT_OF_MEMORY, + "X11/GLX: Failed to allocate size hints"); return GL_FALSE; } @@ -1424,23 +1448,6 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window, } -//======================================================================== -// Make the OpenGL context associated with the specified window current -//======================================================================== - -void _glfwPlatformMakeWindowCurrent(_GLFWwindow* window) -{ - if (window) - { - glXMakeCurrent(_glfwLibrary.X11.display, - window->X11.handle, - window->GLX.context); - } - else - glXMakeCurrent(_glfwLibrary.X11.display, None, NULL); -} - - //======================================================================== // Properly kill the window/video display //======================================================================== @@ -1505,7 +1512,8 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) if (window->mode == GLFW_FULLSCREEN) { // Get the closest matching video mode for the specified window size - mode = _glfwGetClosestVideoMode(_glfwLibrary.X11.screen, &width, &height, &rate); + mode = _glfwGetClosestVideoMode(_glfwLibrary.X11.screen, + &width, &height, &rate); } if (window->windowNoResize) @@ -1670,7 +1678,8 @@ void _glfwPlatformRefreshWindowParams(void) { #if defined(_GLFW_HAS_XF86VIDMODE) // Use the XF86VidMode extension to get current video mode - XF86VidModeGetModeLine(_glfwLibrary.X11.display, _glfwLibrary.X11.screen, + XF86VidModeGetModeLine(_glfwLibrary.X11.display, + _glfwLibrary.X11.screen, &dotclock, &modeline); pixels_per_second = 1000.0f * (float) dotclock; pixels_per_frame = (float) modeline.htotal * modeline.vtotal; diff --git a/tests/sharing.c b/tests/sharing.c index 16e6eaf4..942ec2c6 100644 --- a/tests/sharing.c +++ b/tests/sharing.c @@ -80,7 +80,7 @@ static GLuint create_texture(void) static void draw_quad(GLuint texture) { int width, height; - glfwGetWindowSize(glfwGetCurrentWindow(), &width, &height); + glfwGetWindowSize(glfwGetCurrentContext(), &width, &height); glViewport(0, 0, width, height); @@ -148,11 +148,11 @@ int main(int argc, char** argv) while (glfwIsWindow(windows[0]) && glfwIsWindow(windows[1])) { - glfwMakeWindowCurrent(windows[0]); + glfwMakeContextCurrent(windows[0]); draw_quad(texture); glfwSwapBuffers(); - glfwMakeWindowCurrent(windows[1]); + glfwMakeContextCurrent(windows[1]); draw_quad(texture); glfwSwapBuffers(); diff --git a/tests/version.c b/tests/version.c index e473ef55..c36fa387 100644 --- a/tests/version.c +++ b/tests/version.c @@ -229,7 +229,9 @@ int main(int argc, char** argv) printf("OpenGL context version string: \"%s\"\n", glGetString(GL_VERSION)); - glfwGetGLVersion(&major, &minor, &revision); + major = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MAJOR); + minor = glfwGetWindowParam(window, GLFW_OPENGL_VERSION_MINOR); + revision = glfwGetWindowParam(window, GLFW_OPENGL_REVISION); printf("OpenGL context version parsed by GLFW: %u.%u.%u\n", major, minor, revision); diff --git a/tests/windows.c b/tests/windows.c index 13c76cbe..b84c9262 100644 --- a/tests/windows.c +++ b/tests/windows.c @@ -73,7 +73,7 @@ int main(void) { for (i = 0; i < 4; i++) { - glfwMakeWindowCurrent(windows[i]); + glfwMakeContextCurrent(windows[i]); glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(); }