Merge pull request #52 from nilium/osx-cursor-hidden-patch

Added support for hidden cursor mode on OS X.
This commit is contained in:
Camilla Berglund 2013-04-18 06:22:53 -07:00
commit dc58dd1bef

View File

@ -48,6 +48,16 @@
@implementation GLFWWindowDelegate
static void resetMouseCursor(_GLFWwindow *window)
{
if (window->cursorMode == GLFW_CURSOR_CAPTURED)
{
int width, height;
_glfwPlatformGetWindowSize(window, &width, &height);
_glfwPlatformSetCursorPos(window, width / 2.0, height / 2.0);
}
}
- (id)initWithGlfwWindow:(_GLFWwindow *)initWindow
{
self = [super init];
@ -70,6 +80,8 @@
int width, height;
_glfwPlatformGetWindowSize(window, &width, &height);
_glfwInputWindowSize(window, width, height);
resetMouseCursor(window);
}
- (void)windowDidMove:(NSNotification *)notification
@ -79,6 +91,8 @@
int x, y;
_glfwPlatformGetWindowPos(window, &x, &y);
_glfwInputWindowPos(window, x, y);
resetMouseCursor(window);
}
- (void)windowDidMiniaturize:(NSNotification *)notification
@ -94,6 +108,8 @@
- (void)windowDidBecomeKey:(NSNotification *)notification
{
_glfwInputWindowFocus(window, GL_TRUE);
resetMouseCursor(window);
}
- (void)windowDidResignKey:(NSNotification *)notification
@ -293,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;
@ -305,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];
@ -478,6 +506,11 @@ static int convertMacKeyCode(unsigned int macKeyCode)
_glfwInputScroll(window, deltaX, deltaY);
}
- (void)resetCursorRects
{
[self addCursorRect:[self bounds] cursor:emptyCursor];
}
@end
@ -913,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;
}