Fixed the responder chain for event handling, the listener fully handles mouse events - even in fullscreen mode.

The only reason we need a custom view is to handle right mouse down.

Implemented mouse grabbing, although it's kind of clunky right now.  I'll be adding a relative mode that will be smoother soon.
This commit is contained in:
Sam Lantinga 2011-02-21 10:50:53 -08:00
parent c379a10fa4
commit 658997241d
5 changed files with 161 additions and 177 deletions

View file

@ -29,43 +29,7 @@
#include "../video/SDL_sysvideo.h" #include "../video/SDL_sysvideo.h"
/* Global mouse information */ /* The mouse state */
typedef struct SDL_Mouse SDL_Mouse;
struct SDL_Mouse
{
/* Create a cursor from a surface */
SDL_Cursor *(*CreateCursor) (SDL_Surface * surface, int hot_x, int hot_y);
/* Show the specified cursor, or hide if cursor is NULL */
int (*ShowCursor) (SDL_Cursor * cursor);
/* This is called when a mouse motion event occurs */
void (*MoveCursor) (SDL_Cursor * cursor);
/* Free a window manager cursor */
void (*FreeCursor) (SDL_Cursor * cursor);
/* Warp the mouse to (x,y) */
void (*WarpMouse) (SDL_Mouse * mouse, SDL_Window * window, int x, int y);
/* Data common to all mice */
SDL_Window *focus;
int x;
int y;
int xdelta;
int ydelta;
int last_x, last_y; /* the last reported x and y coordinates */
Uint8 buttonstate;
SDL_bool relative_mode;
SDL_Cursor *cursors;
SDL_Cursor *def_cursor;
SDL_Cursor *cur_cursor;
SDL_bool cursor_shown;
};
static SDL_Mouse SDL_mouse; static SDL_Mouse SDL_mouse;
@ -76,6 +40,12 @@ SDL_MouseInit(void)
return (0); return (0);
} }
SDL_Mouse *
SDL_GetMouse(void)
{
return &SDL_mouse;
}
void void
SDL_ResetMouse(void) SDL_ResetMouse(void)
{ {
@ -85,7 +55,7 @@ SDL_ResetMouse(void)
SDL_Window * SDL_Window *
SDL_GetMouseFocus(void) SDL_GetMouseFocus(void)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
return mouse->focus; return mouse->focus;
} }
@ -93,7 +63,7 @@ SDL_GetMouseFocus(void)
void void
SDL_SetMouseFocus(SDL_Window * window) SDL_SetMouseFocus(SDL_Window * window)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->focus == window) { if (mouse->focus == window) {
return; return;
@ -114,7 +84,7 @@ SDL_SetMouseFocus(SDL_Window * window)
int int
SDL_SendMouseMotion(SDL_Window * window, int relative, int x, int y) SDL_SendMouseMotion(SDL_Window * window, int relative, int x, int y)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
int posted; int posted;
int xrel; int xrel;
int yrel; int yrel;
@ -204,7 +174,7 @@ SDL_SendMouseMotion(SDL_Window * window, int relative, int x, int y)
int int
SDL_SendMouseButton(SDL_Window * window, Uint8 state, Uint8 button) SDL_SendMouseButton(SDL_Window * window, Uint8 state, Uint8 button)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
int posted; int posted;
Uint32 type; Uint32 type;
@ -253,7 +223,7 @@ SDL_SendMouseButton(SDL_Window * window, Uint8 state, Uint8 button)
int int
SDL_SendMouseWheel(SDL_Window * window, int x, int y) SDL_SendMouseWheel(SDL_Window * window, int x, int y)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
int posted; int posted;
if (window) { if (window) {
@ -285,7 +255,7 @@ SDL_MouseQuit(void)
Uint8 Uint8
SDL_GetMouseState(int *x, int *y) SDL_GetMouseState(int *x, int *y)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
if (x) { if (x) {
*x = mouse->x; *x = mouse->x;
@ -299,7 +269,7 @@ SDL_GetMouseState(int *x, int *y)
Uint8 Uint8
SDL_GetRelativeMouseState(int *x, int *y) SDL_GetRelativeMouseState(int *x, int *y)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
if (x) { if (x) {
*x = mouse->xdelta; *x = mouse->xdelta;
@ -315,10 +285,10 @@ SDL_GetRelativeMouseState(int *x, int *y)
void void
SDL_WarpMouseInWindow(SDL_Window * window, int x, int y) SDL_WarpMouseInWindow(SDL_Window * window, int x, int y)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
if (mouse->WarpMouse) { if (mouse->WarpMouse) {
mouse->WarpMouse(mouse, window, x, y); mouse->WarpMouse(window, x, y);
} else { } else {
SDL_SendMouseMotion(window, 0, x, y); SDL_SendMouseMotion(window, 0, x, y);
} }
@ -327,7 +297,7 @@ SDL_WarpMouseInWindow(SDL_Window * window, int x, int y)
int int
SDL_SetRelativeMouseMode(SDL_bool enabled) SDL_SetRelativeMouseMode(SDL_bool enabled)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
/* Flush pending mouse motion */ /* Flush pending mouse motion */
SDL_FlushEvent(SDL_MOUSEMOTION); SDL_FlushEvent(SDL_MOUSEMOTION);
@ -349,7 +319,7 @@ SDL_SetRelativeMouseMode(SDL_bool enabled)
SDL_bool SDL_bool
SDL_GetRelativeMouseMode() SDL_GetRelativeMouseMode()
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
return mouse->relative_mode; return mouse->relative_mode;
} }
@ -358,7 +328,7 @@ SDL_Cursor *
SDL_CreateCursor(const Uint8 * data, const Uint8 * mask, SDL_CreateCursor(const Uint8 * data, const Uint8 * mask,
int w, int h, int hot_x, int hot_y) int w, int h, int hot_x, int hot_y)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
SDL_Surface *surface; SDL_Surface *surface;
SDL_Cursor *cursor; SDL_Cursor *cursor;
int x, y; int x, y;
@ -424,7 +394,7 @@ SDL_CreateCursor(const Uint8 * data, const Uint8 * mask,
void void
SDL_SetCursor(SDL_Cursor * cursor) SDL_SetCursor(SDL_Cursor * cursor)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
/* Set the new cursor */ /* Set the new cursor */
if (cursor) { if (cursor) {
@ -458,7 +428,7 @@ SDL_SetCursor(SDL_Cursor * cursor)
SDL_Cursor * SDL_Cursor *
SDL_GetCursor(void) SDL_GetCursor(void)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
if (!mouse) { if (!mouse) {
return NULL; return NULL;
@ -469,7 +439,7 @@ SDL_GetCursor(void)
void void
SDL_FreeCursor(SDL_Cursor * cursor) SDL_FreeCursor(SDL_Cursor * cursor)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
SDL_Cursor *curr, *prev; SDL_Cursor *curr, *prev;
if (!cursor) { if (!cursor) {
@ -503,7 +473,7 @@ SDL_FreeCursor(SDL_Cursor * cursor)
int int
SDL_ShowCursor(int toggle) SDL_ShowCursor(int toggle)
{ {
SDL_Mouse *mouse = &SDL_mouse; SDL_Mouse *mouse = SDL_GetMouse();
SDL_bool shown; SDL_bool shown;
if (!mouse) { if (!mouse) {

View file

@ -24,15 +24,54 @@
#ifndef _SDL_mouse_c_h #ifndef _SDL_mouse_c_h
#define _SDL_mouse_c_h #define _SDL_mouse_c_h
#include "SDL_mouse.h"
struct SDL_Cursor struct SDL_Cursor
{ {
struct SDL_Cursor *next; struct SDL_Cursor *next;
void *driverdata; void *driverdata;
}; };
typedef struct
{
/* Create a cursor from a surface */
SDL_Cursor *(*CreateCursor) (SDL_Surface * surface, int hot_x, int hot_y);
/* Show the specified cursor, or hide if cursor is NULL */
int (*ShowCursor) (SDL_Cursor * cursor);
/* This is called when a mouse motion event occurs */
void (*MoveCursor) (SDL_Cursor * cursor);
/* Free a window manager cursor */
void (*FreeCursor) (SDL_Cursor * cursor);
/* Warp the mouse to (x,y) */
void (*WarpMouse) (SDL_Window * window, int x, int y);
/* Data common to all mice */
SDL_Window *focus;
int x;
int y;
int xdelta;
int ydelta;
int last_x, last_y; /* the last reported x and y coordinates */
Uint8 buttonstate;
SDL_bool relative_mode;
SDL_Cursor *cursors;
SDL_Cursor *def_cursor;
SDL_Cursor *cur_cursor;
SDL_bool cursor_shown;
} SDL_Mouse;
/* Initialize the mouse subsystem */ /* Initialize the mouse subsystem */
extern int SDL_MouseInit(void); extern int SDL_MouseInit(void);
/* Get the mouse state structure */
SDL_Mouse *SDL_GetMouse(void);
/* Clear the mouse state */ /* Clear the mouse state */
extern void SDL_ResetMouse(void); extern void SDL_ResetMouse(void);

View file

@ -49,62 +49,7 @@ ConvertMouseButtonToSDL(int button)
void void
Cocoa_HandleMouseEvent(_THIS, NSEvent *event) Cocoa_HandleMouseEvent(_THIS, NSEvent *event)
{ {
int i; /* We're correctly using views even in fullscreen mode now */
NSPoint point = { 0, 0 };
SDL_Window *window;
SDL_Window *focus = SDL_GetMouseFocus();
/* See if there are any fullscreen windows that might handle this event */
window = NULL;
for (i = 0; i < _this->num_displays; ++i) {
SDL_VideoDisplay *display = &_this->displays[i];
SDL_Window *candidate = display->fullscreen_window;
if (candidate) {
SDL_Rect bounds;
Cocoa_GetDisplayBounds(_this, display, &bounds);
point = [NSEvent mouseLocation];
point.x = point.x - bounds.x;
point.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - point.y - bounds.y;
if ((point.x >= 0 && point.x < candidate->w) &&
(point.y >= 0 && point.y < candidate->h)) {
/* This is it! */
window = candidate;
break;
} else if (candidate == focus) {
SDL_SetMouseFocus(NULL);
}
}
}
if (!window) {
return;
}
switch ([event type]) {
case NSLeftMouseDown:
case NSOtherMouseDown:
case NSRightMouseDown:
SDL_SendMouseButton(window, SDL_PRESSED, ConvertMouseButtonToSDL([event buttonNumber]));
break;
case NSLeftMouseUp:
case NSOtherMouseUp:
case NSRightMouseUp:
SDL_SendMouseButton(window, SDL_RELEASED, ConvertMouseButtonToSDL([event buttonNumber]));
break;
case NSScrollWheel:
Cocoa_HandleMouseWheel(window, event);
break;
case NSLeftMouseDragged:
case NSRightMouseDragged:
case NSOtherMouseDragged: /* usually middle mouse dragged */
case NSMouseMoved:
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
break;
default: /* just to avoid compiler warnings */
break;
}
} }
void void

View file

@ -29,11 +29,7 @@
typedef struct SDL_WindowData SDL_WindowData; typedef struct SDL_WindowData SDL_WindowData;
/* *INDENT-OFF* */ /* *INDENT-OFF* */
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
@interface Cocoa_WindowListener : NSResponder <NSWindowDelegate> {
#else
@interface Cocoa_WindowListener : NSResponder { @interface Cocoa_WindowListener : NSResponder {
#endif
SDL_WindowData *_data; SDL_WindowData *_data;
} }
@ -59,6 +55,8 @@ typedef struct SDL_WindowData SDL_WindowData;
-(void) mouseUp:(NSEvent *) theEvent; -(void) mouseUp:(NSEvent *) theEvent;
-(void) rightMouseUp:(NSEvent *) theEvent; -(void) rightMouseUp:(NSEvent *) theEvent;
-(void) otherMouseUp:(NSEvent *) theEvent; -(void) otherMouseUp:(NSEvent *) theEvent;
-(void) mouseEntered:(NSEvent *)theEvent;
-(void) mouseExited:(NSEvent *)theEvent;
-(void) mouseMoved:(NSEvent *) theEvent; -(void) mouseMoved:(NSEvent *) theEvent;
-(void) mouseDragged:(NSEvent *) theEvent; -(void) mouseDragged:(NSEvent *) theEvent;
-(void) rightMouseDragged:(NSEvent *) theEvent; -(void) rightMouseDragged:(NSEvent *) theEvent;

View file

@ -41,54 +41,53 @@ static __inline__ void ConvertNSRect(NSRect *r)
- (void)listen:(SDL_WindowData *)data - (void)listen:(SDL_WindowData *)data
{ {
NSNotificationCenter *center; NSNotificationCenter *center;
NSWindow *window = data->nswindow;
NSView *view = [window contentView];
_data = data; _data = data;
center = [NSNotificationCenter defaultCenter]; center = [NSNotificationCenter defaultCenter];
[_data->nswindow setNextResponder:self]; [center addObserver:self selector:@selector(windowDisExpose:) name:NSWindowDidExposeNotification object:window];
if ([_data->nswindow delegate] != nil) { [center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:window];
[center addObserver:self selector:@selector(windowDisExpose:) name:NSWindowDidExposeNotification object:_data->nswindow]; [center addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:window];
[center addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:_data->nswindow]; [center addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:window];
[center addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:_data->nswindow]; [center addObserver:self selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification object:window];
[center addObserver:self selector:@selector(windowDidMiniaturize:) name:NSWindowDidMiniaturizeNotification object:_data->nswindow]; [center addObserver:self selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification object:window];
[center addObserver:self selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification object:_data->nswindow]; [center addObserver:self selector:@selector(windowDidResignKey:) name:NSWindowDidResignKeyNotification object:window];
[center addObserver:self selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification object:_data->nswindow];
[center addObserver:self selector:@selector(windowDidResignKey:) name:NSWindowDidResignKeyNotification object:_data->nswindow];
} else {
[_data->nswindow setDelegate:self];
}
// FIXME: Why doesn't this work?
// [center addObserver:self selector:@selector(rightMouseDown:) name:[NSString stringWithCString:"rightMouseDown" encoding:NSUTF8StringEncoding] object:[_data->nswindow contentView]];
[center addObserver:self selector:@selector(windowDidHide:) name:NSApplicationDidHideNotification object:NSApp]; [center addObserver:self selector:@selector(windowDidHide:) name:NSApplicationDidHideNotification object:NSApp];
[center addObserver:self selector:@selector(windowDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp]; [center addObserver:self selector:@selector(windowDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp];
[_data->nswindow setAcceptsMouseMovedEvents:YES]; [window setNextResponder:self];
[window setAcceptsMouseMovedEvents:YES];
[view setNextResponder:self];
[view addTrackingRect:[view visibleRect] owner:self userData:nil assumeInside:NO];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
[[_data->nswindow contentView] setAcceptsTouchEvents:YES]; [view setAcceptsTouchEvents:YES];
#endif #endif
} }
- (void)close - (void)close
{ {
NSNotificationCenter *center; NSNotificationCenter *center;
NSWindow *window = _data->nswindow;
NSView *view = [window contentView];
center = [NSNotificationCenter defaultCenter]; center = [NSNotificationCenter defaultCenter];
[_data->nswindow setNextResponder:nil]; [center removeObserver:self name:NSWindowDidExposeNotification object:window];
if ([_data->nswindow delegate] != self) { [center removeObserver:self name:NSWindowDidMoveNotification object:window];
[center removeObserver:self name:NSWindowDidExposeNotification object:_data->nswindow]; [center removeObserver:self name:NSWindowDidResizeNotification object:window];
[center removeObserver:self name:NSWindowDidMoveNotification object:_data->nswindow]; [center removeObserver:self name:NSWindowDidMiniaturizeNotification object:window];
[center removeObserver:self name:NSWindowDidResizeNotification object:_data->nswindow]; [center removeObserver:self name:NSWindowDidDeminiaturizeNotification object:window];
[center removeObserver:self name:NSWindowDidMiniaturizeNotification object:_data->nswindow]; [center removeObserver:self name:NSWindowDidBecomeKeyNotification object:window];
[center removeObserver:self name:NSWindowDidDeminiaturizeNotification object:_data->nswindow]; [center removeObserver:self name:NSWindowDidResignKeyNotification object:window];
[center removeObserver:self name:NSWindowDidBecomeKeyNotification object:_data->nswindow];
[center removeObserver:self name:NSWindowDidResignKeyNotification object:_data->nswindow];
} else {
[_data->nswindow setDelegate:nil];
}
[center removeObserver:self name:NSApplicationDidHideNotification object:NSApp]; [center removeObserver:self name:NSApplicationDidHideNotification object:NSApp];
[center removeObserver:self name:NSApplicationDidUnhideNotification object:NSApp]; [center removeObserver:self name:NSApplicationDidUnhideNotification object:NSApp];
[window setNextResponder:nil];
[view setNextResponder:nil];
} }
- (BOOL)windowShouldClose:(id)sender - (BOOL)windowShouldClose:(id)sender
@ -141,11 +140,10 @@ static __inline__ void ConvertNSRect(NSRect *r)
SDL_SetKeyboardFocus(window); SDL_SetKeyboardFocus(window);
/* If we just gained focus we need the updated mouse position */ /* If we just gained focus we need the updated mouse position */
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { if (SDL_GetMouseFocus() == window) {
NSPoint point; NSPoint point;
point = [NSEvent mouseLocation]; point = [NSEvent mouseLocation];
point = [_data->nswindow convertScreenToBase:point]; point = [_data->nswindow convertScreenToBase:point];
point = [[_data->nswindow contentView] convertPoint:point fromView:nil];
point.y = window->h - point.y; point.y = window->h - point.y;
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y); SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
} }
@ -239,22 +237,51 @@ static __inline__ void ConvertNSRect(NSRect *r)
[self mouseUp:theEvent]; [self mouseUp:theEvent];
} }
- (void)mouseEntered:(NSEvent *)theEvent
{
SDL_SetMouseFocus(_data->window);
}
- (void)mouseExited:(NSEvent *)theEvent
{
SDL_Window *window = _data->window;
if (SDL_GetMouseFocus() == window) {
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
int x, y;
NSPoint point;
CGPoint cgpoint;
point = [theEvent locationInWindow];
point.y = window->h - point.y;
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
SDL_GetMouseState(&x, &y);
cgpoint.x = window->x + x;
cgpoint.y = window->y + y;
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
} else {
SDL_SetMouseFocus(NULL);
}
}
}
- (void)mouseMoved:(NSEvent *)theEvent - (void)mouseMoved:(NSEvent *)theEvent
{ {
SDL_Window *window = _data->window; SDL_Window *window = _data->window;
NSPoint point;
if (window->flags & SDL_WINDOW_FULLSCREEN) #ifdef RELATIVE_MOTION
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
return; return;
}
#endif
if (SDL_GetMouseFocus() == window) {
NSPoint point;
point = [theEvent locationInWindow];
point.y = window->h - point.y;
point = [theEvent locationInWindow];
point.y = window->h - point.y;
if ( point.x < 0 || point.x >= window->w ||
point.y < 0 || point.y >= window->h ) {
if (SDL_GetMouseFocus() == window) {
SDL_SetMouseFocus(NULL);
}
} else {
SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y); SDL_SendMouseMotion(window, 0, (int)point.x, (int)point.y);
} }
} }
@ -386,28 +413,14 @@ static __inline__ void ConvertNSRect(NSRect *r)
} }
@end @end
@interface SDLView : NSView { @interface SDLView : NSView { }
Cocoa_WindowListener *listener;
}
@end @end
@implementation SDLView @implementation SDLView
- (id) initWithFrame: (NSRect) rect
listener: (Cocoa_WindowListener *) theListener
{
if (self = [super initWithFrame:rect]) {
listener = theListener;
}
return self;
}
- (void)rightMouseDown:(NSEvent *)theEvent - (void)rightMouseDown:(NSEvent *)theEvent
{ {
[listener mouseDown:theEvent]; [[self nextResponder] rightMouseDown:theEvent];
} }
@end @end
static unsigned int static unsigned int
@ -452,16 +465,11 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
/* Create an event listener for the window */ /* Create an event listener for the window */
data->listener = [[Cocoa_WindowListener alloc] init]; data->listener = [[Cocoa_WindowListener alloc] init];
[data->listener listen:data];
/* Fill in the SDL window with the window data */ /* Fill in the SDL window with the window data */
{ {
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]]; NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
NSView *contentView = [[SDLView alloc] initWithFrame: rect NSView *contentView = [[SDLView alloc] initWithFrame:rect];
listener: data->listener];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
[contentView setAcceptsTouchEvents:YES];
#endif
[nswindow setContentView: contentView]; [nswindow setContentView: contentView];
[contentView release]; [contentView release];
@ -471,6 +479,10 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created
window->w = (int)rect.size.width; window->w = (int)rect.size.width;
window->h = (int)rect.size.height; window->h = (int)rect.size.height;
} }
/* Set up the listener after we create the view */
[data->listener listen:data];
if ([nswindow isVisible]) { if ([nswindow isVisible]) {
window->flags |= SDL_WINDOW_SHOWN; window->flags |= SDL_WINDOW_SHOWN;
} else { } else {
@ -764,15 +776,35 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
[pool release]; [pool release];
} }
NSPoint origin;
void void
Cocoa_SetWindowGrab(_THIS, SDL_Window * window) Cocoa_SetWindowGrab(_THIS, SDL_Window * window)
{ {
#ifdef RELATIVE_MOTION
/* FIXME: work in progress
You set relative mode by using the following code in conjunction with
CGDisplayHideCursor(kCGDirectMainDisplay) and
CGDisplayShowCursor(kCGDirectMainDisplay)
*/
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) && if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) { (window->flags & SDL_WINDOW_INPUT_FOCUS)) {
/* FIXME: Grab mouse */ CGAssociateMouseAndMouseCursorPosition(NO);
} else { } else {
/* FIXME: Release mouse */ CGAssociateMouseAndMouseCursorPosition(YES);
} }
#else
/* Move the cursor to the nearest point in the window */
if ((window->flags & SDL_WINDOW_INPUT_GRABBED) &&
(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
int x, y;
CGPoint cgpoint;
SDL_GetMouseState(&x, &y);
cgpoint.x = window->x + x;
cgpoint.y = window->y + y;
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, cgpoint);
}
#endif
} }
void void