Add GLFW_CURSOR_HIDDEN.

Uses addCursorRect:cursor: as discussed.. well, too long ago. Anyhow,
this will effectively hide the cursor while it is inside a window with
GLFW_CURSOR_HIDDEN or GLFW_CURSOR_CAPTURED enabled. This shouldn't mess
up cursor retain counts either, unlike previous uses of the hide/unhide
methods on NSCursor.

It does allocate a small, single-pixel image for an invisible cursor,
as well as the cursor itself, but that shouldn't be too much trouble.
This commit is contained in:
Noel Cower 2013-04-16 16:37:06 -06:00
parent 1f148f2bd6
commit 1ba8fd05c0

View File

@ -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;
}