Cocoa: Hide cursor instead of using blank image

When cursor isn't in normal mode and should be hidden, use [NSCursor hide]
method instead of setting it to blank image. This should prevent
situations when hidden cursor becomes visible after system notification
was shown.

Fixes #971.
Closes #1028.
This commit is contained in:
Sergey Tikhomirov 2017-06-05 00:26:55 +03:00
parent c23fca6343
commit 80e4922b5e
3 changed files with 23 additions and 19 deletions

View File

@ -352,9 +352,6 @@ void _glfwPlatformTerminate(void)
_glfw.ns.listener = nil; _glfw.ns.listener = nil;
} }
[_glfw.ns.cursor release];
_glfw.ns.cursor = nil;
free(_glfw.ns.clipboardString); free(_glfw.ns.clipboardString);
_glfwTerminateNSGL(); _glfwTerminateNSGL();

View File

@ -102,7 +102,6 @@ typedef struct _GLFWlibraryNS
CGEventSourceRef eventSource; CGEventSourceRef eventSource;
id delegate; id delegate;
id autoreleasePool; id autoreleasePool;
id cursor;
TISInputSourceRef inputSource; TISInputSourceRef inputSource;
IOHIDManagerRef hidManager; IOHIDManagerRef hidManager;
id unicodeData; id unicodeData;

View File

@ -88,19 +88,35 @@ static GLFWbool cursorInClientArea(_GLFWwindow* window)
return [window->ns.view mouse:pos inRect:[window->ns.view frame]]; return [window->ns.view mouse:pos inRect:[window->ns.view frame]];
} }
// Updates cursor visibility
//
static void setCursorVisibility(_GLFWwindow* window, BOOL makeVisible)
{
static BOOL isCursorVisible = YES;
if (makeVisible && !isCursorVisible)
[NSCursor unhide];
else if (!makeVisible && isCursorVisible)
[NSCursor hide];
isCursorVisible = makeVisible;
}
// Updates the cursor image according to its cursor mode // Updates the cursor image according to its cursor mode
// //
static void updateCursorImage(_GLFWwindow* window) static void updateCursorImage(_GLFWwindow* window)
{ {
if (window->cursorMode == GLFW_CURSOR_NORMAL) if (window->cursorMode == GLFW_CURSOR_NORMAL)
{ {
setCursorVisibility(window, YES);
if (window->cursor) if (window->cursor)
[(NSCursor*) window->cursor->ns.object set]; [(NSCursor*) window->cursor->ns.object set];
else else
[[NSCursor arrowCursor] set]; [[NSCursor arrowCursor] set];
} }
else else
[(NSCursor*) _glfw.ns.cursor set]; setCursorVisibility(window, NO);
} }
// Transforms the specified y-coordinate between the CG display and NS screen // Transforms the specified y-coordinate between the CG display and NS screen
@ -363,20 +379,6 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
@implementation GLFWContentView @implementation GLFWContentView
+ (void)initialize
{
if (self == [GLFWContentView class])
{
if (_glfw.ns.cursor == nil)
{
NSImage* data = [[NSImage alloc] initWithSize:NSMakeSize(16, 16)];
_glfw.ns.cursor = [[NSCursor alloc] initWithImage:data
hotSpot:NSZeroPoint];
[data release];
}
}
}
- (id)initWithGlfwWindow:(_GLFWwindow *)initWindow - (id)initWithGlfwWindow:(_GLFWwindow *)initWindow
{ {
self = [super init]; self = [super init];
@ -522,11 +524,17 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
- (void)mouseExited:(NSEvent *)event - (void)mouseExited:(NSEvent *)event
{ {
if (window->cursorMode == GLFW_CURSOR_HIDDEN)
setCursorVisibility(window, YES);
_glfwInputCursorEnter(window, GLFW_FALSE); _glfwInputCursorEnter(window, GLFW_FALSE);
} }
- (void)mouseEntered:(NSEvent *)event - (void)mouseEntered:(NSEvent *)event
{ {
if (window->cursorMode == GLFW_CURSOR_HIDDEN)
setCursorVisibility(window, NO);
_glfwInputCursorEnter(window, GLFW_TRUE); _glfwInputCursorEnter(window, GLFW_TRUE);
} }