diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e7983cb..7c9b2c2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 2.8) set(GLFW_VERSION_MAJOR "3") set(GLFW_VERSION_MINOR "0") -set(GLFW_VERSION_PATCH "2") +set(GLFW_VERSION_PATCH "3") 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}") @@ -163,6 +163,13 @@ if (_GLFW_WIN32) if (GLFW_USE_OPTIMUS_HPG) set(_GLFW_USE_OPTIMUS_HPG 1) endif() + + # HACK: When building on MinGW, WINVER and UNICODE need to be defined before + # the inclusion of stddef.h (by glfw3.h), which is itself included before + # win32_platform.h. We define them here until a saner solution can be found + # NOTE: MinGW-w64 and Visual C++ do /not/ need this hack. + add_definitions(-DUNICODE) + add_definitions(-DWINVER=0x0501) endif() #-------------------------------------------------------------------- @@ -204,7 +211,13 @@ if (_GLFW_X11) endif() list(APPEND glfw_INCLUDE_DIRS ${X11_Xinput_INCLUDE_PATH}) - list(APPEND glfw_LIBRARIES ${X11_Xinput_LIB}) + + 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() set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} xi") # Check for Xf86VidMode (fallback gamma control) diff --git a/README.md b/README.md index 711b9cda..f0f7c541 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,9 @@ GLFW is a free, Open Source, portable 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.0.2 is *not yet described*. As this is a patch release, there are no -API changes. +Version 3.0.3 adds fixes for a number of bugs that together affect all supported +platforms, most notably MinGW compilation issues and cursor mode issues on OS X. +As this is a patch release, there are no API changes. If you are new to GLFW, you may find the [introductory tutorial](http://www.glfw.org/docs/latest/quick.html) for GLFW @@ -167,11 +168,15 @@ directory of bundled applications to the `Contents/Resources` directory. #### Windows specific options `USE_MSVC_RUNTIME_LIBRARY_DLL` determines whether to use the DLL version or the -static library version of the Visual C++ runtime library. +static library version of the Visual C++ runtime library. If set to `ON`, the +DLL version of the Visual C++ library is used. It is recommended to set this to +`ON`, as this keeps the executable smaller and benefits from security and bug +fix updates of the Visual C++ runtime. `GLFW_USE_DWM_SWAP_INTERVAL` determines whether the swap interval is set even -when DWM compositing is enabled. This can lead to severe jitter and is not -usually recommended. +when DWM compositing is enabled. If this is `ON`, the swap interval is set even +if DWM is enabled. It is recommended to set this to `OFF`, as doing otherwise +can lead to severe jitter. `GLFW_USE_OPTIMUS_HPG` determines whether to export the `NvOptimusEnablement` symbol, which forces the use of the high-performance GPU on nVidia Optimus @@ -204,31 +209,13 @@ See the [GLFW documentation](http://www.glfw.org/docs/latest/). ## Changelog - - Bugfix: The `-Wall` flag was not used with Clang and other GCC compatibles - - Bugfix: The default for `GLFW_ALPHA_BITS` was set to zero - - [Win32] Added `_GLFW_USE_DWM_SWAP_INTERVAL` for forcing the swap interval - to be set even when DWM compositing is enabled - - [Win32] Added support for forcing the use of the high-performance GPU - on nVidia Optimus systems - - [Win32] Bugfix: The clipboard string was not freed on terminate - - [Win32] Bugfix: Entry points for OpenGL 1.0 and 1.1 functions were not - returned by `glfwGetProcAddress` - - [Win32] Bugfix: The `user32` and `dwmapi` module handles were not freed on - library termination - - [Cocoa] Added support for precise scrolling deltas on OS X 10.7 and later - - [Cocoa] Enabled explicit creation of OpenGL 3.x and 4.x contexts as supported - by OS X 10.9 - - [Cocoa] Bugfix: The clipboard string was not freed on terminate - - [Cocoa] Bugfix: Selectors were used that are not declared by the 10.6 SDK - - [Cocoa] Bugfix: The position set by `glfwSetWindowPos` was incorrect - - [X11] Bugfix: Override-redirect windows were resized to the desired instead - of the actual resolution of the selected video mode - - [X11] Bugfix: Screensaver override for full screen windows had a possible - race condition - - [X11] Bugfix: The reported window position did not account for the size of - the window frame on some WMs - - [X11] Bugfix: The original video mode of a monitor was overwritten by calls - to `glfwSetWindowSize` + - [Win32] Bugfix: `_WIN32_WINNT` was not set to Windows XP or later + - [Win32] Bugfix: Legacy MinGW needs `WINVER` and `UNICODE` before `stddef.h` + - [Cocoa] Bugfix: Cursor was not visible in normal mode in full screen + - [Cocoa] Bugfix: Cursor was not actually hidden in hidden mode + - [Cocoa] Bugfix: Cursor modes were not applied to inactive windows + - [X11] Bugfix: Events for mouse buttons 4 and above were not reported + - [X11] Bugfix: CMake 2.8.7 does not set `X11_Xinput_LIB` even when found ## Contact @@ -264,6 +251,7 @@ skills. - John Bartholomew - Niklas Behrens - Niklas Bergström + - Doug Binks - blanco - Lambert Clara - Noel Cower @@ -298,6 +286,7 @@ skills. - Bruce Mitchener - Jeff Molofee - Jon Morton + - Pierre Moulon - Julian Møller - Ozzy - Peoro diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index 7c3c431a..eb547d35 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -899,13 +899,13 @@ HTML_FILE_EXTENSION = .html # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! -HTML_HEADER = +HTML_HEADER = @GLFW_SOURCE_DIR@/docs/header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. -HTML_FOOTER = +HTML_FOOTER = @GLFW_SOURCE_DIR@/docs/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to @@ -924,7 +924,7 @@ HTML_STYLESHEET = # robust against future updates. Doxygen will copy the style sheet file to # the output directory. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = @GLFW_SOURCE_DIR@/docs/extra.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note diff --git a/docs/extra.css b/docs/extra.css new file mode 100644 index 00000000..6d0dde1c --- /dev/null +++ b/docs/extra.css @@ -0,0 +1,312 @@ +html { + background-color:hsl(0,0%,95%); +} + +.glfwheader { + font-size:16px; + height:64px; + max-width:920px; + margin:0em auto; +} + +.glfwheader a#glfwhome { + line-height:64px; + padding-right:48pxpx; + float:left; + color:hsl(0,0%,40%); + font-size:2.5em; + background-image:url("http://www.glfw.org/css/arrow.png"); + background-position:right top; + background-repeat:no-repeat; +} + +.glfwnavbar { + list-style-type:none; + margin-top:0px; + float:right; +} + +.glfwnavbar li { + float:left; +} + +.glfwnavbar a,.glfwnavbar a:visited { + line-height:64px; + margin-left:2em; + display:block; + color:hsl(0,0%,40%); +} + +.glfwheader a#glfwhome,.glfwnavbar a,.glfwnavbar a:visited { + transition:all 0.35s ease 0s; +} + +#titlearea,address.footer { + color:hsl(0,0%,40%); + background-color:hsl(0,0%,95%); + border-bottom:none; +} + +address.footer { + text-align:center; + padding:2em; +} + +div#top { + background-color:hsl(0,0%,40%); +} + +div#navrow1,div#navrow2,div#navrow3,div#navrow4 { + background-color:hsl(0,0%,40%); + background-image:none; + max-width:920px; + margin:0em auto; +} + +ul.tablist { + min-width:700px; +} + +.tablist a,.tablist a:hover,.tablist li,.tablist li.current a { + background-image:none; + text-shadow:none; +} + +.tablist a,.tablist a:visited { + color:hsl(0,0%,95%); + text-shadow:none; +} + +.tablist li.current a { + background:linear-gradient(to bottom,hsl(34,100%,60%) 0%,hsl(24,100%,50%) 100%); + box-shadow:inset 0px 0px 32px hsl(24,100%,50%); + text-shadow:0px -1px 1px hsl(24,100%,35%); + color:hsl(0,0%,100%); +} + +div.contents { + min-height:590px; +} + +div.contents,div.header { + max-width:920px; + margin:0em auto; + padding:0em 2em 2em 2em; + background-color:hsl(0,0%,100%); +} + +div.header { + background-image:none; + border-bottom:none; +} + +table.doxtable th,dl.reflist dt,div.levels { + background:linear-gradient(to bottom,hsl(34,100%,60%) 0%,hsl(24,100%,50%) 100%); + box-shadow:inset 0px 0px 32px hsl(24,100%,50%); + text-shadow:0px -1px 1px hsl(24,100%,35%); + color:hsl(0,0%,100%); +} + +dl.reflist dt a.el,div.levels span { + color:hsl(24,100%,50%); + padding:0.2em; + border-radius:4px; + background-color:hsl(24,100%,90%); + text-shadow:none; +} + +div.memproto,div.qindex,div.ah { + background:linear-gradient(to bottom,hsl(34,0%,95%) 0%,hsl(24,0%,90%) 100%); + box-shadow:inset 0px 0px 32px hsl(24,0%,90%); + text-shadow:0px 1px 1px hsl(24,0%,100%); + color:hsl(0,0%,10%); +} + +div.memproto a { + color:hsl(24,100%,50%); +} + +div.memproto td.paramname { + text-shadow:0px 1px 1px hsl(24,0%,100%); +} + +div.memproto,div.qindex,div.ah { + border:2px solid hsl(24,0%,90%); + border-radius:4px; +} + +div.memdoc { + background:none; + box-shadow:none; + border:none; +} + +td.paramname { + color:hsl(24,100%,25%); +} + +dl.reflist dt { + border:2px solid hsl(24,100%,50%); + border-top-left-radius:4px; + border-top-right-radius:4px; + border-bottom:none; +} + +dl.reflist dd { + border:2px solid hsl(24,100%,50%); + border-bottom-right-radius:4px; + border-bottom-left-radius:4px; + border-top:none; + background:none; + box-shadow:none; +} + +table.doxtable { + border-collapse:inherit; + border-spacing:0px; + border:2px solid hsl(24,100%,50%); + border-radius:4px; +} + +table.doxtable td,table.doxtable th { + border:none; +} + +tr.even,.directory tr.even,table.doxtable tr:nth-child(even) { + background-color:hsl(0,0%,95%); +} + +body { + color:hsl(0,0%,30%); +} + +h1,h2,h2.groupheader,h3,div.toc h3,h4,h5,h6,strong,em { + color:hsl(0,0%,10%); + border-bottom:none; +} + +a,a:hover,a:visited,a:visited:hover,a.el,a.el:visited,.glfwheader a#glfwhome:hover,.tablist a:hover { + color:hsl(24,100%,50%); + text-decoration:none; +} + +.mdescLeft,.mdescRight,.memItemLeft,.memItemRight { + background-color:hsl(0,0%,95%); +} + +div.directory { + border-collapse:inherit; + border-spacing:0px; + border:2px solid hsl(24,100%,50%); + border-radius:4px; +} + +.directory .levels span { + color:hsl(24,100%,50%); + padding:0.1em 0.5em; + margin:auto 0.25em; + border-radius:2px; + background-color:hsl(24,100%,90%); + text-shadow:none; +} + +td.memSeparator { + height:2px; + border:0px; + background:linear-gradient(to right,hsl(0,0%,95%) 0%,hsl(0,0%,85%) 50%,hsl(0,0%,95%) 100%); +} + +dl.note,dl.pre,dl.post,dl.invariant { + background:linear-gradient(to bottom,hsl(103,80%,90%) 0%,hsl(103,80%,85%) 100%); + box-shadow:inset 0px 0px 32px hsl(103,40%,80%); + color:hsl(103,80%,10%); + border:2px solid hsl(103,40%,75%); +} + +dl.warning,dl.attention { + background:linear-gradient(to bottom,hsl(34,80%,90%) 0%,hsl(34,80%,85%) 100%); + box-shadow:inset 0px 0px 32px hsl(34,40%,80%); + color:hsl(34,80%,10%); + border:2px solid hsl(34,40%,75%); +} + +dl.deprecated,dl.bug { + background:linear-gradient(to bottom,hsl(333,80%,90%) 0%,hsl(333,80%,85%) 100%); + box-shadow:inset 0px 0px 32px hsl(333,40%,80%); + color:hsl(333,80%,10%); + border:2px solid hsl(333,40%,75%); +} + +dl.todo,dl.test { + background:linear-gradient(to bottom,hsl(200,80%,90%) 0%,hsl(200,80%,85%) 100%); + box-shadow:inset 0px 0px 32px hsl(200,40%,80%); + color:hsl(200,80%,10%); + border:2px solid hsl(200,40%,75%); +} + +dl.note,dl.pre,dl.post,dl.invariant,dl.warning,dl.attention,dl.deprecated,dl.bug,dl.todo,dl.test { + border-radius:4px; + padding:1em; + text-shadow:0px 1px 1px hsl(0,0%,100%); +} + +div.toc { + background:linear-gradient(to bottom,hsl(34,0%,95%) 0%,hsl(24,0%,90%) 100%); + box-shadow:inset 0px 0px 32px hsl(24,0%,90%); + text-shadow:0px 1px 1px hsl(24,0%,100%); + color:hsl(0,0%,10%); + border:2px solid hsl(24,0%,90%); + border-radius:4px; + float:none; + width:auto; +} + +div.toc h3 { + font-size:1.17em; +} + +div.toc ul { + padding-left:1.5em; +} + +div.toc li { + background:none; + font-size:1em; + padding-left:0em; + list-style-type:disc; +} + +div.ah { + background-image:none; +} + +div.fragment,pre.fragment { + background-color:hsl(0,0%,20%); + border-radius:4px; + border-width:0px; + padding:0.5em 2em; + overflow:auto; + border-left:4px solid hsl(0,0%,80%); +} + +div.line,pre.fragment { + color:hsl(60,30%,96%); +} + +a.code,a.code:visited,span.preprocessor,span.comment { + color:hsl(80,76%,53%); +} + +span.keyword,span.keywordtype,span.keywordflow { + color:hsl(190,81%,67%); +} + +span.stringliteral { + color:hsl(54,70%,68%); +} + +code { + background-color:hsl(0,0%,95%); + padding:0.1em; + border-radius: 4px; +} diff --git a/docs/footer.html b/docs/footer.html new file mode 100644 index 00000000..b0434ca1 --- /dev/null +++ b/docs/footer.html @@ -0,0 +1,7 @@ + + + diff --git a/docs/header.html b/docs/header.html new file mode 100644 index 00000000..54dbb104 --- /dev/null +++ b/docs/header.html @@ -0,0 +1,34 @@ + + + + + + +$projectname: $title +$title + + + +$treeview +$search +$mathjax + +$extrastylesheet + + +
+ + +
+ +
+ + diff --git a/include/GLFW/glfw3.h b/include/GLFW/glfw3.h index de2798b9..477fd2c3 100644 --- a/include/GLFW/glfw3.h +++ b/include/GLFW/glfw3.h @@ -133,10 +133,38 @@ extern "C" { /* 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 */ -#include +#if !defined(GLFW_INCLUDE_NONE) + #include +#endif - -/* ---------------- GLFW related system specific defines ----------------- */ +/* Include the chosen client API headers. + */ +#if defined(__APPLE_CC__) + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif !defined(GLFW_INCLUDE_NONE) + #define GL_GLEXT_LEGACY + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#else + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif defined(GLFW_INCLUDE_ES1) + #include + #elif defined(GLFW_INCLUDE_ES2) + #include + #elif defined(GLFW_INCLUDE_ES3) + #include + #elif !defined(GLFW_INCLUDE_NONE) + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#endif #if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) /* GLFW_DLL is defined by users of GLFW when compiling programs that will link @@ -173,35 +201,6 @@ extern "C" { /* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ -/* Include the chosen client API headers. - */ -#if defined(__APPLE_CC__) - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #elif !defined(GLFW_INCLUDE_NONE) - #define GL_GLEXT_LEGACY - #include - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#else - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #elif defined(GLFW_INCLUDE_ES1) - #include - #elif defined(GLFW_INCLUDE_ES2) - #include - #elif defined(GLFW_INCLUDE_ES3) - #include - #elif !defined(GLFW_INCLUDE_NONE) - #include - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#endif - /************************************************************************* * GLFW API tokens @@ -228,7 +227,7 @@ extern "C" { * API changes. * @ingroup init */ -#define GLFW_VERSION_REVISION 2 +#define GLFW_VERSION_REVISION 3 /*! @} */ /*! @name Key and button actions @@ -793,7 +792,7 @@ typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); * * @ingroup monitor */ -typedef struct +typedef struct GLFWvidmode { /*! The width, in screen coordinates, of the video mode. */ @@ -823,7 +822,7 @@ typedef struct * * @ingroup monitor */ -typedef struct +typedef struct GLFWgammaramp { /*! An array of value describing the response of the red channel. */ @@ -1244,6 +1243,10 @@ GLFWAPI void glfwWindowHint(int target, int hint); * information from the application's bundle. For more information on bundles, * see the Bundle Programming Guide provided by Apple. * + * @remarks The swap interval is not set during window creation, but is left at + * the default value for that platform. For more information, see @ref + * glfwSwapInterval. + * * @note This function may only be called from the main thread. * * @sa glfwDestroyWindow @@ -1854,9 +1857,9 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); * * @param[in] window The desired window. * @param[in] xpos The desired x-coordinate, relative to the left edge of the - * client area, or `NULL`. + * client area. * @param[in] ypos The desired y-coordinate, relative to the top edge of the - * client area, or `NULL`. + * client area. * * @sa glfwGetCursorPos * @@ -2202,6 +2205,11 @@ GLFWAPI void glfwSwapBuffers(GLFWwindow* window); * * @remarks This function may be called from secondary threads. * + * @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 + * 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. diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index b422e13c..0e92c4a2 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -105,8 +105,6 @@ typedef struct _GLFWlibraryNS id autoreleasePool; id cursor; - GLboolean cursorHidden; - char* clipboardString; _GLFWjoy joysticks[GLFW_JOYSTICK_LAST + 1]; diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 4a2c0c35..b1b324d7 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -30,6 +30,25 @@ #include +// Center the cursor in the view of the window +// +static void centerCursor(_GLFWwindow *window) +{ + int width, height; + _glfwPlatformGetWindowSize(window, &width, &height); + _glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0); +} + +// Update the cursor to match the specified cursor mode +// +static void setModeCursor(_GLFWwindow* window, int mode) +{ + if (mode == GLFW_CURSOR_NORMAL) + [[NSCursor arrowCursor] set]; + else + [(NSCursor*) _glfw.ns.cursor set]; +} + // Enter fullscreen mode // static void enterFullscreenMode(_GLFWwindow* window) @@ -94,13 +113,6 @@ static NSRect convertRectToBacking(_GLFWwindow* window, NSRect contentRect) @implementation GLFWWindowDelegate -static void centerCursor(_GLFWwindow *window) -{ - int width, height; - _glfwPlatformGetWindowSize(window, &width, &height); - _glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0); -} - - (id)initWithGlfwWindow:(_GLFWwindow *)initWindow { self = [super init]; @@ -159,14 +171,13 @@ static void centerCursor(_GLFWwindow *window) - (void)windowDidBecomeKey:(NSNotification *)notification { _glfwInputWindowFocus(window, GL_TRUE); - - if (window->cursorMode == GLFW_CURSOR_DISABLED) - centerCursor(window); + _glfwPlatformSetCursorMode(window, window->cursorMode); } - (void)windowDidResignKey:(NSNotification *)notification { _glfwInputWindowFocus(window, GL_FALSE); + _glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL); } @end @@ -445,6 +456,11 @@ static int translateKey(unsigned int key) return YES; } +- (void)cursorUpdate:(NSEvent *)event +{ + setModeCursor(window, window->cursorMode); +} + - (void)mouseDown:(NSEvent *)event { _glfwInputMouseClick(window, @@ -548,7 +564,8 @@ static int translateKey(unsigned int key) } NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | - NSTrackingActiveAlways | + NSTrackingActiveInKeyWindow | + NSTrackingCursorUpdate | NSTrackingInVisibleRect; trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] @@ -566,9 +583,6 @@ static int translateKey(unsigned int key) const int mods = translateFlags([event modifierFlags]); _glfwInputKey(window, key, [event keyCode], GLFW_PRESS, mods); - if (mods & GLFW_MOD_SUPER) - return; - NSString* characters = [event characters]; NSUInteger i, length = [characters length]; @@ -628,12 +642,6 @@ static int translateKey(unsigned int key) _glfwInputScroll(window, deltaX, deltaY); } -- (void)resetCursorRects -{ - [self discardCursorRects]; - [self addCursorRect:[self bounds] cursor:_glfw.ns.cursor]; -} - @end @@ -762,7 +770,7 @@ static void createMenuBar(void) [NSApp setWindowsMenu:windowMenu]; [windowMenuItem setSubmenu:windowMenu]; - [windowMenu addItemWithTitle:@"Miniaturize" + [windowMenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; [windowMenu addItemWithTitle:@"Zoom" @@ -851,7 +859,6 @@ static GLboolean createWindow(_GLFWwindow* window, [window->ns.object setContentView:window->ns.view]; [window->ns.object setDelegate:window->ns.delegate]; [window->ns.object setAcceptsMouseMovedEvents:YES]; - [window->ns.object disableCursorRects]; [window->ns.object center]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 @@ -1061,37 +1068,15 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode) { - if (mode == GLFW_CURSOR_HIDDEN) - { - [window->ns.object enableCursorRects]; - [window->ns.object invalidateCursorRectsForView:window->ns.view]; - } - else - { - [window->ns.object disableCursorRects]; - [window->ns.object invalidateCursorRectsForView:window->ns.view]; - } + setModeCursor(window, mode); if (mode == GLFW_CURSOR_DISABLED) { CGAssociateMouseAndMouseCursorPosition(false); - - if (!_glfw.ns.cursorHidden) - { - [NSCursor hide]; - _glfw.ns.cursorHidden = GL_TRUE; - } + centerCursor(window); } else - { CGAssociateMouseAndMouseCursorPosition(true); - - if (_glfw.ns.cursorHidden) - { - [NSCursor unhide]; - _glfw.ns.cursorHidden = GL_FALSE; - } - } } diff --git a/src/glx_context.c b/src/glx_context.c index f0f7ed06..58c25757 100644 --- a/src/glx_context.c +++ b/src/glx_context.c @@ -386,7 +386,7 @@ int _glfwCreateContext(_GLFWwindow* window, !_glfw.glx.ARB_create_context_profile || !_glfw.glx.EXT_create_context_es2_profile) { - _glfwInputError(GLFW_VERSION_UNAVAILABLE, + _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: OpenGL ES requested but " "GLX_EXT_create_context_es2_profile is unavailable"); return GL_FALSE; diff --git a/src/init.c b/src/init.c index 4e334d0e..d34abea7 100644 --- a/src/init.c +++ b/src/init.c @@ -130,7 +130,7 @@ GLFWAPI int glfwInit(void) _glfw.monitors = _glfwPlatformGetMonitors(&_glfw.monitorCount); if (_glfw.monitors == NULL) { - _glfwErrorCallback(GLFW_PLATFORM_ERROR, "No monitors found"); + _glfwInputError(GLFW_PLATFORM_ERROR, "No monitors found"); _glfwPlatformTerminate(); return GL_FALSE; } diff --git a/src/nsgl_context.m b/src/nsgl_context.m index 2c3dcca6..1051fe7d 100644 --- a/src/nsgl_context.m +++ b/src/nsgl_context.m @@ -40,7 +40,7 @@ int _glfwInitContextAPI(void) if (pthread_key_create(&_glfw.nsgl.current, NULL) != 0) { _glfwInputError(GLFW_PLATFORM_ERROR, - "NSOpenGL: Failed to create context TLS"); + "NSGL: Failed to create context TLS"); return GL_FALSE; } @@ -81,16 +81,15 @@ int _glfwCreateContext(_GLFWwindow* window, if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSOpenGL: This API does not support OpenGL ES"); + "NSGL: This API does not support OpenGL ES"); return GL_FALSE; } #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 - // Fail if any OpenGL version above 2.1 other than 3.2 was requested if (wndconfig->glMajor == 3 && wndconfig->glMinor < 2) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSOpenGL: The targeted version of OS X does not " + "NSGL: The targeted version of OS X does not " "support OpenGL 3.0 or 3.1"); return GL_FALSE; } @@ -100,7 +99,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (!wndconfig->glForward) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSOpenGL: The targeted version of OS X only " + "NSGL: The targeted version of OS X only " "supports OpenGL 3.2 and later versions if they " "are forward-compatible"); return GL_FALSE; @@ -109,7 +108,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSOpenGL: The targeted version of OS X only " + "NSGL: The targeted version of OS X only " "supports OpenGL 3.2 and later versions if they " "use the core profile"); return GL_FALSE; @@ -120,7 +119,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (wndconfig->glMajor > 2) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSOpenGL: The targeted version of OS X does not " + "NSGL: The targeted version of OS X does not " "support OpenGL version 3.0 or above"); return GL_FALSE; } @@ -130,7 +129,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (wndconfig->glRobustness) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, - "NSOpenGL: OS X does not support OpenGL robustness " + "NSGL: OS X does not support OpenGL robustness " "strategies"); return GL_FALSE; } @@ -191,7 +190,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (window->nsgl.pixelFormat == nil) { _glfwInputError(GLFW_PLATFORM_ERROR, - "NSOpenGL: Failed to create OpenGL pixel format"); + "NSGL: Failed to create OpenGL pixel format"); return GL_FALSE; } @@ -206,7 +205,7 @@ int _glfwCreateContext(_GLFWwindow* window, if (window->nsgl.context == nil) { _glfwInputError(GLFW_PLATFORM_ERROR, - "NSOpenGL: Failed to create OpenGL context"); + "NSGL: Failed to create OpenGL context"); return GL_FALSE; } diff --git a/src/wgl_context.c b/src/wgl_context.c index 51623de1..ccd7f574 100644 --- a/src/wgl_context.c +++ b/src/wgl_context.c @@ -529,7 +529,7 @@ int _glfwAnalyzeContext(const _GLFWwindow* window, !window->wgl.ARB_create_context_profile || !window->wgl.EXT_create_context_es2_profile) { - _glfwInputError(GLFW_VERSION_UNAVAILABLE, + _glfwInputError(GLFW_API_UNAVAILABLE, "WGL: OpenGL ES requested but " "WGL_ARB_create_context_es2_profile is unavailable"); return _GLFW_RECREATION_IMPOSSIBLE; diff --git a/src/win32_platform.h b/src/win32_platform.h index e31abd9d..1652ab8c 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -52,10 +52,15 @@ #define UNICODE #endif -// GLFW requires Windows XP -#ifndef WINVER +// GLFW requires Windows XP or later +#if WINVER < 0x0501 + #undef WINVER #define WINVER 0x0501 #endif +#if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 +#endif #include #include diff --git a/src/win32_window.c b/src/win32_window.c index 7b1ce655..139e661d 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -480,6 +480,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, } case WM_CHAR: + case WM_SYSCHAR: { _glfwInputChar(window, (unsigned int) wParam); return 0; diff --git a/src/x11_init.c b/src/x11_init.c index 1c28e5f3..3d94ff5e 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -48,7 +48,7 @@ static int translateKey(int keyCode) // Note: This way we always force "NumLock = ON", which is intentional // since the returned key code should correspond to a physical // location. - keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 1, 0); + keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 0, 1); switch (keySym) { case XK_KP_0: return GLFW_KEY_KP_0; diff --git a/src/x11_window.c b/src/x11_window.c index 9b3791c2..f0e872e4 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -513,15 +513,12 @@ static void processEvent(XEvent *event) { const int key = translateKey(event->xkey.keycode); const int mods = translateState(event->xkey.state); + const int character = translateChar(&event->xkey); _glfwInputKey(window, key, event->xkey.keycode, GLFW_PRESS, mods); - if (!(mods & GLFW_MOD_CONTROL) && !(mods & GLFW_MOD_ALT)) - { - const int character = translateChar(&event->xkey); - if (character != -1) - _glfwInputChar(window, character); - } + if (character != -1) + _glfwInputChar(window, character); break; } @@ -556,6 +553,16 @@ static void processEvent(XEvent *event) else if (event->xbutton.button == Button7) _glfwInputScroll(window, 1.0, 0.0); + else + { + // 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, + GLFW_PRESS, + mods); + } + break; } @@ -584,6 +591,15 @@ static void processEvent(XEvent *event) GLFW_RELEASE, mods); } + else if (event->xbutton.button > Button7) + { + // 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, + GLFW_RELEASE, + mods); + } break; }