diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 76f0811d..53681199 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -309,6 +309,8 @@ static int convertMacKeyCode(unsigned int macKeyCode) // Content view class for the GLFW window //------------------------------------------------------------------------ +static NSCursor *emptyCursor = nil; + @interface GLFWContentView : NSView { _GLFWwindow* window; @@ -321,6 +323,16 @@ static int convertMacKeyCode(unsigned int macKeyCode) @implementation GLFWContentView ++ (void)initialize +{ + if (self == [GLFWContentView class]) + { + NSImage *emptyImage = [[NSImage alloc] initWithSize:NSMakeSize(1, 1)]; + emptyCursor = [[NSCursor alloc] initWithImage:emptyImage hotSpot:NSZeroPoint]; + [emptyImage release]; + } +} + - (id)initWithGlfwWindow:(_GLFWwindow *)initWindow { self = [super init]; @@ -494,6 +506,11 @@ static int convertMacKeyCode(unsigned int macKeyCode) _glfwInputScroll(window, deltaX, deltaY); } +- (void)resetCursorRects +{ + [self addCursorRect:[self bounds] cursor:emptyCursor]; +} + @end @@ -929,16 +946,21 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double x, double y) void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode) { + // Unhide the cursor if the last mode was CAPTURED. + if (window->cursorMode == GLFW_CURSOR_CAPTURED) { + CGAssociateMouseAndMouseCursorPosition(true); + } + switch (mode) { case GLFW_CURSOR_NORMAL: - [NSCursor unhide]; - CGAssociateMouseAndMouseCursorPosition(true); + [window->ns.object disableCursorRects]; break; case GLFW_CURSOR_HIDDEN: + [window->ns.object enableCursorRects]; break; case GLFW_CURSOR_CAPTURED: - [NSCursor hide]; + [window->ns.object enableCursorRects]; CGAssociateMouseAndMouseCursorPosition(false); break; }