/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2011 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Sam Lantinga slouken@libsdl.org */ #include "SDL_config.h" #include "SDL_events.h" #include "SDL_cocoavideo.h" #include "../../events/SDL_mouse_c.h" static SDL_Cursor * Cocoa_CreateDefaultCursor() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSCursor *nscursor; SDL_Cursor *cursor = NULL; nscursor = [NSCursor arrowCursor]; if (nscursor) { cursor = SDL_calloc(1, sizeof(*cursor)); if (cursor) { cursor->driverdata = nscursor; [nscursor retain]; } } [pool release]; return cursor; } static SDL_Cursor * Cocoa_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSImage *nsimage; NSCursor *nscursor = NULL; SDL_Cursor *cursor = NULL; nsimage = Cocoa_CreateImage(surface); if (nsimage) { nscursor = [[NSCursor alloc] initWithImage: nsimage hotSpot: NSMakePoint(hot_x, hot_y)]; } if (nscursor) { cursor = SDL_calloc(1, sizeof(*cursor)); if (cursor) { cursor->driverdata = nscursor; } } [pool release]; return cursor; } static void Cocoa_FreeCursor(SDL_Cursor * cursor) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSCursor *nscursor = (NSCursor *)cursor->driverdata; [nscursor release]; SDL_free(cursor); [pool release]; } static int Cocoa_ShowCursor(SDL_Cursor * cursor) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if (SDL_GetMouseFocus()) { if (cursor) { NSCursor *nscursor = (NSCursor *)cursor->driverdata; [nscursor set]; [NSCursor unhide]; } else { [NSCursor hide]; } } [pool release]; return 0; } static void Cocoa_WarpMouse(SDL_Window * window, int x, int y) { CGPoint point; point.x = (float)window->x + x; point.y = (float)window->y + y; CGWarpMouseCursorPosition(point); } static int Cocoa_SetRelativeMouseMode(SDL_bool enabled) { CGError result; if (enabled) { result = CGAssociateMouseAndMouseCursorPosition(NO); } else { result = CGAssociateMouseAndMouseCursorPosition(YES); } if (result != kCGErrorSuccess) { SDL_SetError("CGAssociateMouseAndMouseCursorPosition() failed"); return -1; } return 0; } void Cocoa_InitMouse(_THIS) { SDL_Mouse *mouse = SDL_GetMouse(); mouse->CreateCursor = Cocoa_CreateCursor; mouse->ShowCursor = Cocoa_ShowCursor; mouse->FreeCursor = Cocoa_FreeCursor; mouse->WarpMouse = Cocoa_WarpMouse; mouse->SetRelativeMouseMode = Cocoa_SetRelativeMouseMode; SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor()); } static int ConvertMouseButtonToSDL(int button) { switch (button) { case 0: return(SDL_BUTTON_LEFT); /* 1 */ case 1: return(SDL_BUTTON_RIGHT); /* 3 */ case 2: return(SDL_BUTTON_MIDDLE); /* 2 */ } return button+1; } void Cocoa_HandleMouseEvent(_THIS, NSEvent *event) { SDL_Mouse *mouse = SDL_GetMouse(); if (mouse->relative_mode && [event type] == NSMouseMoved) { float x = [event deltaX]; float y = [event deltaY]; SDL_SendMouseMotion(mouse->focus, 1, (int)x, (int)y); } } void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event) { float x = [event deltaX]; float y = [event deltaY]; if (x > 0) { x += 0.9f; } else if (x < 0) { x -= 0.9f; } if (y > 0) { y += 0.9f; } else if (y < 0) { y -= 0.9f; } SDL_SendMouseWheel(window, (int)x, (int)y); } void Cocoa_QuitMouse(_THIS) { } /* vi: set ts=4 sw=4 expandtab: */