diff --git a/README.md b/README.md index 98239920..ba98864d 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,8 @@ information on what to include when reporting a bug. - [Cocoa] Bugfix: Full screen framebuffer was incorrectly sized for some video modes (#682) - [Cocoa] Bugfix: A string object for IME was updated non-idiomatically (#1050) +- [Cocoa] Bugfix: A hidden or disabled cursor would become visible when a user + notification was shown (#971,#1028) - [WGL] Added support for `WGL_EXT_colorspace` for OpenGL ES contexts - [WGL] Added support for `WGL_ARB_create_context_no_error` - [GLX] Added support for `GLX_ARB_create_context_no_error` diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index 95223f34..f0ba4e85 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -102,6 +102,7 @@ typedef struct _GLFWlibraryNS CGEventSourceRef eventSource; id delegate; id autoreleasePool; + GLFWbool cursorHidden; TISInputSourceRef inputSource; IOHIDManagerRef hidManager; id unicodeData; diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 41fdb4c8..7b5939f6 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -88,18 +88,26 @@ static GLFWbool cursorInClientArea(_GLFWwindow* window) return [window->ns.view mouse:pos inRect:[window->ns.view frame]]; } -// Updates cursor visibility +// Hides the cursor if not already hidden // -static void setCursorVisibility(_GLFWwindow* window, BOOL makeVisible) +static void hideCursor(_GLFWwindow* window) { - static BOOL isCursorVisible = YES; - - if (makeVisible && !isCursorVisible) - [NSCursor unhide]; - else if (!makeVisible && isCursorVisible) + if (!_glfw.ns.cursorHidden) + { [NSCursor hide]; + _glfw.ns.cursorHidden = GLFW_TRUE; + } +} - isCursorVisible = makeVisible; +// Shows the cursor if not already shown +// +static void showCursor(_GLFWwindow* window) +{ + if (_glfw.ns.cursorHidden) + { + [NSCursor unhide]; + _glfw.ns.cursorHidden = GLFW_FALSE; + } } // Updates the cursor image according to its cursor mode @@ -108,7 +116,7 @@ static void updateCursorImage(_GLFWwindow* window) { if (window->cursorMode == GLFW_CURSOR_NORMAL) { - setCursorVisibility(window, YES); + showCursor(window); if (window->cursor) [(NSCursor*) window->cursor->ns.object set]; @@ -116,7 +124,7 @@ static void updateCursorImage(_GLFWwindow* window) [[NSCursor arrowCursor] set]; } else - setCursorVisibility(window, NO); + hideCursor(window); } // Transforms the specified y-coordinate between the CG display and NS screen @@ -525,7 +533,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 }; - (void)mouseExited:(NSEvent *)event { if (window->cursorMode == GLFW_CURSOR_HIDDEN) - setCursorVisibility(window, YES); + showCursor(window); _glfwInputCursorEnter(window, GLFW_FALSE); } @@ -533,7 +541,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 }; - (void)mouseEntered:(NSEvent *)event { if (window->cursorMode == GLFW_CURSOR_HIDDEN) - setCursorVisibility(window, NO); + hideCursor(window); _glfwInputCursorEnter(window, GLFW_TRUE); }