diff --git a/extern/glfw/CMake/AppleInfo.plist b/extern/glfw/CMake/AppleInfo.plist new file mode 100644 index 0000000..b29cde1 --- /dev/null +++ b/extern/glfw/CMake/AppleInfo.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${APPLE_GUI_EXECUTABLE} + CFBundleGetInfoString + ${APPLE_GUI_INFO_STRING} + CFBundleIconFile + ${APPLE_GUI_ICON} + CFBundleIdentifier + ${APPLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + ${APPLE_GUI_LONG_VERSION_STRING} + CFBundleName + ${APPLE_GUI_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${APPLE_GUI_SHORT_VERSION_STRING} + CFBundleSignature + ???? + CFBundleVersion + ${APPLE_GUI_BUNDLE_VERSION} + CSResourcesFileMapped + + LSRequiresCarbon + + NSHumanReadableCopyright + ${APPLE_GUI_COPYRIGHT} + NSHighResolutionCapable + + + diff --git a/extern/glfw/CMakeFiles/Export/lib/cmake/glfw/glfwTargets-release.cmake b/extern/glfw/CMakeFiles/Export/lib/cmake/glfw/glfwTargets-release.cmake deleted file mode 100644 index 32f734b..0000000 --- a/extern/glfw/CMakeFiles/Export/lib/cmake/glfw/glfwTargets-release.cmake +++ /dev/null @@ -1,19 +0,0 @@ -#---------------------------------------------------------------- -# Generated CMake target import file for configuration "Release". -#---------------------------------------------------------------- - -# Commands may need to know the format version. -set(CMAKE_IMPORT_FILE_VERSION 1) - -# Import target "glfw" for configuration "Release" -set_property(TARGET glfw APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) -set_target_properties(glfw PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" - IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libglfw3.a" - ) - -list(APPEND _IMPORT_CHECK_TARGETS glfw ) -list(APPEND _IMPORT_CHECK_FILES_FOR_glfw "${_IMPORT_PREFIX}/lib/libglfw3.a" ) - -# Commands beyond this point should not need to know the version. -set(CMAKE_IMPORT_FILE_VERSION) diff --git a/extern/glfw/CMakeFiles/Export/lib/cmake/glfw/glfwTargets.cmake b/extern/glfw/CMakeFiles/Export/lib/cmake/glfw/glfwTargets.cmake deleted file mode 100644 index e3c3a48..0000000 --- a/extern/glfw/CMakeFiles/Export/lib/cmake/glfw/glfwTargets.cmake +++ /dev/null @@ -1,84 +0,0 @@ -# Generated by CMake 3.1.3 - -if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) - message(FATAL_ERROR "CMake >= 2.6.0 required") -endif() -cmake_policy(PUSH) -cmake_policy(VERSION 2.6) -#---------------------------------------------------------------- -# Generated CMake target import file. -#---------------------------------------------------------------- - -# Commands may need to know the format version. -set(CMAKE_IMPORT_FILE_VERSION 1) - -# Protect against multiple inclusion, which would fail when already imported targets are added once more. -set(_targetsDefined) -set(_targetsNotDefined) -set(_expectedTargets) -foreach(_expectedTarget glfw) - list(APPEND _expectedTargets ${_expectedTarget}) - if(NOT TARGET ${_expectedTarget}) - list(APPEND _targetsNotDefined ${_expectedTarget}) - endif() - if(TARGET ${_expectedTarget}) - list(APPEND _targetsDefined ${_expectedTarget}) - endif() -endforeach() -if("${_targetsDefined}" STREQUAL "${_expectedTargets}") - set(CMAKE_IMPORT_FILE_VERSION) - cmake_policy(POP) - return() -endif() -if(NOT "${_targetsDefined}" STREQUAL "") - message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") -endif() -unset(_targetsDefined) -unset(_targetsNotDefined) -unset(_expectedTargets) - - -# Compute the installation prefix relative to this file. -get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) - -# Create imported target glfw -add_library(glfw STATIC IMPORTED) - -# Load information for each installed configuration. -get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -file(GLOB CONFIG_FILES "${_DIR}/glfwTargets-*.cmake") -foreach(f ${CONFIG_FILES}) - include(${f}) -endforeach() - -# Cleanup temporary variables. -set(_IMPORT_PREFIX) - -# Loop over all imported files and verify that they actually exist -foreach(target ${_IMPORT_CHECK_TARGETS} ) - foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) - if(NOT EXISTS "${file}" ) - message(FATAL_ERROR "The imported target \"${target}\" references the file - \"${file}\" -but this file does not exist. Possible reasons include: -* The file was deleted, renamed, or moved to another location. -* An install or uninstall procedure did not complete successfully. -* The installation package was faulty and contained - \"${CMAKE_CURRENT_LIST_FILE}\" -but not all the files it references. -") - endif() - endforeach() - unset(_IMPORT_CHECK_FILES_FOR_${target}) -endforeach() -unset(_IMPORT_CHECK_TARGETS) - -# This file does not depend on other imported targets which have -# been exported from the same project but in a separate export set. - -# Commands beyond this point should not need to know the version. -set(CMAKE_IMPORT_FILE_VERSION) -cmake_policy(POP) diff --git a/extern/glfw/CMakeLists.txt b/extern/glfw/CMakeLists.txt index 731f09f..efb559c 100644 --- a/extern/glfw/CMakeLists.txt +++ b/extern/glfw/CMakeLists.txt @@ -10,7 +10,7 @@ endif() set(GLFW_VERSION_MAJOR "3") set(GLFW_VERSION_MINOR "1") -set(GLFW_VERSION_PATCH "0") +set(GLFW_VERSION_PATCH "1") set(GLFW_VERSION_EXTRA "") set(GLFW_VERSION "${GLFW_VERSION_MAJOR}.${GLFW_VERSION_MINOR}") set(GLFW_VERSION_FULL "${GLFW_VERSION}.${GLFW_VERSION_PATCH}${GLFW_VERSION_EXTRA}") @@ -273,33 +273,33 @@ if (_GLFW_X11) list(APPEND glfw_PKG_DEPS "xinerama") # Check for XInput (high-resolution cursor motion) - if (NOT X11_Xinput_FOUND) - message(FATAL_ERROR "The XInput library and headers were not found") - endif() + if (X11_Xinput_FOUND) + list(APPEND glfw_INCLUDE_DIRS "${X11_Xinput_INCLUDE_PATH}") + list(APPEND glfw_PKG_DEPS "xi") - list(APPEND glfw_INCLUDE_DIRS "${X11_Xinput_INCLUDE_PATH}") + if (X11_Xinput_LIB) + list(APPEND glfw_LIBRARIES "${X11_Xinput_LIB}") + else() + # Backwards compatibility (bug in CMake 2.8.7) + list(APPEND glfw_LIBRARIES Xi) + endif() - if (X11_Xinput_LIB) - list(APPEND glfw_LIBRARIES "${X11_Xinput_LIB}") - else() - # Backwards compatibility (bug in CMake 2.8.7) - list(APPEND glfw_LIBRARIES Xi) + set(_GLFW_HAS_XINPUT TRUE) endif() - list(APPEND glfw_PKG_DEPS "xi") # Check for Xf86VidMode (fallback gamma control) - if (NOT X11_xf86vmode_FOUND) - message(FATAL_ERROR "The Xf86VidMode library and headers were not found") - endif() + if (X11_xf86vmode_FOUND) + list(APPEND glfw_INCLUDE_DIRS "${X11_xf86vmode_INCLUDE_PATH}") + list(APPEND glfw_PKG_DEPS "xxf86vm") - list(APPEND glfw_INCLUDE_DIRS "${X11_xf86vmode_INCLUDE_PATH}") - list(APPEND glfw_PKG_DEPS "xxf86vm") + if (X11_Xxf86vm_LIB) + list(APPEND glfw_LIBRARIES "${X11_Xxf86vm_LIB}") + else() + # Backwards compatibility (see CMake bug 0006976) + list(APPEND glfw_LIBRARIES Xxf86vm) + endif() - if (X11_Xxf86vm_LIB) - list(APPEND glfw_LIBRARIES "${X11_Xxf86vm_LIB}") - else() - # Backwards compatibility (see CMake bug 0006976) - list(APPEND glfw_LIBRARIES Xxf86vm) + set(_GLFW_HAS_XF86VM TRUE) endif() # Check for Xkb (X keyboard extension) diff --git a/extern/glfw/README.md b/extern/glfw/README.md index 91b3ae5..338b349 100644 --- a/extern/glfw/README.md +++ b/extern/glfw/README.md @@ -6,10 +6,8 @@ GLFW is a free, Open Source, multi-platform library for OpenGL and OpenGL ES application development. It provides a simple, platform-independent API for creating windows and contexts, reading input, handling events, etc. -Version 3.1 adds improved documentation, support for custom system cursors, file -drop events, main thread wake-up, window frame size retrieval, floating windows, -character input with modifier keys, single buffered windows, build improvements -and fixes for a large number of bugs. +Version 3.1.1 adds fixes for a number of bugs that together affect all supported +platforms, most notably workarounds for bugs in some popular window managers. If you are new to GLFW, you may find the [introductory tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW @@ -65,110 +63,26 @@ GLFW bundles a number of dependencies in the `deps/` directory. ## Changelog - - Added `GLFWcursor` custom system cursor handle - - Added `glfwCreateCursor`, `glfwCreateStandardCursor`, `glfwDestroyCursor` and - `glfwSetCursor` for managing system cursor images - - Added `GLFWimage` struct for passing 32-bit RGBA images - - Added monitor and adapter identifier access to native API - - Added `glfwSetDropCallback` and `GLFWdropfun` for receiving dropped files - - Added `glfwPostEmptyEvent` for allowing secondary threads to cause - `glfwWaitEvents` to return - - Added `empty` test program for verifying posting of empty events - - Added `glfwSetCharModsCallback` for receiving character events with modifiers - - Added `glfwGetWindowFrameSize` for retrieving the size of the frame around - the client area of a window - - Added `GLFW_AUTO_ICONIFY` for controlling whether full screen windows - automatically iconify (and restore the previous video mode) on focus loss - - Added `GLFW_DONT_CARE` for indicating that any value is acceptable - - Added `GLFW_DOUBLEBUFFER` for controlling whether to use double buffering - - Added `GLFW_CONTEXT_RELEASE_BEHAVIOR` and values - `GLFW_ANY_RELEASE_BEHAVIOR`, `GLFW_RELEASE_BEHAVIOR_FLUSH` and - `GLFW_RELEASE_BEHAVIOR_NONE` for `GL_KHR_context_flush_control` support - - Added `GLFW_INCLUDE_ES31` for including the OpenGL ES 3.1 header - - Added `GLFW_FLOATING` for creating always-on-top windowed mode windows - - Added `GLFW_FOCUSED` window hint for controlling initial input focus - - Added *partial and experimental* support for Wayland - - Added *partial and experimental* support for Mir - - Changed the window state attributes (focused, iconified and visible) to query - the system directly - - Changed the default of `GLFW_REFRESH_RATE` to `GLFW_DONT_CARE` to maintain - the default behavior - - Changed static library to build as position independent code for easier use - from the Rust language - - Changed `glfwGetCursorPos` to query the system directly for all cursor modes - except captured mode - - Bugfix: The debug context attribute was set from `GL_ARB_debug_output` even - when a debug context had not been requested - - Bugfix: The particles example was not linked against the threading library - - Bugfix: The cursor was not positioned over newly created full screen windows - - Bugfix: The queried cursor position was not always up-to-date - - Bugfix: `glfwExtensionSupported` always failed for OpenGL ES 3.0 and later if - the library was compiled for OpenGL ES - - [Cocoa] Added `_GLFW_USE_RETINA` to control whether windows will use the full - resolution on Retina displays - - [Cocoa] Made content view subclass of `NSOpenGLView` - - [Cocoa] Bugfix: Using a 1x1 cursor for hidden mode caused some screen - recorders to fail - - [Cocoa] Bugfix: Some Core Foundation objects were leaked during joystick - enumeration and termination - - [Cocoa] Bugfix: One copy of each display name string was leaked - - [Cocoa] Bugfix: Monitor enumeration caused a segfault if no `NSScreen` was - found for a given `CGDisplay` - - [Cocoa] Bugfix: Modifier key events were lost if the corresponding modifier - bit field was unchanged - - [Cocoa] Bugfix: Joystick enumeration took hundreds of ms on some systems - - [Cocoa] Bugfix: The cursor was hidden when the user resized a GLFW window - - [Cocoa] Bugfix: The 10.10 Yosemite OpenGL 4.1 profile token was not used - - [Cocoa] Bugfix: The generic software OpenGL renderer could be selected under - certain conditions - - [Cocoa] Bugfix: The virtual cursor jumped unpredictably when entering - disabled cursor mode - - [Win32] Enabled generation of pkg-config file for MinGW - - [Win32] Removed option to require explicitly linking against `winmm.dll` - - [Win32] Bugfix: Failure to load winmm or its functions was not reported to - the error callback - - [Win32] Bugfix: Some keys were reported based on the current layout instead - of their physical location - - [Win32] Bugfix: Maximized hidden windows were restored by `glfwShowWindow` - - [Win32] Bugfix: Context re-creation was not triggered by sRGB hint - - [Win32] Bugfix: Full screen windows were incorrectly sized and placed on some - systems - - [Win32] Bugfix: Gamma ramp functions acted on entire desktop instead of the - specified monitor - - [Win32] Bugfix: The wrong incorrect physical size was returned for - non-primary monitors - - [Win32] Bugfix: X-axis scroll offsets were inverted - - [Win32] Bugfix: The Optimus HPG forcing variable was not correctly exported - - [Win32] Bugfix: The iconified window state attribute was not always updated - - [Win32] Bugfix: Previously focused windows with disabled cursor mode and that - had been iconified by Win+D were not visible when restored - - [Win32] Bugfix: The virtual cursor jumped unpredictably when entering - disabled cursor mode - - [X11] Added run-time support for systems lacking the XKB extension - - [X11] Made GLX 1.3 the minimum supported version - - [X11] Replaced `XRRGetScreenResources` with `XRRGetScreenResourcesCurrent` - for monitor property retrieval - - [X11] Bugfix: The case of finding no usable CRTCs was not detected - - [X11] Bugfix: Detection of broken Nvidia RandR gamma support did not verify - that at least one CRTC was present - - [X11] Bugfix: A stale `_NET_SUPPORTING_WM_CHECK` root window property would - cause an uncaught `BadWindow` error - - [X11] Bugfix: No check was made for the presence of GLX 1.3 when - `GLX_SGIX_fbconfig` was unavailable - - [X11] Bugfix: The message type of ICCCM protocol events was not checked - - [X11] Bugfix: `glfwDestroyWindow` did not flush the output buffer - - [X11] Bugfix: Window frame interactions were reported as focus events - - [X11] Bugfix: Workaround for legacy Compiz caused flickering during resize - - [X11] Bugfix: The name pointer of joysticks were not cleared on disconnection - - [X11] Bugfix: Video mode resolutions and monitor physical sizes were not - corrected for rotated CRTCs - - [X11] Bugfix: Unicode character input ignored dead keys - - [X11] Bugfix: X-axis scroll offsets were inverted - - [X11] Bugfix: Full screen override redirect windows were not always - positioned over the specified monitor - - [X11] Bugfix: Character input did not work for the default `"C"` locale - - [X11] Bugfix: Joysticks connected after `glfwInit` were not detected - (temporary inotify solution until proper libudev solution) + - Made library compilation fail if any header option macros are defined + - Removed support for LCC and Borland C++ + - Bugfix: `glfwSetTime` silently accepted invalid values + - [Cocoa] Bugfix: `NSHighResolutionCapable` was not enabled for test and + example programs + - [Cocoa] Bugfix: Sleeping monitors were not included in the monitor list + - [Cocoa] Bugfix: `glfwSetWindowSize` did not change the video mode for full + screen windows + - [X11] Added support for Cygwin-X + - [X11] Made XInput2 optional at compile-time + - [X11] Made Xxf86vm optional at compile-time + - [X11] Bugfix: Moved `_NET_REQUEST_FRAME_EXTENTS` request to + `glfwGetWindowFrameSize` and added protocol-breaking timeout + as a workaround for broken support in Unity, Fluxbox and Xfwm + - [X11] Bugfix: Mouse button `GLFW_MOUSE_BUTTON_4` was never used + - [X11] Bugfix: `glfwTerminate` could close an unrelated file descriptor + - [X11] Bugfix: Some WMs (KWM, Fluxbox) did not respect cursor redefinition + - [WGL] Bugfix: The context flags debug bit was not set for OpenGL ES + - [GLX] Bugfix: The context flags debug bit was not set for OpenGL ES + - [EGL] Bugfix: The context flags debug bit was not set for OpenGL ES ## Contact @@ -216,6 +130,7 @@ skills. - Michael Dickens - Jonathan Dummer - Ralph Eastwood + - Siavash Eliasi - Michael Fogleman - Gerald Franz - GeO4d @@ -241,8 +156,10 @@ skills. - Hans Mackowiak - Kyle McDonald - David Medlock + - Bryce Mehring - Jonathan Mercier - Marcel Metz + - Jonathan Miller - Kenneth Miller - Bruce Mitchener - Jack Moffitt @@ -260,6 +177,7 @@ skills. - Pieroman - Jorge Rodriguez - Ed Ropple + - Aleksey Rybalkin - Riku Salminen - Brandon Schaefer - Sebastian Schuberth @@ -276,6 +194,7 @@ skills. - Nathan Sweet - TTK-Bandit - Sergey Tikhomirov + - A. Tombs - Samuli Tuomola - urraka - Jari Vetoniemi diff --git a/extern/glfw/deps/glad.c b/extern/glfw/deps/glad.c index da75d08..e5b643f 100644 --- a/extern/glfw/deps/glad.c +++ b/extern/glfw/deps/glad.c @@ -1,3 +1,4 @@ +#include #include #include @@ -687,10 +688,34 @@ static void find_extensionsGL(void) { } static void find_coreGL(void) { - const char *v = (const char *)glGetString(GL_VERSION); - int major = v[0] - '0'; - int minor = v[2] - '0'; - GLVersion.major = major; GLVersion.minor = minor; + + /* Thank you @elmindreda + * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 + * https://github.com/glfw/glfw/blob/master/src/context.c#L36 + */ + int i, major, minor; + + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + NULL + }; + + version = (const char*) glGetString(GL_VERSION); + if (!version) return; + + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + + sscanf(version, "%d.%d", &major, &minor); + GLVersion.major = major; GLVersion.minor = minor; GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; @@ -704,10 +729,11 @@ static void find_coreGL(void) { GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; } -void gladLoadGLLoader(GLADloadproc load) { +int gladLoadGLLoader(GLADloadproc load) { GLVersion.major = 0; GLVersion.minor = 0; glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); - if(glGetString == NULL) return; + if(glGetString == NULL) return 0; + if(glGetString(GL_VERSION) == NULL) return 0; find_coreGL(); load_GL_VERSION_1_0(load); load_GL_VERSION_1_1(load); @@ -722,7 +748,6 @@ void gladLoadGLLoader(GLADloadproc load) { load_GL_VERSION_3_2(load); find_extensionsGL(); - - return; + return GLVersion.major != 0 || GLVersion.minor != 0; } diff --git a/extern/glfw/deps/glad/glad.h b/extern/glfw/deps/glad/glad.h index e5de4ef..8ede052 100644 --- a/extern/glfw/deps/glad/glad.h +++ b/extern/glfw/deps/glad/glad.h @@ -22,15 +22,17 @@ #define APIENTRYP APIENTRY * #endif -extern struct gladGLversionStruct { - int major; - int minor; -} GLVersion; - #ifdef __cplusplus extern "C" { #endif +struct gladGLversionStruct { + int major; + int minor; +}; + +extern struct gladGLversionStruct GLVersion; + typedef void* (* GLADloadproc)(const char *name); #ifndef GLAPI @@ -58,7 +60,7 @@ typedef void* (* GLADloadproc)(const char *name); # define GLAPI extern # endif #endif -GLAPI void gladLoadGLLoader(GLADloadproc); +GLAPI int gladLoadGLLoader(GLADloadproc); #include #include @@ -836,11 +838,13 @@ typedef GLintptr GLvdpauSurfaceNV; #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 @@ -859,6 +863,7 @@ typedef GLintptr GLvdpauSurfaceNV; #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFF #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 diff --git a/extern/glfw/examples/CMakeLists.txt b/extern/glfw/examples/CMakeLists.txt index 229c4a7..1232279 100644 --- a/extern/glfw/examples/CMakeLists.txt +++ b/extern/glfw/examples/CMakeLists.txt @@ -41,7 +41,9 @@ if (APPLE) set_target_properties(Wave PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Wave") set_target_properties(Boing Gears Heightmap Particles Simple SplitView Wave PROPERTIES - FOLDER "GLFW3/Examples") + FOLDER "GLFW3/Examples" + MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/AppleInfo.plist") + else() # Set boring names for executables add_executable(boing WIN32 boing.c) diff --git a/extern/glfw/examples/splitview.c b/extern/glfw/examples/splitview.c index 30b093b..1ffcda6 100644 --- a/extern/glfw/examples/splitview.c +++ b/extern/glfw/examples/splitview.c @@ -371,7 +371,9 @@ static void framebufferSizeFun(GLFWwindow* window, int w, int h) static void windowRefreshFun(GLFWwindow* window) { - do_redraw = 1; + drawAllViews(); + glfwSwapBuffers(window); + do_redraw = 0; } @@ -485,15 +487,7 @@ int main(void) { // Only redraw if we need to if (do_redraw) - { - // Draw all views - drawAllViews(); - - // Swap buffers - glfwSwapBuffers(window); - - do_redraw = 0; - } + windowRefreshFun(window); // Wait for new events glfwWaitEvents(); diff --git a/extern/glfw/include/GLFW/glfw3.h b/extern/glfw/include/GLFW/glfw3.h index 8941449..009fa75 100644 --- a/extern/glfw/include/GLFW/glfw3.h +++ b/extern/glfw/include/GLFW/glfw3.h @@ -68,28 +68,17 @@ extern "C" { /************************************************************************* - * Global definitions + * Compiler- and platform-specific preprocessor work *************************************************************************/ -/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ - -/* Please report any problems that you find with your compiler, which may - * be solved in this section! There are several compilers that I have not - * been able to test this file with yet. - * - * First: If we are we on Windows, we want a single define for it (_WIN32) - * (Note: For Cygwin the compiler flag -mwin32 should be used, but to - * make sure that things run smoothly for Cygwin users, we add __CYGWIN__ - * to the list of "valid Win32 identifiers", which removes the need for - * -mwin32) +/* If we are we on Windows, we want a single define for it. */ -#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)) +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) #define _WIN32 #endif /* _WIN32 */ -/* In order for extension support to be portable, we need to define an - * OpenGL function call method. We use the keyword APIENTRY, which is - * defined for Win32. (Note: Windows also needs this for ) +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. */ #ifndef APIENTRY #ifdef _WIN32 @@ -99,44 +88,23 @@ extern "C" { #endif #endif /* APIENTRY */ -/* The following three defines are here solely to make some Windows-based - * files happy. Theoretically we could include , but - * it has the major drawback of severely polluting our namespace. +/* Some Windows OpenGL headers need this. */ - -/* Under Windows, we need WINGDIAPI defined */ #if !defined(WINGDIAPI) && defined(_WIN32) - #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__) - /* Microsoft Visual C++, Borland C++ Builder and Pelles C */ - #define WINGDIAPI __declspec(dllimport) - #elif defined(__LCC__) - /* LCC-Win32 */ - #define WINGDIAPI __stdcall - #else - /* Others (e.g. MinGW, Cygwin) */ - #define WINGDIAPI extern - #endif + #define WINGDIAPI __declspec(dllimport) #define GLFW_WINGDIAPI_DEFINED #endif /* WINGDIAPI */ -/* Some files also need CALLBACK defined */ +/* Some Windows GLU headers need this. + */ #if !defined(CALLBACK) && defined(_WIN32) - #if defined(_MSC_VER) - /* Microsoft Visual C++ */ - #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) - #define CALLBACK __stdcall - #else - #define CALLBACK - #endif - #else - /* Other Windows compilers */ - #define CALLBACK __stdcall - #endif + #define CALLBACK __stdcall #define GLFW_CALLBACK_DEFINED #endif /* CALLBACK */ -/* Most GL/glu.h variants on Windows need wchar_t - * OpenGL/gl.h blocks the definition of ptrdiff_t by glext.h on OS X */ +/* Most Windows GLU headers need wchar_t. + * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. + */ #if !defined(GLFW_INCLUDE_NONE) #include #endif @@ -197,7 +165,7 @@ extern "C" { * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW * configuration header when compiling the DLL version of the library. */ - #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" + #error "You may not have both GLFW_DLL and _GLFW_BUILD_DLL defined" #endif /* GLFWAPI is used to declare public API functions for export @@ -208,11 +176,7 @@ extern "C" { #define GLFWAPI __declspec(dllexport) #elif defined(_WIN32) && defined(GLFW_DLL) /* We are calling GLFW as a Win32 DLL */ - #if defined(__LCC__) - #define GLFWAPI extern - #else - #define GLFWAPI __declspec(dllimport) - #endif + #define GLFWAPI __declspec(dllimport) #elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) /* We are building GLFW as a shared / dynamic library */ #define GLFWAPI __attribute__((visibility("default"))) @@ -221,8 +185,6 @@ extern "C" { #define GLFWAPI #endif -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - /************************************************************************* * GLFW API tokens @@ -249,7 +211,7 @@ extern "C" { * API changes. * @ingroup init */ -#define GLFW_VERSION_REVISION 0 +#define GLFW_VERSION_REVISION 1 /*! @} */ /*! @name Key and button actions @@ -558,7 +520,9 @@ extern "C" { /*! @brief GLFW could not find support for the requested client API on the * system. * - * GLFW could not find support for the requested client API on the system. + * GLFW could not find support for the requested client API on the system. If + * emitted by functions other than @ref glfwCreateWindow, no supported client + * API was found. * * @par Analysis * The installed graphics driver does not support the requested client API, or @@ -575,8 +539,8 @@ extern "C" { #define GLFW_API_UNAVAILABLE 0x00010006 /*! @brief The requested OpenGL or OpenGL ES version is not available. * - * The requested OpenGL or OpenGL ES version (including any requested profile - * or context option) is not available on this machine. + * The requested OpenGL or OpenGL ES version (including any requested context + * or framebuffer hints) is not available on this machine. * * @par Analysis * The machine does not support your requirements. If your application is @@ -598,7 +562,8 @@ extern "C" { * specific categories. * * @par Analysis - * A bug in GLFW or the underlying operating system. Report the bug to our + * A bug or configuration error in GLFW, the underlying operating system or + * its drivers, or a lack of required resources. Report the issue to our * [issue tracker](https://github.com/glfw/glfw/issues). */ #define GLFW_PLATFORM_ERROR 0x00010008 @@ -988,7 +953,7 @@ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); * * @param[in] window The window that received the event. * @param[in] count The number of dropped files. - * @param[in] names The UTF-8 encoded path names of the dropped files. + * @param[in] paths The UTF-8 encoded file and/or directory path names. * * @sa glfwSetDropCallback * @@ -1462,7 +1427,8 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); /*! @brief Generates a gamma ramp and sets it for the specified monitor. * * This function generates a 256-element gamma ramp from the specified exponent - * and then calls @ref glfwSetGammaRamp with it. + * and then calls @ref glfwSetGammaRamp with it. The value must be a finite + * number greater than zero. * * @param[in] monitor The monitor whose gamma ramp to set. * @param[in] gamma The desired exponent. @@ -1512,7 +1478,10 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); * @param[in] monitor The monitor whose gamma ramp to set. * @param[in] ramp The gamma ramp to use. * - * @note Gamma ramp sizes other than 256 are not supported by all hardware. + * @remarks Gamma ramp sizes other than 256 are not supported by all platforms + * or graphics hardware. + * + * @remarks __Windows:__ The gamma ramp size must be 256. * * @par Pointer Lifetime * The specified gamma ramp is copied before this function returns. @@ -1648,6 +1617,13 @@ GLFWAPI void glfwWindowHint(int target, int hint); * The menu bar can be disabled with a * [compile-time option](@ref compile_options_osx). * + * @remarks __OS X:__ On OS X 10.10 and later the window frame will not be + * rendered at full resolution on Retina displays unless the + * `NSHighResolutionCapable` key is enabled in the application bundle's + * `Info.plist`. For more information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. + * * @remarks __X11:__ There is no mechanism for setting the window icon yet. * * @remarks __X11:__ Some window managers will not respect the placement of @@ -3136,10 +3112,15 @@ GLFWAPI double glfwGetTime(void); /*! @brief Sets the GLFW timer. * * This function sets the value of the GLFW timer. It then continues to count - * up from that value. + * up from that value. The value must be a positive finite number less than + * or equal to 18446744073.0, which is approximately 584.5 years. * * @param[in] time The new value, in seconds. * + * @remarks The upper limit of the timer is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * * @par Thread Safety * This function may only be called from the main thread. * @@ -3243,14 +3224,14 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* window); * @param[in] interval The minimum number of screen updates to wait for * until the buffers are swapped by @ref glfwSwapBuffers. * - * @note This function is not called during window creation, leaving the swap - * interval set to whatever is the default on that platform. This is done + * @remarks This function is not called during context creation, leaving the + * swap interval set to whatever is the default on that platform. This is done * because some swap interval extensions used by GLFW do not allow the swap * interval to be reset to zero once it has been set to a non-zero value. * - * @note Some GPU drivers do not honor the requested swap interval, either - * because of user settings that override the request or due to bugs in the - * driver. + * @remarks Some GPU drivers do not honor the requested swap interval, either + * because of a user setting that overrides the application's request or due to + * bugs in the driver. * * @par Thread Safety * This function may be called from any thread. @@ -3267,9 +3248,9 @@ GLFWAPI void glfwSwapInterval(int interval); /*! @brief Returns whether the specified extension is available. * * This function returns whether the specified - * [API extension](@ref context_glext) is supported by the current OpenGL or - * OpenGL ES context. It searches both for OpenGL and OpenGL ES extension and - * platform-specific context creation API extensions. + * [client API extension](@ref context_glext) is supported by the current + * OpenGL or OpenGL ES context. It searches both for OpenGL and OpenGL ES + * extension and platform-specific context creation API extensions. * * A context must be current on the calling thread. Calling this function * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. @@ -3298,7 +3279,7 @@ GLFWAPI int glfwExtensionSupported(const char* extension); * context. * * This function returns the address of the specified - * [client API or extension function](@ref context_glext), if it is supported + * [core or extension function](@ref context_glext), if it is supported * by the current context. * * A context must be current on the calling thread. Calling this function @@ -3308,9 +3289,13 @@ GLFWAPI int glfwExtensionSupported(const char* extension); * @return The address of the function, or `NULL` if the function is * unavailable or an [error](@ref error_handling) occurred. * - * @note The addresses of a given function is not guaranteed to be the same + * @remarks The addresses of a given function is not guaranteed to be the same * between contexts. * + * @remarks This function may return a non-`NULL` address despite the + * associated version or extension not being available. Always check the + * context version or extension string presence first. + * * @par Pointer Lifetime * The returned function pointer is valid until the context is destroyed or the * library is terminated. diff --git a/extern/glfw/src/cocoa_monitor.m b/extern/glfw/src/cocoa_monitor.m index d518973..f75347d 100644 --- a/extern/glfw/src/cocoa_monitor.m +++ b/extern/glfw/src/cocoa_monitor.m @@ -57,7 +57,8 @@ static char* getDisplayName(CGDirectDisplayID displayID) (const void**) &value)) { // This may happen if a desktop Mac is running headless - _glfwInputError(GLFW_PLATFORM_ERROR, "Failed to retrieve display name"); + _glfwInputError(GLFW_PLATFORM_ERROR, + "Cocoa: Failed to retrieve display name"); CFRelease(info); return strdup("Unknown"); @@ -263,9 +264,6 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) { int j; - if (CGDisplayIsAsleep(displays[i])) - continue; - CGDirectDisplayID screenDisplayID = CGDisplayMirrorsDisplay(displays[i]); if (screenDisplayID == kCGNullDirectDisplay) screenDisplayID = displays[i]; diff --git a/extern/glfw/src/cocoa_window.m b/extern/glfw/src/cocoa_window.m index 9d182f4..b5bb466 100644 --- a/extern/glfw/src/cocoa_window.m +++ b/extern/glfw/src/cocoa_window.m @@ -592,17 +592,17 @@ static int translateKey(unsigned int key) if (count) { NSEnumerator* e = [files objectEnumerator]; - char** names = calloc(count, sizeof(char*)); + char** paths = calloc(count, sizeof(char*)); int i; for (i = 0; i < count; i++) - names[i] = strdup([[e nextObject] UTF8String]); + paths[i] = strdup([[e nextObject] UTF8String]); - _glfwInputDrop(window, count, (const char**) names); + _glfwInputDrop(window, count, (const char**) paths); for (i = 0; i < count; i++) - free(names[i]); - free(names); + free(paths[i]); + free(paths); } return YES; @@ -990,7 +990,10 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height) void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) { - [window->ns.object setContentSize:NSMakeSize(width, height)]; + if (window->monitor) + enterFullscreenMode(window); + else + [window->ns.object setContentSize:NSMakeSize(width, height)]; } void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height) @@ -1208,7 +1211,8 @@ int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape) cursor->ns.object = getStandardCursor(shape); if (!cursor->ns.object) { - _glfwInputError(GLFW_INVALID_ENUM, "Cocoa: Invalid standard cursor"); + _glfwInputError(GLFW_PLATFORM_ERROR, + "Cocoa: Failed to retrieve standard cursor"); return GL_FALSE; } @@ -1252,7 +1256,8 @@ const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) if (![[pasteboard types] containsObject:NSStringPboardType]) { - _glfwInputError(GLFW_FORMAT_UNAVAILABLE, NULL); + _glfwInputError(GLFW_FORMAT_UNAVAILABLE, + "Cocoa: Failed to retrieve string from pasteboard"); return NULL; } diff --git a/extern/glfw/src/context.c b/extern/glfw/src/context.c index f8b8008..bf53410 100644 --- a/extern/glfw/src/context.c +++ b/extern/glfw/src/context.c @@ -89,7 +89,7 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) if (ctxconfig->api != GLFW_OPENGL_API && ctxconfig->api != GLFW_OPENGL_ES_API) { - _glfwInputError(GLFW_INVALID_ENUM, "Invalid client API requested"); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid client API"); return GL_FALSE; } @@ -104,16 +104,13 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) // OpenGL 1.x series ended with version 1.5 // OpenGL 2.x series ended with version 2.1 // OpenGL 3.x series ended with version 3.3 + // For now, let everything else through _glfwInputError(GLFW_INVALID_VALUE, - "Invalid OpenGL version %i.%i requested", + "Invalid OpenGL version %i.%i", ctxconfig->major, ctxconfig->minor); return GL_FALSE; } - else - { - // For now, let everything else through - } if (ctxconfig->profile) { @@ -121,7 +118,7 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) ctxconfig->profile != GLFW_OPENGL_COMPAT_PROFILE) { _glfwInputError(GLFW_INVALID_ENUM, - "Invalid OpenGL profile requested"); + "Invalid OpenGL profile"); return GL_FALSE; } @@ -132,8 +129,7 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) // and above _glfwInputError(GLFW_INVALID_VALUE, - "Context profiles only exist for " - "OpenGL version 3.2 and above"); + "Context profiles are only defined for OpenGL version 3.2 and above"); return GL_FALSE; } } @@ -142,8 +138,7 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) { // Forward-compatible contexts are only defined for OpenGL version 3.0 and above _glfwInputError(GLFW_INVALID_VALUE, - "Forward compatibility only exist for OpenGL " - "version 3.0 and above"); + "Forward-compatibility is only defined for OpenGL version 3.0 and above"); return GL_FALSE; } } @@ -156,30 +151,11 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) // OpenGL ES 1.0 is the smallest valid version // OpenGL ES 1.x series ended with version 1.1 // OpenGL ES 2.x series ended with version 2.0 - - _glfwInputError(GLFW_INVALID_VALUE, - "Invalid OpenGL ES version %i.%i requested", - ctxconfig->major, ctxconfig->minor); - return GL_FALSE; - } - else - { // For now, let everything else through - } - if (ctxconfig->profile) - { - // OpenGL ES does not support profiles _glfwInputError(GLFW_INVALID_VALUE, - "Context profiles are not supported by OpenGL ES"); - return GL_FALSE; - } - - if (ctxconfig->forward) - { - // OpenGL ES does not support forward-compatibility - _glfwInputError(GLFW_INVALID_VALUE, - "Forward compatibility is not supported by OpenGL ES"); + "Invalid OpenGL ES version %i.%i", + ctxconfig->major, ctxconfig->minor); return GL_FALSE; } } @@ -189,8 +165,8 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) if (ctxconfig->robustness != GLFW_NO_RESET_NOTIFICATION && ctxconfig->robustness != GLFW_LOSE_CONTEXT_ON_RESET) { - _glfwInputError(GLFW_INVALID_VALUE, - "Invalid context robustness mode requested"); + _glfwInputError(GLFW_INVALID_ENUM, + "Invalid context robustness mode"); return GL_FALSE; } } @@ -200,8 +176,8 @@ GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig) if (ctxconfig->release != GLFW_RELEASE_BEHAVIOR_NONE && ctxconfig->release != GLFW_RELEASE_BEHAVIOR_FLUSH) { - _glfwInputError(GLFW_INVALID_VALUE, - "Invalid context release behavior requested"); + _glfwInputError(GLFW_INVALID_ENUM, + "Invalid context release behavior"); return GL_FALSE; } } diff --git a/extern/glfw/src/egl_context.c b/extern/glfw/src/egl_context.c index e3335a5..b15ca08 100644 --- a/extern/glfw/src/egl_context.c +++ b/extern/glfw/src/egl_context.c @@ -47,33 +47,25 @@ static const char* getErrorString(EGLint error) case EGL_BAD_ALLOC: return "EGL failed to allocate resources for the requested operation"; case EGL_BAD_ATTRIBUTE: - return "An unrecognized attribute or attribute value was passed " - "in the attribute list"; + return "An unrecognized attribute or attribute value was passed in the attribute list"; case EGL_BAD_CONTEXT: - return "An EGLContext argument does not name a valid EGL " - "rendering context"; + return "An EGLContext argument does not name a valid EGL rendering context"; case EGL_BAD_CONFIG: - return "An EGLConfig argument does not name a valid EGL frame " - "buffer configuration"; + return "An EGLConfig argument does not name a valid EGL frame buffer configuration"; case EGL_BAD_CURRENT_SURFACE: - return "The current surface of the calling thread is a window, pixel " - "buffer or pixmap that is no longer valid"; + return "The current surface of the calling thread is a window, pixel buffer or pixmap that is no longer valid"; case EGL_BAD_DISPLAY: - return "An EGLDisplay argument does not name a valid EGL display " - "connection"; + return "An EGLDisplay argument does not name a valid EGL display connection"; case EGL_BAD_SURFACE: - return "An EGLSurface argument does not name a valid surface " - "configured for GL rendering"; + return "An EGLSurface argument does not name a valid surface configured for GL rendering"; case EGL_BAD_MATCH: return "Arguments are inconsistent"; case EGL_BAD_PARAMETER: return "One or more argument values are invalid"; case EGL_BAD_NATIVE_PIXMAP: - return "A NativePixmapType argument does not refer to a valid " - "native pixmap"; + return "A NativePixmapType argument does not refer to a valid native pixmap"; case EGL_BAD_NATIVE_WINDOW: - return "A NativeWindowType argument does not refer to a valid " - "native window"; + return "A NativeWindowType argument does not refer to a valid native window"; case EGL_CONTEXT_LOST: return "The application must destroy all contexts and reinitialise"; } @@ -309,7 +301,7 @@ int _glfwCreateContext(_GLFWwindow* window, { if (!eglBindAPI(EGL_OPENGL_ES_API)) { - _glfwInputError(GLFW_PLATFORM_ERROR, + _glfwInputError(GLFW_API_UNAVAILABLE, "EGL: Failed to bind OpenGL ES: %s", getErrorString(eglGetError())); return GL_FALSE; @@ -319,7 +311,7 @@ int _glfwCreateContext(_GLFWwindow* window, { if (!eglBindAPI(EGL_OPENGL_API)) { - _glfwInputError(GLFW_PLATFORM_ERROR, + _glfwInputError(GLFW_API_UNAVAILABLE, "EGL: Failed to bind OpenGL: %s", getErrorString(eglGetError())); return GL_FALSE; @@ -339,11 +331,11 @@ int _glfwCreateContext(_GLFWwindow* window, if (ctxconfig->forward) flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; - - if (ctxconfig->debug) - flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; } + if (ctxconfig->debug) + flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; + if (ctxconfig->robustness) { if (ctxconfig->robustness == GLFW_NO_RESET_NOTIFICATION) @@ -389,7 +381,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (window->egl.context == EGL_NO_CONTEXT) { - _glfwInputError(GLFW_PLATFORM_ERROR, + _glfwInputError(GLFW_VERSION_UNAVAILABLE, "EGL: Failed to create context: %s", getErrorString(eglGetError())); return GL_FALSE; diff --git a/extern/glfw/src/glfw3.pc b/extern/glfw/src/glfw3.pc index 86d9446..433f34d 100644 --- a/extern/glfw/src/glfw3.pc +++ b/extern/glfw/src/glfw3.pc @@ -5,7 +5,7 @@ libdir=${exec_prefix}/lib Name: GLFW Description: A multi-platform library for OpenGL, window and input -Version: 3.1.0 +Version: 3.1.1 URL: http://www.glfw.org/ Requires.private: x11 xrandr xinerama xi xxf86vm xcursor gl Libs: -L${libdir} -lglfw3 diff --git a/extern/glfw/src/glfw3Config.cmake b/extern/glfw/src/glfw3Config.cmake index 41a1ccc..560f00d 100644 --- a/extern/glfw/src/glfw3Config.cmake +++ b/extern/glfw/src/glfw3Config.cmake @@ -4,7 +4,7 @@ # GLFW3_LIBRARY_DIR, folder in which the GLFW library is located # GLFW3_LIBRARY, library to link against to use GLFW -set(GLFW3_VERSION "3.1.0") +set(GLFW3_VERSION "3.1.1") ####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() ####### diff --git a/extern/glfw/src/glfw3ConfigVersion.cmake b/extern/glfw/src/glfw3ConfigVersion.cmake index 0f38e1d..52e7bf8 100644 --- a/extern/glfw/src/glfw3ConfigVersion.cmake +++ b/extern/glfw/src/glfw3ConfigVersion.cmake @@ -9,16 +9,16 @@ # The variable CVF_VERSION must be set before calling configure_file(). -set(PACKAGE_VERSION "3.1.0") +set(PACKAGE_VERSION "3.1.1") if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() - if("3.1.0" MATCHES "^([0-9]+)\\.") + if("3.1.1" MATCHES "^([0-9]+)\\.") set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") else() - set(CVF_VERSION_MAJOR "3.1.0") + set(CVF_VERSION_MAJOR "3.1.1") endif() if("${PACKAGE_FIND_VERSION_MAJOR}" STREQUAL "${CVF_VERSION_MAJOR}") diff --git a/extern/glfw/src/glfw_config.h b/extern/glfw/src/glfw_config.h index 0512dda..4b4a007 100644 --- a/extern/glfw/src/glfw_config.h +++ b/extern/glfw/src/glfw_config.h @@ -62,6 +62,10 @@ // Define this to 1 to force use of high-performance GPU on Optimus systems /* #undef _GLFW_USE_OPTIMUS_HPG */ +// Define this to 1 if the XInput X11 extension is available +#define _GLFW_HAS_XINPUT +// Define this to 1 if the Xxf86vm X11 extension is available +#define _GLFW_HAS_XF86VM // Define this to 1 if glXGetProcAddress is available #define _GLFW_HAS_GLXGETPROCADDRESS // Define this to 1 if glXGetProcAddressARB is available diff --git a/extern/glfw/src/glfw_config.h.in b/extern/glfw/src/glfw_config.h.in index 485cac5..296c96d 100644 --- a/extern/glfw/src/glfw_config.h.in +++ b/extern/glfw/src/glfw_config.h.in @@ -62,6 +62,10 @@ // Define this to 1 to force use of high-performance GPU on Optimus systems #cmakedefine _GLFW_USE_OPTIMUS_HPG +// Define this to 1 if the XInput X11 extension is available +#cmakedefine _GLFW_HAS_XINPUT +// Define this to 1 if the Xxf86vm X11 extension is available +#cmakedefine _GLFW_HAS_XF86VM // Define this to 1 if glXGetProcAddress is available #cmakedefine _GLFW_HAS_GLXGETPROCADDRESS // Define this to 1 if glXGetProcAddressARB is available diff --git a/extern/glfw/src/glx_context.c b/extern/glfw/src/glx_context.c index 562abf7..ec34e8f 100644 --- a/extern/glfw/src/glx_context.c +++ b/extern/glfw/src/glx_context.c @@ -175,7 +175,7 @@ int _glfwInitContextAPI(void) _glfw.glx.libGL = dlopen("libGL.so.1", RTLD_LAZY | RTLD_GLOBAL); if (!_glfw.glx.libGL) { - _glfwInputError(GLFW_PLATFORM_ERROR, "GLX: Failed to find libGL"); + _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: Failed to find libGL"); return GL_FALSE; } #endif @@ -320,8 +320,7 @@ int _glfwCreateContext(_GLFWwindow* window, !_glfw.glx.EXT_create_context_es2_profile) { _glfwInputError(GLFW_API_UNAVAILABLE, - "GLX: OpenGL ES requested but " - "GLX_EXT_create_context_es2_profile is unavailable"); + "GLX: OpenGL ES requested but GLX_EXT_create_context_es2_profile is unavailable"); return GL_FALSE; } } @@ -331,8 +330,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (!_glfw.glx.ARB_create_context) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "GLX: Forward compatibility requested but " - "GLX_ARB_create_context_profile is unavailable"); + "GLX: Forward compatibility requested but GLX_ARB_create_context_profile is unavailable"); return GL_FALSE; } } @@ -343,8 +341,7 @@ int _glfwCreateContext(_GLFWwindow* window, !_glfw.glx.ARB_create_context_profile) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "GLX: An OpenGL profile requested but " - "GLX_ARB_create_context_profile is unavailable"); + "GLX: An OpenGL profile requested but GLX_ARB_create_context_profile is unavailable"); return GL_FALSE; } } @@ -360,9 +357,6 @@ int _glfwCreateContext(_GLFWwindow* window, if (ctxconfig->forward) flags |= GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; - if (ctxconfig->debug) - flags |= GLX_CONTEXT_DEBUG_BIT_ARB; - if (ctxconfig->profile) { if (ctxconfig->profile == GLFW_OPENGL_CORE_PROFILE) @@ -374,6 +368,9 @@ int _glfwCreateContext(_GLFWwindow* window, else mask |= GLX_CONTEXT_ES2_PROFILE_BIT_EXT; + if (ctxconfig->debug) + flags |= GLX_CONTEXT_DEBUG_BIT_ARB; + if (ctxconfig->robustness) { if (_glfw.glx.ARB_create_context_robustness) @@ -454,7 +451,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (!window->glx.context) { - _glfwInputXError(GLFW_PLATFORM_ERROR, "GLX: Failed to create context"); + _glfwInputXError(GLFW_VERSION_UNAVAILABLE, "GLX: Failed to create context"); return GL_FALSE; } diff --git a/extern/glfw/src/input.c b/extern/glfw/src/input.c index 74a715c..e899e71 100644 --- a/extern/glfw/src/input.c +++ b/extern/glfw/src/input.c @@ -46,7 +46,7 @@ static void setCursorMode(_GLFWwindow* window, int newMode) newMode != GLFW_CURSOR_HIDDEN && newMode != GLFW_CURSOR_DISABLED) { - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid cursor mode"); return; } @@ -216,10 +216,10 @@ void _glfwInputCursorEnter(_GLFWwindow* window, int entered) window->callbacks.cursorEnter((GLFWwindow*) window, entered); } -void _glfwInputDrop(_GLFWwindow* window, int count, const char** names) +void _glfwInputDrop(_GLFWwindow* window, int count, const char** paths) { if (window->callbacks.drop) - window->callbacks.drop((GLFWwindow*) window, count, names); + window->callbacks.drop((GLFWwindow*) window, count, paths); } @@ -242,7 +242,7 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* handle, int mode) case GLFW_STICKY_MOUSE_BUTTONS: return window->stickyMouseButtons; default: - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode"); return 0; } } @@ -265,7 +265,7 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value) setStickyMouseButtons(window, value ? GL_TRUE : GL_FALSE); break; default: - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode"); break; } } @@ -278,7 +278,7 @@ GLFWAPI int glfwGetKey(GLFWwindow* handle, int key) if (key < 0 || key > GLFW_KEY_LAST) { - _glfwInputError(GLFW_INVALID_ENUM, "The specified key is invalid"); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid key"); return GLFW_RELEASE; } @@ -301,7 +301,7 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* handle, int button) if (button < 0 || button > GLFW_MOUSE_BUTTON_LAST) { _glfwInputError(GLFW_INVALID_ENUM, - "The specified mouse button is invalid"); + "Invalid mouse button"); return GLFW_RELEASE; } @@ -384,6 +384,17 @@ GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape) _GLFW_REQUIRE_INIT_OR_RETURN(NULL); + if (shape != GLFW_ARROW_CURSOR && + shape != GLFW_IBEAM_CURSOR && + shape != GLFW_CROSSHAIR_CURSOR && + shape != GLFW_HAND_CURSOR && + shape != GLFW_HRESIZE_CURSOR && + shape != GLFW_VRESIZE_CURSOR) + { + _glfwInputError(GLFW_INVALID_ENUM, "Invalid standard cursor"); + return NULL; + } + cursor = calloc(1, sizeof(_GLFWcursor)); cursor->next = _glfw.cursorListHead; _glfw.cursorListHead = cursor; @@ -518,7 +529,7 @@ GLFWAPI int glfwJoystickPresent(int joy) if (joy < 0 || joy > GLFW_JOYSTICK_LAST) { - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid joystick"); return 0; } @@ -533,7 +544,7 @@ GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count) if (joy < 0 || joy > GLFW_JOYSTICK_LAST) { - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid joystick"); return NULL; } @@ -548,7 +559,7 @@ GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count) if (joy < 0 || joy > GLFW_JOYSTICK_LAST) { - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid joystick"); return NULL; } @@ -561,7 +572,7 @@ GLFWAPI const char* glfwGetJoystickName(int joy) if (joy < 0 || joy > GLFW_JOYSTICK_LAST) { - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid joystick"); return NULL; } @@ -591,6 +602,13 @@ GLFWAPI double glfwGetTime(void) GLFWAPI void glfwSetTime(double time) { _GLFW_REQUIRE_INIT(); + + if (time != time || time < 0.0 || time > 18446744073.0) + { + _glfwInputError(GLFW_INVALID_VALUE, "Invalid time"); + return; + } + _glfwPlatformSetTime(time); } diff --git a/extern/glfw/src/internal.h b/extern/glfw/src/internal.h index 1e6977f..55a87f8 100644 --- a/extern/glfw/src/internal.h +++ b/extern/glfw/src/internal.h @@ -33,7 +33,18 @@ #include "glfw_config.h" #endif -#define _GLFW_VERSION_NUMBER "3.1.0" +#define _GLFW_VERSION_NUMBER "3.1.1" + +#if defined(GLFW_INCLUDE_GLCOREARB) || \ + defined(GLFW_INCLUDE_ES1) || \ + defined(GLFW_INCLUDE_ES2) || \ + defined(GLFW_INCLUDE_ES3) || \ + defined(GLFW_INCLUDE_NONE) || \ + defined(GLFW_INCLUDE_GLEXT) || \ + defined(GLFW_INCLUDE_GLU) || \ + defined(GLFW_DLL) + #error "You may not define any header option macros when compiling GLFW" +#endif #if defined(_GLFW_USE_OPENGL) // This is the default for glfw3.h diff --git a/extern/glfw/src/linux_joystick.c b/extern/glfw/src/linux_joystick.c index 5f46519..5a9d8e2 100644 --- a/extern/glfw/src/linux_joystick.c +++ b/extern/glfw/src/linux_joystick.c @@ -277,11 +277,13 @@ void _glfwTerminateJoysticks(void) regfree(&_glfw.linux_js.regex); - if (_glfw.linux_js.watch > 0) - close(_glfw.linux_js.watch); - if (_glfw.linux_js.inotify > 0) + { + if (_glfw.linux_js.watch > 0) + inotify_rm_watch(_glfw.linux_js.inotify, _glfw.linux_js.watch); + close(_glfw.linux_js.inotify); + } #endif // __linux__ } diff --git a/extern/glfw/src/mir_init.c b/extern/glfw/src/mir_init.c index a3c8de9..7f19b60 100644 --- a/extern/glfw/src/mir_init.c +++ b/extern/glfw/src/mir_init.c @@ -65,7 +65,7 @@ int _glfwPlatformInit(void) if (error) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Failed to create event mutex: %s\n", + "Mir: Failed to create event mutex: %s", strerror(error)); return GL_FALSE; } diff --git a/extern/glfw/src/mir_monitor.c b/extern/glfw/src/mir_monitor.c index 9776b10..93073d3 100644 --- a/extern/glfw/src/mir_monitor.c +++ b/extern/glfw/src/mir_monitor.c @@ -127,12 +127,12 @@ void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode) void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } diff --git a/extern/glfw/src/mir_window.c b/extern/glfw/src/mir_window.c index f2890cb..566a5a1 100644 --- a/extern/glfw/src/mir_window.c +++ b/extern/glfw/src/mir_window.c @@ -470,7 +470,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, if (wndconfig->width > mode.width || wndconfig->height > mode.height) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Requested surface size is to large (%i %i)", + "Mir: Requested surface size too large: %ix%i", wndconfig->width, wndconfig->height); return GL_FALSE; @@ -502,13 +502,13 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window) void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, @@ -516,19 +516,19 @@ void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, int* right, int* bottom) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height) @@ -552,39 +552,39 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) void _glfwPlatformHideWindow(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformShowWindow(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformUnhideWindow(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } int _glfwPlatformWindowFocused(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); return GL_FALSE; } int _glfwPlatformWindowIconified(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); return GL_FALSE; } int _glfwPlatformWindowVisible(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); return GL_FALSE; } @@ -628,7 +628,7 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor, int xhot, int yhot) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); return GL_FALSE; } @@ -636,7 +636,7 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor, int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); return GL_FALSE; } @@ -644,43 +644,43 @@ int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape) void _glfwPlatformDestroyCursor(_GLFWcursor* cursor) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformApplyCursorMode(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); } const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Mir: Unsupported function %s!", __PRETTY_FUNCTION__); + "Mir: Unsupported function %s", __PRETTY_FUNCTION__); return NULL; } diff --git a/extern/glfw/src/monitor.c b/extern/glfw/src/monitor.c index 1ab5748..71fa8ed 100644 --- a/extern/glfw/src/monitor.c +++ b/extern/glfw/src/monitor.c @@ -28,6 +28,7 @@ #include "internal.h" #include +#include #include #include #include @@ -385,10 +386,9 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma) _GLFW_REQUIRE_INIT(); - if (gamma <= 0.f) + if (gamma != gamma || gamma <= 0.f || gamma > FLT_MAX) { - _glfwInputError(GLFW_INVALID_VALUE, - "Gamma value must be greater than zero"); + _glfwInputError(GLFW_INVALID_VALUE, "Invalid gamma value"); return; } diff --git a/extern/glfw/src/nsgl_context.m b/extern/glfw/src/nsgl_context.m index 0f0fb86..2875806 100644 --- a/extern/glfw/src/nsgl_context.m +++ b/extern/glfw/src/nsgl_context.m @@ -42,7 +42,7 @@ int _glfwInitContextAPI(void) CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengl")); if (_glfw.nsgl.framework == NULL) { - _glfwInputError(GLFW_PLATFORM_ERROR, + _glfwInputError(GLFW_API_UNAVAILABLE, "NSGL: Failed to locate OpenGL framework"); return GL_FALSE; } @@ -76,8 +76,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (ctxconfig->major == 3 && ctxconfig->minor < 2) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSGL: The targeted version of OS X does not " - "support OpenGL 3.0 or 3.1"); + "NSGL: The targeted version of OS X does not support OpenGL 3.0 or 3.1"); return GL_FALSE; } @@ -86,18 +85,14 @@ int _glfwCreateContext(_GLFWwindow* window, if (!ctxconfig->forward) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSGL: The targeted version of OS X only " - "supports OpenGL 3.2 and later versions if they " - "are forward-compatible"); + "NSGL: The targeted version of OS X only supports forward-compatible contexts for OpenGL 3.2 and above"); return GL_FALSE; } if (ctxconfig->profile != GLFW_OPENGL_CORE_PROFILE) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSGL: The targeted version of OS X only " - "supports OpenGL 3.2 and later versions if they " - "use the core profile"); + "NSGL: The targeted version of OS X only supports core profile contexts for OpenGL 3.2 and above"); return GL_FALSE; } } @@ -106,8 +101,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (ctxconfig->major > 2) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSGL: The targeted version of OS X does not " - "support OpenGL version 3.0 or above"); + "NSGL: The targeted version of OS X does not support OpenGL version 3.0 or above"); return GL_FALSE; } #endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/ @@ -232,7 +226,7 @@ int _glfwCreateContext(_GLFWwindow* window, shareContext:share]; if (window->nsgl.context == nil) { - _glfwInputError(GLFW_PLATFORM_ERROR, + _glfwInputError(GLFW_VERSION_UNAVAILABLE, "NSGL: Failed to create OpenGL context"); return GL_FALSE; } diff --git a/extern/glfw/src/wgl_context.c b/extern/glfw/src/wgl_context.c index 7b3b9c9..9b1022b 100644 --- a/extern/glfw/src/wgl_context.c +++ b/extern/glfw/src/wgl_context.c @@ -167,12 +167,6 @@ static GLboolean choosePixelFormat(_GLFWwindow* window, NULL); } - if (!nativeCount) - { - _glfwInputError(GLFW_API_UNAVAILABLE, "WGL: No pixel formats found"); - return GL_FALSE; - } - usableConfigs = calloc(nativeCount, sizeof(_GLFWfbconfig)); usableCount = 0; @@ -325,7 +319,7 @@ int _glfwInitContextAPI(void) _glfw.wgl.opengl32.instance = LoadLibraryW(L"opengl32.dll"); if (!_glfw.wgl.opengl32.instance) { - _glfwInputError(GLFW_PLATFORM_ERROR, "Failed to load opengl32.dll"); + _glfwInputError(GLFW_PLATFORM_ERROR, "WGL: Failed to load opengl32.dll"); return GL_FALSE; } @@ -367,7 +361,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (!window->wgl.dc) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to retrieve DC for window"); + "WGL: Failed to retrieve DC for window"); return GL_FALSE; } @@ -377,15 +371,14 @@ int _glfwCreateContext(_GLFWwindow* window, if (!DescribePixelFormat(window->wgl.dc, pixelFormat, sizeof(pfd), &pfd)) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to retrieve PFD for selected pixel " - "format"); + "WGL: Failed to retrieve PFD for selected pixel format"); return GL_FALSE; } if (!SetPixelFormat(window->wgl.dc, pixelFormat, &pfd)) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to set selected pixel format"); + "WGL: Failed to set selected pixel format"); return GL_FALSE; } @@ -398,9 +391,6 @@ int _glfwCreateContext(_GLFWwindow* window, if (ctxconfig->forward) flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; - if (ctxconfig->debug) - flags |= WGL_CONTEXT_DEBUG_BIT_ARB; - if (ctxconfig->profile) { if (ctxconfig->profile == GLFW_OPENGL_CORE_PROFILE) @@ -412,6 +402,9 @@ int _glfwCreateContext(_GLFWwindow* window, else mask |= WGL_CONTEXT_ES2_PROFILE_BIT_EXT; + if (ctxconfig->debug) + flags |= WGL_CONTEXT_DEBUG_BIT_ARB; + if (ctxconfig->robustness) { if (window->wgl.ARB_create_context_robustness) @@ -478,7 +471,7 @@ int _glfwCreateContext(_GLFWwindow* window, window->wgl.context = wglCreateContext(window->wgl.dc); if (!window->wgl.context) { - _glfwInputError(GLFW_PLATFORM_ERROR, + _glfwInputError(GLFW_VERSION_UNAVAILABLE, "WGL: Failed to create OpenGL context"); return GL_FALSE; } @@ -488,8 +481,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (!wglShareLists(share, window->wgl.context)) { _glfwInputError(GLFW_PLATFORM_ERROR, - "WGL: Failed to enable sharing with specified " - "OpenGL context"); + "WGL: Failed to enable sharing with specified OpenGL context"); return GL_FALSE; } } @@ -535,9 +527,7 @@ int _glfwAnalyzeContext(const _GLFWwindow* window, if (!window->wgl.ARB_create_context) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "WGL: A forward compatible OpenGL context " - "requested but WGL_ARB_create_context is " - "unavailable"); + "WGL: A forward compatible OpenGL context requested but WGL_ARB_create_context is unavailable"); return _GLFW_RECREATION_IMPOSSIBLE; } @@ -549,8 +539,7 @@ int _glfwAnalyzeContext(const _GLFWwindow* window, if (!window->wgl.ARB_create_context_profile) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "WGL: OpenGL profile requested but " - "WGL_ARB_create_context_profile is unavailable"); + "WGL: OpenGL profile requested but WGL_ARB_create_context_profile is unavailable"); return _GLFW_RECREATION_IMPOSSIBLE; } @@ -570,8 +559,7 @@ int _glfwAnalyzeContext(const _GLFWwindow* window, !window->wgl.EXT_create_context_es2_profile) { _glfwInputError(GLFW_API_UNAVAILABLE, - "WGL: OpenGL ES requested but " - "WGL_ARB_create_context_es2_profile is unavailable"); + "WGL: OpenGL ES requested but WGL_ARB_create_context_es2_profile is unavailable"); return _GLFW_RECREATION_IMPOSSIBLE; } diff --git a/extern/glfw/src/win32_init.c b/extern/glfw/src/win32_init.c index 964b23a..bf049a7 100644 --- a/extern/glfw/src/win32_init.c +++ b/extern/glfw/src/win32_init.c @@ -30,11 +30,6 @@ #include #include -#ifdef __BORLANDC__ -// With the Borland C++ compiler, we want to disable FPU exceptions -#include -#endif // __BORLANDC__ - #if defined(_GLFW_USE_OPTIMUS_HPG) @@ -335,12 +330,6 @@ int _glfwPlatformInit(void) if (_glfw_SetProcessDPIAware) _glfw_SetProcessDPIAware(); -#ifdef __BORLANDC__ - // With the Borland C++ compiler, we want to disable FPU exceptions - // (this is recommended for OpenGL applications under Windows) - _control87(MCW_EM, MCW_EM); -#endif - if (!_glfwRegisterWindowClass()) return GL_FALSE; @@ -381,8 +370,6 @@ const char* _glfwPlatformGetVersionString(void) " MinGW" #elif defined(_MSC_VER) " VisualC" -#elif defined(__BORLANDC__) - " BorlandC" #endif #if defined(_GLFW_BUILD_DLL) " DLL" diff --git a/extern/glfw/src/win32_monitor.c b/extern/glfw/src/win32_monitor.c index 0690dc1..0ce8e38 100644 --- a/extern/glfw/src/win32_monitor.c +++ b/extern/glfw/src/win32_monitor.c @@ -144,7 +144,7 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count) if (!name) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Failed to convert string to UTF-8"); + "Win32: Failed to convert string to UTF-8"); continue; } diff --git a/extern/glfw/src/win32_window.c b/extern/glfw/src/win32_window.c index 176ed59..da652e8 100644 --- a/extern/glfw/src/win32_window.c +++ b/extern/glfw/src/win32_window.c @@ -584,7 +584,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, int i; const int count = DragQueryFileW(hDrop, 0xffffffff, NULL, 0); - char** names = calloc(count, sizeof(char*)); + char** paths = calloc(count, sizeof(char*)); // Move the mouse to the position of the drop DragQueryPoint(hDrop, &pt); @@ -596,16 +596,16 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WCHAR* buffer = calloc(length + 1, sizeof(WCHAR)); DragQueryFileW(hDrop, i, buffer, length + 1); - names[i] = _glfwCreateUTF8FromWideString(buffer); + paths[i] = _glfwCreateUTF8FromWideString(buffer); free(buffer); } - _glfwInputDrop(window, count, (const char**) names); + _glfwInputDrop(window, count, (const char**) paths); for (i = 0; i < count; i++) - free(names[i]); - free(names); + free(paths[i]); + free(paths); DragFinish(hDrop); return 0; @@ -679,7 +679,7 @@ static int createWindow(_GLFWwindow* window, if (!wideTitle) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to convert title to wide string"); + "Win32: Failed to convert window title to UTF-16"); return GL_FALSE; } @@ -862,7 +862,7 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title) if (!wideTitle) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to convert title to wide string"); + "Win32: Failed to convert window title to UTF-16"); return; } @@ -1168,18 +1168,12 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor, int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape) { - LPCWSTR native = translateCursorShape(shape); - if (!native) - { - _glfwInputError(GLFW_INVALID_ENUM, "Win32: Invalid standard cursor"); - return GL_FALSE; - } - - cursor->win32.handle = CopyCursor(LoadCursorW(NULL, native)); + cursor->win32.handle = + CopyCursor(LoadCursorW(NULL, translateCursorShape(shape))); if (!cursor->win32.handle) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to retrieve shared cursor"); + "Win32: Failed to create standard cursor"); return GL_FALSE; } @@ -1219,8 +1213,7 @@ void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string) if (!wideString) { _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to convert clipboard string to " - "wide string"); + "Win32: Failed to convert string to UTF-16"); return; } @@ -1259,12 +1252,6 @@ const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) { HANDLE stringHandle; - if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) - { - _glfwInputError(GLFW_FORMAT_UNAVAILABLE, NULL); - return NULL; - } - if (!OpenClipboard(window->win32.handle)) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to open clipboard"); @@ -1276,8 +1263,8 @@ const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) { CloseClipboard(); - _glfwInputError(GLFW_PLATFORM_ERROR, - "Win32: Failed to retrieve clipboard data"); + _glfwInputError(GLFW_FORMAT_UNAVAILABLE, + "Win32: Failed to convert clipboard to string"); return NULL; } diff --git a/extern/glfw/src/window.c b/extern/glfw/src/window.c index 4a46a6e..3acd48c 100644 --- a/extern/glfw/src/window.c +++ b/extern/glfw/src/window.c @@ -394,7 +394,7 @@ GLFWAPI void glfwWindowHint(int target, int hint) _glfw.hints.release = hint; break; default: - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid window hint"); break; } } @@ -479,7 +479,7 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* handle, int xpos, int ypos) if (window->monitor) { _glfwInputError(GLFW_INVALID_VALUE, - "Full screen windows cannot be positioned"); + "Full screen windows cannot be moved"); return; } @@ -624,7 +624,7 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib) return window->context.release; } - _glfwInputError(GLFW_INVALID_ENUM, NULL); + _glfwInputError(GLFW_INVALID_ENUM, "Invalid window attribute"); return 0; } diff --git a/extern/glfw/src/x11_init.c b/extern/glfw/src/x11_init.c index 388105e..19b5ab9 100644 --- a/extern/glfw/src/x11_init.c +++ b/extern/glfw/src/x11_init.c @@ -479,11 +479,13 @@ static GLboolean initExtensions(void) "_MOTIF_WM_HINTS", False); +#if defined(_GLFW_HAS_XF86VM) // Check for XF86VidMode extension _glfw.x11.vidmode.available = XF86VidModeQueryExtension(_glfw.x11.display, &_glfw.x11.vidmode.eventBase, &_glfw.x11.vidmode.errorBase); +#endif /*_GLFW_HAS_XF86VM*/ // Check for RandR extension _glfw.x11.randr.available = @@ -535,6 +537,7 @@ static GLboolean initExtensions(void) _glfw.x11.xinerama.available = GL_TRUE; } +#if defined(_GLFW_HAS_XINPUT) if (XQueryExtension(_glfw.x11.display, "XInputExtension", &_glfw.x11.xi.majorOpcode, @@ -551,6 +554,7 @@ static GLboolean initExtensions(void) _glfw.x11.xi.available = GL_TRUE; } } +#endif /*_GLFW_HAS_XINPUT*/ // Check if Xkb is supported on this display _glfw.x11.xkb.versionMajor = 1; @@ -583,7 +587,7 @@ static GLboolean initExtensions(void) detectEWMH(); // Find or create string format atoms - _glfw.x11._NULL = XInternAtom(_glfw.x11.display, "NULL", False); + _glfw.x11.NULL_ = XInternAtom(_glfw.x11.display, "NULL", False); _glfw.x11.UTF8_STRING = XInternAtom(_glfw.x11.display, "UTF8_STRING", False); _glfw.x11.COMPOUND_STRING = @@ -710,6 +714,8 @@ Cursor _glfwCreateCursor(const GLFWimage* image, int xhot, int yhot) int _glfwPlatformInit(void) { + // HACK: If the current locale is C, apply the environment's locale + // This is done because the C locale breaks character input if (strcmp(setlocale(LC_CTYPE, NULL), "C") == 0) setlocale(LC_CTYPE, ""); @@ -718,7 +724,7 @@ int _glfwPlatformInit(void) _glfw.x11.display = XOpenDisplay(NULL); if (!_glfw.x11.display) { - _glfwInputError(GLFW_API_UNAVAILABLE, "X11: Failed to open X display"); + _glfwInputError(GLFW_PLATFORM_ERROR, "X11: Failed to open X display"); return GL_FALSE; } diff --git a/extern/glfw/src/x11_monitor.c b/extern/glfw/src/x11_monitor.c index 6265070..cdb1c92 100644 --- a/extern/glfw/src/x11_monitor.c +++ b/extern/glfw/src/x11_monitor.c @@ -432,6 +432,7 @@ void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp) XRRFreeGamma(gamma); } +#if defined(_GLFW_HAS_XF86VM) else if (_glfw.x11.vidmode.available) { int size; @@ -443,6 +444,7 @@ void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp) _glfw.x11.screen, ramp->size, ramp->red, ramp->green, ramp->blue); } +#endif /*_GLFW_HAS_XF86VM*/ } void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) @@ -458,6 +460,7 @@ void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) XRRSetCrtcGamma(_glfw.x11.display, monitor->x11.crtc, gamma); XRRFreeGamma(gamma); } +#if defined(_GLFW_HAS_XF86VM) else if (_glfw.x11.vidmode.available) { XF86VidModeSetGammaRamp(_glfw.x11.display, @@ -467,6 +470,7 @@ void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp) (unsigned short*) ramp->green, (unsigned short*) ramp->blue); } +#endif /*_GLFW_HAS_XF86VM*/ } diff --git a/extern/glfw/src/x11_platform.h b/extern/glfw/src/x11_platform.h index 81d1bef..22bb7e0 100644 --- a/extern/glfw/src/x11_platform.h +++ b/extern/glfw/src/x11_platform.h @@ -37,21 +37,25 @@ #include #include -// The Xf86VidMode extension provides fallback gamma control -#include - // The XRandR extension provides mode setting and gamma control #include -// The XInput2 extension provides improved input events -#include - // The Xkb extension provides improved keyboard support #include // The Xinerama extension provides legacy monitor indices #include +#if defined(_GLFW_HAS_XINPUT) + // The XInput2 extension provides improved input events + #include +#endif + +#if defined(_GLFW_HAS_XF86VM) + // The Xf86VidMode extension provides fallback gamma control + #include +#endif + #include "posix_tls.h" #if defined(_GLFW_GLX) @@ -156,18 +160,12 @@ typedef struct _GLFWlibraryX11 Atom CLIPBOARD; Atom CLIPBOARD_MANAGER; Atom SAVE_TARGETS; - Atom _NULL; + Atom NULL_; Atom UTF8_STRING; Atom COMPOUND_STRING; Atom ATOM_PAIR; Atom GLFW_SELECTION; - struct { - GLboolean available; - int eventBase; - int errorBase; - } vidmode; - struct { GLboolean available; int eventBase; @@ -188,15 +186,6 @@ typedef struct _GLFWlibraryX11 int versionMinor; } xkb; - struct { - GLboolean available; - int majorOpcode; - int eventBase; - int errorBase; - int versionMajor; - int versionMinor; - } xi; - struct { int count; int timeout; @@ -215,6 +204,25 @@ typedef struct _GLFWlibraryX11 int versionMinor; } xinerama; +#if defined(_GLFW_HAS_XINPUT) + struct { + GLboolean available; + int majorOpcode; + int eventBase; + int errorBase; + int versionMajor; + int versionMinor; + } xi; +#endif /*_GLFW_HAS_XINPUT*/ + +#if defined(_GLFW_HAS_XF86VM) + struct { + GLboolean available; + int eventBase; + int errorBase; + } vidmode; +#endif /*_GLFW_HAS_XF86VM*/ + } _GLFWlibraryX11; diff --git a/extern/glfw/src/x11_window.c b/extern/glfw/src/x11_window.c index 0380b58..4f2538b 100644 --- a/extern/glfw/src/x11_window.c +++ b/extern/glfw/src/x11_window.c @@ -28,6 +28,7 @@ #include "internal.h" #include +#include #include @@ -57,6 +58,22 @@ typedef struct #define MWM_HINTS_DECORATIONS (1L << 1) +// Wait for data to arrive +// +void selectDisplayConnection(struct timeval* timeout) +{ + fd_set fds; + const int fd = ConnectionNumber(_glfw.x11.display); + + FD_ZERO(&fds); + FD_SET(fd, &fds); + + // select(1) is used instead of an X function like XNextEvent, as the + // wait inside those are guarded by the mutex protecting the display + // struct, locking out other threads from using X (including GLX) + select(fd + 1, &fds, NULL, NULL, timeout); +} + // Returns whether the window is iconified // static int getWindowState(_GLFWwindow* window) @@ -183,11 +200,12 @@ static void changeWindowState(_GLFWwindow* window, Atom state, int action) } // Splits and translates a text/uri-list into separate file paths +// NOTE: This function destroys the provided string // static char** parseUriList(char* text, int* count) { const char* prefix = "file://"; - char** names = NULL; + char** paths = NULL; char* line; *count = 0; @@ -196,7 +214,7 @@ static char** parseUriList(char* text, int* count) { text = NULL; - if (*line == '#') + if (line[0] == '#') continue; if (strncmp(line, prefix, strlen(prefix)) == 0) @@ -204,27 +222,27 @@ static char** parseUriList(char* text, int* count) (*count)++; - char* name = calloc(strlen(line) + 1, 1); - names = realloc(names, *count * sizeof(char*)); - names[*count - 1] = name; + char* path = calloc(strlen(line) + 1, 1); + paths = realloc(paths, *count * sizeof(char*)); + paths[*count - 1] = path; while (*line) { if (line[0] == '%' && line[1] && line[2]) { const char digits[3] = { line[1], line[2], '\0' }; - *name = strtol(digits, NULL, 16); + *path = strtol(digits, NULL, 16); line += 2; } else - *name = *line; + *path = *line; - name++; + path++; line++; } } - return names; + return paths; } // Create the X11 window (and its colormap) @@ -411,6 +429,7 @@ static GLboolean createWindow(_GLFWwindow* window, XFree(hint); } +#if defined(_GLFW_HAS_XINPUT) if (_glfw.x11.xi.available) { // Select for XInput2 events @@ -425,6 +444,7 @@ static GLboolean createWindow(_GLFWwindow* window, XISelectEvents(_glfw.x11.display, window->x11.handle, &eventmask, 1); } +#endif /*_GLFW_HAS_XINPUT*/ if (_glfw.x11.XdndAware) { @@ -435,27 +455,6 @@ static GLboolean createWindow(_GLFWwindow* window, PropModeReplace, (unsigned char*) &version, 1); } - if (_glfw.x11.NET_REQUEST_FRAME_EXTENTS) - { - // Ensure _NET_FRAME_EXTENTS is set, allowing glfwGetWindowFrameSize to - // function before the window is mapped - - XEvent event; - memset(&event, 0, sizeof(event)); - - event.type = ClientMessage; - event.xclient.window = window->x11.handle; - event.xclient.format = 32; // Data is 32-bit longs - event.xclient.message_type = _glfw.x11.NET_REQUEST_FRAME_EXTENTS; - - XSendEvent(_glfw.x11.display, - _glfw.x11.root, - False, - SubstructureNotifyMask | SubstructureRedirectMask, - &event); - XIfEvent(_glfw.x11.display, &event, isFrameExtentsEvent, (XPointer) window); - } - if (wndconfig->floating && !wndconfig->monitor) { if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_ABOVE) @@ -629,7 +628,7 @@ static Atom writeTargetToProperty(const XSelectionRequestEvent* request) XChangeProperty(_glfw.x11.display, request->requestor, request->property, - _glfw.x11._NULL, + _glfw.x11.NULL_, 32, PropModeReplace, NULL, @@ -701,33 +700,35 @@ static void pushSelectionToManager(_GLFWwindow* window) { XEvent event; - if (!XCheckIfEvent(_glfw.x11.display, &event, isSelectionEvent, NULL)) - continue; - - switch (event.type) + while (XCheckIfEvent(_glfw.x11.display, &event, isSelectionEvent, NULL)) { - case SelectionRequest: - handleSelectionRequest(&event); - break; - - case SelectionClear: - handleSelectionClear(&event); - break; - - case SelectionNotify: + switch (event.type) { - if (event.xselection.target == _glfw.x11.SAVE_TARGETS) - { - // This means one of two things; either the selection was - // not owned, which means there is no clipboard manager, or - // the transfer to the clipboard manager has completed - // In either case, it means we are done here - return; - } + case SelectionRequest: + handleSelectionRequest(&event); + break; - break; + case SelectionClear: + handleSelectionClear(&event); + break; + + case SelectionNotify: + { + if (event.xselection.target == _glfw.x11.SAVE_TARGETS) + { + // This means one of two things; either the selection was + // not owned, which means there is no clipboard manager, or + // the transfer to the clipboard manager has completed + // In either case, it means we are done here + return; + } + + break; + } } } + + selectDisplayConnection(NULL); } } @@ -1007,7 +1008,7 @@ static void processEvent(XEvent *event) // Additional buttons after 7 are treated as regular buttons // We subtract 4 to fill the gap left by scroll input above _glfwInputMouseClick(window, - event->xbutton.button - 4, + event->xbutton.button - Button1 - 4, GLFW_PRESS, mods); } @@ -1045,7 +1046,7 @@ static void processEvent(XEvent *event) // Additional buttons after 7 are treated as regular buttons // We subtract 4 to fill the gap left by scroll input above _glfwInputMouseClick(window, - event->xbutton.button - 4, + event->xbutton.button - Button1 - 4, GLFW_RELEASE, mods); } @@ -1054,6 +1055,11 @@ static void processEvent(XEvent *event) case EnterNotify: { + // HACK: This is a workaround for WMs (KWM, Fluxbox) that otherwise + // ignore the defined cursor for hidden cursor mode + if (window->cursorMode == GLFW_CURSOR_HIDDEN) + hideCursor(window); + _glfwInputCursorEnter(window, GL_TRUE); break; } @@ -1216,13 +1222,13 @@ static void processEvent(XEvent *event) if (result) { int i, count; - char** names = parseUriList(data, &count); + char** paths = parseUriList(data, &count); - _glfwInputDrop(window, count, (const char**) names); + _glfwInputDrop(window, count, (const char**) paths); for (i = 0; i < count; i++) - free(names[i]); - free(names); + free(paths[i]); + free(paths); } XFree(data); @@ -1309,6 +1315,7 @@ static void processEvent(XEvent *event) case DestroyNotify: return; +#if defined(_GLFW_HAS_XINPUT) case GenericEvent: { if (event->xcookie.extension == _glfw.x11.xi.majorOpcode && @@ -1354,6 +1361,7 @@ static void processEvent(XEvent *event) XFreeEventData(_glfw.x11.display, &event->xcookie); break; } +#endif /*_GLFW_HAS_XINPUT*/ default: { @@ -1447,8 +1455,8 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window) if (window->x11.handle) { - if (window->x11.handle == - XGetSelectionOwner(_glfw.x11.display, _glfw.x11.CLIPBOARD)) + if (XGetSelectionOwner(_glfw.x11.display, _glfw.x11.CLIPBOARD) == + window->x11.handle) { pushSelectionToManager(window); } @@ -1596,6 +1604,56 @@ void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, if (_glfw.x11.NET_FRAME_EXTENTS == None) return; + if (!_glfwPlatformWindowVisible(window) && + _glfw.x11.NET_REQUEST_FRAME_EXTENTS) + { + // Ensure _NET_FRAME_EXTENTS is set, allowing glfwGetWindowFrameSize to + // function before the window is mapped + + double base; + XEvent event; + memset(&event, 0, sizeof(event)); + + event.type = ClientMessage; + event.xclient.window = window->x11.handle; + event.xclient.format = 32; // Data is 32-bit longs + event.xclient.message_type = _glfw.x11.NET_REQUEST_FRAME_EXTENTS; + + XSendEvent(_glfw.x11.display, + _glfw.x11.root, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &event); + + // HACK: Poll with timeout for the required response instead of blocking + // This is done because some window managers (at least Unity, + // Fluxbox and Xfwm) failed to send the required response + // They have been fixed but broken versions are still in the wild + // If you are affected by this and your window manager is NOT + // listed above, PLEASE report it to their and our issue trackers + base = _glfwPlatformGetTime(); + while (!XCheckIfEvent(_glfw.x11.display, + &event, + isFrameExtentsEvent, + (XPointer) window)) + { + double remaining; + struct timeval timeout; + + remaining = 0.5 + base - _glfwPlatformGetTime(); + if (remaining <= 0.0) + { + _glfwInputError(GLFW_PLATFORM_ERROR, + "X11: The window manager has a broken _NET_REQUEST_FRAME_EXTENTS implementation; please report this issue"); + return; + } + + timeout.tv_sec = 0; + timeout.tv_usec = (long) (remaining * 1e6); + selectDisplayConnection(&timeout); + } + } + if (_glfwGetWindowProperty(window->x11.handle, _glfw.x11.NET_FRAME_EXTENTS, XA_CARDINAL, @@ -1621,9 +1679,8 @@ void _glfwPlatformIconifyWindow(_GLFWwindow* window) { // Override-redirect windows cannot be iconified or restored, as those // tasks are performed by the window manager - _glfwInputError(GLFW_API_UNAVAILABLE, - "X11: Iconification of full screen windows requires " - "a WM that supports EWMH"); + _glfwInputError(GLFW_PLATFORM_ERROR, + "X11: Iconification of full screen windows requires a WM that supports EWMH"); return; } @@ -1637,9 +1694,8 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) { // Override-redirect windows cannot be iconified or restored, as those // tasks are performed by the window manager - _glfwInputError(GLFW_API_UNAVAILABLE, - "X11: Iconification of full screen windows requires " - "a WM that supports EWMH"); + _glfwInputError(GLFW_PLATFORM_ERROR, + "X11: Iconification of full screen windows requires a WM that supports EWMH"); return; } @@ -1708,19 +1764,7 @@ void _glfwPlatformPollEvents(void) void _glfwPlatformWaitEvents(void) { if (!XPending(_glfw.x11.display)) - { - fd_set fds; - const int fd = ConnectionNumber(_glfw.x11.display); - - FD_ZERO(&fds); - FD_SET(fd, &fds); - - // select(1) is used instead of an X function like XNextEvent, as the - // wait inside those are guarded by the mutex protecting the display - // struct, locking out other threads from using X (including GLX) - if (select(fd + 1, &fds, NULL, NULL, NULL) < 0) - return; - } + selectDisplayConnection(NULL); _glfwPlatformPollEvents(); } @@ -1734,7 +1778,7 @@ void _glfwPlatformPostEmptyEvent(void) event.type = ClientMessage; event.xclient.window = window->x11.handle; event.xclient.format = 32; // Data is 32-bit longs - event.xclient.message_type = _glfw.x11._NULL; + event.xclient.message_type = _glfw.x11.NULL_; XSendEvent(_glfw.x11.display, window->x11.handle, False, 0, &event); XFlush(_glfw.x11.display); @@ -1796,14 +1840,8 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor, int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape) { - const unsigned int native = translateCursorShape(shape); - if (!native) - { - _glfwInputError(GLFW_INVALID_ENUM, "X11: Invalid standard cursor"); - return GL_FALSE; - } - - cursor->x11.handle = XCreateFontCursor(_glfw.x11.display, native); + cursor->x11.handle = XCreateFontCursor(_glfw.x11.display, + translateCursorShape(shape)); if (!cursor->x11.handle) { _glfwInputError(GLFW_PLATFORM_ERROR, @@ -1846,7 +1884,7 @@ void _glfwPlatformSetClipboardString(_GLFWwindow* window, const char* string) window->x11.handle) { _glfwInputError(GLFW_PLATFORM_ERROR, - "X11: Failed to become owner of the clipboard selection"); + "X11: Failed to become owner of clipboard selection"); } } @@ -1883,7 +1921,7 @@ const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) // XCheckTypedEvent is used instead of XIfEvent in order not to lock // other threads out from the display during the entire wait period while (!XCheckTypedEvent(_glfw.x11.display, SelectionNotify, &event)) - ; + selectDisplayConnection(NULL); if (event.xselection.property == None) continue; @@ -1909,7 +1947,7 @@ const char* _glfwPlatformGetClipboardString(_GLFWwindow* window) if (_glfw.x11.clipboardString == NULL) { _glfwInputError(GLFW_FORMAT_UNAVAILABLE, - "X11: Failed to convert selection to string"); + "X11: Failed to convert clipboard to string"); } return _glfw.x11.clipboardString; diff --git a/extern/glfw/tests/CMakeLists.txt b/extern/glfw/tests/CMakeLists.txt index a5f5247..5386f58 100644 --- a/extern/glfw/tests/CMakeLists.txt +++ b/extern/glfw/tests/CMakeLists.txt @@ -1,5 +1,5 @@ -link_libraries(glfw "${OPENGL_glu_LIBRARY}") +link_libraries(glfw) if (BUILD_SHARED_LIBS) add_definitions(-DGLFW_DLL) @@ -28,7 +28,7 @@ add_executable(gamma gamma.c ${GETOPT}) add_executable(glfwinfo glfwinfo.c ${GETOPT}) add_executable(iconify iconify.c ${GETOPT}) add_executable(joysticks joysticks.c) -add_executable(modes modes.c ${GETOPT}) +add_executable(monitors monitors.c ${GETOPT}) add_executable(peter peter.c) add_executable(reopen reopen.c) add_executable(cursor cursor.c) @@ -62,7 +62,7 @@ target_link_libraries(threads "${CMAKE_THREAD_LIBS_INIT}" "${RT_LIBRARY}") set(WINDOWS_BINARIES accuracy empty sharing tearing threads title windows cursoranim) set(CONSOLE_BINARIES clipboard defaults events fsaa gamma glfwinfo - iconify joysticks modes peter reopen cursor) + iconify joysticks monitors peter reopen cursor) set_target_properties(${WINDOWS_BINARIES} ${CONSOLE_BINARIES} PROPERTIES FOLDER "GLFW3/Tests") @@ -76,6 +76,7 @@ endif() if (APPLE) set_target_properties(${WINDOWS_BINARIES} ${CONSOLE_BINARIES} PROPERTIES MACOSX_BUNDLE_SHORT_VERSION_STRING ${GLFW_VERSION} - MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION_FULL}) + MACOSX_BUNDLE_LONG_VERSION_STRING ${GLFW_VERSION_FULL} + MACOSX_BUNDLE_INFO_PLIST "${GLFW_SOURCE_DIR}/CMake/AppleInfo.plist") endif() diff --git a/extern/glfw/tests/cursor.c b/extern/glfw/tests/cursor.c index 9b89926..fc65c4d 100644 --- a/extern/glfw/tests/cursor.c +++ b/extern/glfw/tests/cursor.c @@ -27,7 +27,6 @@ // //======================================================================== -#define GLFW_INCLUDE_GLU #include #include diff --git a/extern/glfw/tests/events.c b/extern/glfw/tests/events.c index fda6816..f40576d 100644 --- a/extern/glfw/tests/events.c +++ b/extern/glfw/tests/events.c @@ -398,7 +398,7 @@ static void char_mods_callback(GLFWwindow* window, unsigned int codepoint, int m get_mods_name(mods)); } -static void drop_callback(GLFWwindow* window, int count, const char** names) +static void drop_callback(GLFWwindow* window, int count, const char** paths) { int i; Slot* slot = glfwGetWindowUserPointer(window); @@ -407,7 +407,7 @@ static void drop_callback(GLFWwindow* window, int count, const char** names) counter++, slot->number, glfwGetTime()); for (i = 0; i < count; i++) - printf(" %i: \"%s\"\n", i, names[i]); + printf(" %i: \"%s\"\n", i, paths[i]); } static void monitor_callback(GLFWmonitor* monitor, int event) diff --git a/extern/glfw/tests/joysticks.c b/extern/glfw/tests/joysticks.c index a3a5cd7..0d6b2c3 100644 --- a/extern/glfw/tests/joysticks.c +++ b/extern/glfw/tests/joysticks.c @@ -110,7 +110,7 @@ static void draw_joystick(Joystick* j, int x, int y, int width, int height) static void draw_joysticks(GLFWwindow* window) { - int i, width, height; + int i, width, height, offset = 0; glfwGetFramebufferSize(window, &width, &height); @@ -126,8 +126,9 @@ static void draw_joysticks(GLFWwindow* window) if (j->present) { draw_joystick(j, - 0, i * height / joystick_count, + 0, offset * height / joystick_count, width, height / joystick_count); + offset++; } } } diff --git a/extern/glfw/tests/modes.c b/extern/glfw/tests/monitors.c similarity index 97% rename from extern/glfw/tests/modes.c rename to extern/glfw/tests/monitors.c index 58067e3..47f12fa 100644 --- a/extern/glfw/tests/modes.c +++ b/extern/glfw/tests/monitors.c @@ -1,5 +1,5 @@ //======================================================================== -// Video mode test +// Monitor information tool // Copyright (c) Camilla Berglund // // This software is provided 'as-is', without any express or implied @@ -23,7 +23,8 @@ // //======================================================================== // -// This test enumerates or verifies video modes +// This test prints monitor and video mode information or verifies video +// modes // //======================================================================== @@ -43,8 +44,8 @@ enum Mode static void usage(void) { - printf("Usage: modes [-t]\n"); - printf(" modes -h\n"); + printf("Usage: monitors [-t]\n"); + printf(" monitors -h\n"); } static const char* format_mode(const GLFWvidmode* mode)