mirror of
https://github.com/joel16/SDL2.git
synced 2024-12-13 22:38:34 +00:00
Fixed fullscreen mouse events on MacOS X
Fixed crash when quitting fullscreen mode on MacOS X --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40118
This commit is contained in:
parent
962eabb3ef
commit
77331bf064
@ -16,6 +16,8 @@ be found at the <A HREF="http://www.libsdl.org/"> main SDL page</A>.
|
||||
Major changes since SDL 1.0.0:
|
||||
</H2>
|
||||
<UL>
|
||||
<LI> 1.2.2: Fixed crash when quitting fullscreen mode on MacOS X
|
||||
<LI> 1.2.2: Fixed fullscreen mouse events on MacOS X
|
||||
<LI> 1.2.2: Now returns an error if unable to open audio on BeOS
|
||||
<LI> 1.2.2: Now gets correct keyboard state when starting up on X11
|
||||
<LI> 1.2.2: Improved the DGA 2.0 and framebuffer console drivers
|
||||
|
@ -195,8 +195,8 @@ static void QZ_DoModifiers (unsigned int newMods) {
|
||||
currentMods = newMods;
|
||||
}
|
||||
|
||||
static void QZ_DoActivate (_THIS, NSPoint p) {
|
||||
|
||||
static void QZ_DoActivate (_THIS)
|
||||
{
|
||||
inForeground = YES;
|
||||
|
||||
/* Regrab the mouse */
|
||||
@ -220,13 +220,10 @@ static void QZ_DoDeactivate (_THIS) {
|
||||
SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS);
|
||||
}
|
||||
|
||||
static void QZ_PumpEvents (_THIS) {
|
||||
|
||||
static void QZ_PumpEvents (_THIS)
|
||||
{
|
||||
NSDate *distantPast = [ NSDate distantPast ];
|
||||
|
||||
//NSAutoreleasePool *pool;
|
||||
//pool = [ [ NSAutoreleasePool alloc ] init ];
|
||||
|
||||
NSEvent *event;
|
||||
NSRect winRect;
|
||||
NSRect titleBarRect;
|
||||
@ -244,29 +241,28 @@ static void QZ_PumpEvents (_THIS) {
|
||||
|
||||
if (event != nil) {
|
||||
unsigned int type;
|
||||
NSPoint p;
|
||||
|
||||
type = [ event type ];
|
||||
p = [ event locationInWindow ];
|
||||
|
||||
#define DO_MOUSE_DOWN(button, sendToWindow) \
|
||||
if ( inForeground ) { \
|
||||
if ( NSPointInRect(p,winRect)) \
|
||||
SDL_PrivateMouseButton (SDL_PRESSED, button, p.x, SDL_VideoSurface->h - p.y); \
|
||||
else if (sendToWindow) \
|
||||
[ window sendEvent:event ]; \
|
||||
} \
|
||||
else { \
|
||||
QZ_DoActivate (this, p); \
|
||||
|
||||
#define DO_MOUSE_DOWN(button, sendToWindow) \
|
||||
if ( inForeground ) { \
|
||||
if ( (SDL_VideoSurface->flags & SDL_FULLSCREEN) || \
|
||||
NSPointInRect([event locationInWindow], winRect) ) \
|
||||
SDL_PrivateMouseButton (SDL_PRESSED, button, 0, 0); \
|
||||
else if (sendToWindow) \
|
||||
[ window sendEvent:event ]; \
|
||||
} \
|
||||
else { \
|
||||
QZ_DoActivate (this); \
|
||||
}
|
||||
|
||||
#define DO_MOUSE_UP(button, sendToWindow) \
|
||||
if ( ! NSPointInRect (p, titleBarRect) ) \
|
||||
SDL_PrivateMouseButton (SDL_RELEASED, button, p.x, SDL_VideoSurface->h - p.y); \
|
||||
if (sendToWindow) \
|
||||
#define DO_MOUSE_UP(button, sendToWindow) \
|
||||
if ( (SDL_VideoSurface->flags & SDL_FULLSCREEN) || \
|
||||
!NSPointInRect([event locationInWindow], titleBarRect) )\
|
||||
SDL_PrivateMouseButton (SDL_RELEASED, button, 0, 0); \
|
||||
if (sendToWindow) \
|
||||
[ window sendEvent:event ]
|
||||
|
||||
switch ( type) {
|
||||
type = [ event type ];
|
||||
switch (type) {
|
||||
|
||||
case NSLeftMouseDown:
|
||||
if ( NSCommandKeyMask & currentMods ) {
|
||||
@ -302,33 +298,39 @@ static void QZ_PumpEvents (_THIS) {
|
||||
case NSLeftMouseDragged:
|
||||
case NSRightMouseDragged:
|
||||
case 27:
|
||||
SDL_PrivateMouseMotion (SDL_PRESSED, 0, p.x, SDL_VideoSurface->h - p.y);
|
||||
break;
|
||||
case NSMouseMoved:
|
||||
{
|
||||
static int moves = 0;
|
||||
|
||||
NSPoint p;
|
||||
|
||||
if ( SDL_VideoSurface->flags & SDL_FULLSCREEN ) {
|
||||
p = [ NSEvent mouseLocation ];
|
||||
p.y = [[NSScreen mainScreen] frame].size.height - p.y;
|
||||
} else {
|
||||
p = [ event locationInWindow ];
|
||||
p.y = SDL_VideoSurface->h - p.y;
|
||||
}
|
||||
|
||||
if ( (moves % 10) == 0 ) {
|
||||
SDL_PrivateMouseMotion (SDL_RELEASED, 0, p.x, SDL_VideoSurface->h - p.y);
|
||||
moves = 0;
|
||||
SDL_PrivateMouseMotion (0, 0, p.x, p.y);
|
||||
}
|
||||
else {
|
||||
CGMouseDelta dx, dy;
|
||||
CGGetLastMouseDelta (&dx, &dy);
|
||||
SDL_PrivateMouseMotion (SDL_RELEASED, 1, dx, dy);
|
||||
moves++;
|
||||
SDL_PrivateMouseMotion (0, 1, dx, dy);
|
||||
}
|
||||
moves++;
|
||||
}
|
||||
break;
|
||||
case NSScrollWheel:
|
||||
{
|
||||
if (NSPointInRect(p, winRect)) {
|
||||
if (NSPointInRect([ event locationInWindow ], winRect)) {
|
||||
float dy;
|
||||
dy = [ event deltaY ];
|
||||
if ( dy > 0.0 ) /* Scroll up */
|
||||
SDL_PrivateMouseButton (SDL_PRESSED, 4, p.x, SDL_VideoSurface->h - p.y);
|
||||
SDL_PrivateMouseButton (SDL_PRESSED, 4, 0, 0);
|
||||
else /* Scroll down */
|
||||
SDL_PrivateMouseButton (SDL_PRESSED, 5, p.x, SDL_VideoSurface->h - p.y);
|
||||
SDL_PrivateMouseButton (SDL_PRESSED, 5, 0, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -346,7 +348,7 @@ static void QZ_PumpEvents (_THIS) {
|
||||
case NSAppKitDefined:
|
||||
switch ( [ event subtype ] ) {
|
||||
case NSApplicationActivatedEventType:
|
||||
QZ_DoActivate (this, p);
|
||||
QZ_DoActivate (this);
|
||||
break;
|
||||
case NSApplicationDeactivatedEventType:
|
||||
QZ_DoDeactivate (this);
|
||||
@ -361,8 +363,6 @@ static void QZ_PumpEvents (_THIS) {
|
||||
case NSCursorUpdate: break;
|
||||
}
|
||||
}
|
||||
// [ pool release ];
|
||||
|
||||
} while (event != nil);
|
||||
}
|
||||
|
||||
|
@ -231,6 +231,7 @@ static void QZ_UnsetVideoMode (_THIS) {
|
||||
if ( mode_flags & SDL_FULLSCREEN ) {
|
||||
CGDisplaySwitchToMode (display_id, save_mode);
|
||||
CGDisplayRelease (display_id);
|
||||
this->screen->pixels = NULL;
|
||||
}
|
||||
/* Release window mode data structures */
|
||||
else {
|
||||
|
Loading…
Reference in New Issue
Block a user