diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 0eff37ac2..8e952bc55 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -39,19 +39,31 @@ static void centerCursor(_GLFWwindow *window) _glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0); } -// Update the cursor to match the specified cursor mode +// Get the cursor object that window uses in the specified cursor mode // -static void setModeCursor(_GLFWwindow* window) +static NSCursor* getModeCursor(_GLFWwindow* window) { if (window->cursorMode == GLFW_CURSOR_NORMAL) { if (window->cursor) - [(NSCursor*) window->cursor->ns.object set]; + return (NSCursor*) window->cursor->ns.object; else - [[NSCursor arrowCursor] set]; + return [NSCursor arrowCursor]; } else - [(NSCursor*) _glfw.ns.cursor set]; + return (NSCursor*) _glfw.ns.cursor; +} + +// Update the cursor to match the specified cursor mode +// +static void updateModeCursor(_GLFWwindow* window) +{ + // This is required for the cursor to update if cursor is inside the window + NSCursor* cursor = getModeCursor(window); + [cursor set]; + + // This is required for the cursor to update if cursor is outside the window + [window->ns.object invalidateCursorRectsForView:window->ns.view]; } // Enter fullscreen mode @@ -197,8 +209,6 @@ static NSRect convertRectToBacking(_GLFWwindow* window, NSRect contentRect) - (void)windowDidResignKey:(NSNotification *)notification { _glfwInputWindowFocus(window, GL_FALSE); - window->cursorMode = GLFW_CURSOR_NORMAL; - _glfwPlatformApplyCursorMode(window); } @end @@ -480,7 +490,7 @@ static int translateKey(unsigned int key) - (void)cursorUpdate:(NSEvent *)event { - setModeCursor(window); + updateModeCursor(window); } - (void)mouseDown:(NSEvent *)event @@ -677,10 +687,9 @@ static int translateKey(unsigned int key) - (void)resetCursorRects { - // This makes the cursor dissapear when the window is - // resized or received a drag operation - [self discardCursorRects]; - [self addCursorRect:[self bounds] cursor:_glfw.ns.cursor]; + NSCursor* cursor = getModeCursor(window); + + [self addCursorRect:[self bounds] cursor:cursor]; } - (NSDragOperation)draggingEntered:(id )sender @@ -1201,7 +1210,7 @@ void _glfwPlatformPostEmptyEvent(void) void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) { - setModeCursor(window); + updateModeCursor(window); if (window->monitor) { @@ -1221,7 +1230,7 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) void _glfwPlatformApplyCursorMode(_GLFWwindow* window) { - setModeCursor(window); + updateModeCursor(window); if (window->cursorMode == GLFW_CURSOR_DISABLED) {