Mercurial > sdl-ios-xcode
diff src/video/quartz/SDL_QuartzWM.m @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 2780f547f5e7 |
children |
line wrap: on
line diff
--- a/src/video/quartz/SDL_QuartzWM.m Thu Jul 06 18:01:37 2006 +0000 +++ b/src/video/quartz/SDL_QuartzWM.m Mon Jul 10 21:04:37 2006 +0000 @@ -24,110 +24,128 @@ #include "SDL_QuartzVideo.h" -struct WMcursor { +struct WMcursor +{ NSCursor *nscursor; }; -void QZ_FreeWMCursor (_THIS, WMcursor *cursor) { +void +QZ_FreeWMCursor(_THIS, WMcursor * cursor) +{ - if ( cursor != NULL ) { - [ cursor->nscursor release ]; - free (cursor); + if (cursor != NULL) { + [cursor->nscursor release]; + free(cursor); } } -WMcursor* QZ_CreateWMCursor (_THIS, Uint8 *data, Uint8 *mask, - int w, int h, int hot_x, int hot_y) { +WMcursor * +QZ_CreateWMCursor(_THIS, Uint8 * data, Uint8 * mask, + int w, int h, int hot_x, int hot_y) +{ WMcursor *cursor; NSBitmapImageRep *imgrep; NSImage *img; unsigned char *planes[5]; int i; NSAutoreleasePool *pool; - - pool = [ [ NSAutoreleasePool alloc ] init ]; - + + pool =[[NSAutoreleasePool alloc] init]; + /* Allocate the cursor memory */ - cursor = (WMcursor *)SDL_malloc(sizeof(WMcursor)); - if (cursor == NULL) goto outOfMemory; - + cursor = (WMcursor *) SDL_malloc(sizeof(WMcursor)); + if (cursor == NULL) + goto outOfMemory; + /* create the image representation and get the pointers to its storage */ - imgrep = [ [ [ NSBitmapImageRep alloc ] initWithBitmapDataPlanes: NULL pixelsWide: w pixelsHigh: h bitsPerSample: 1 samplesPerPixel: 2 hasAlpha: YES isPlanar: YES colorSpaceName: NSDeviceBlackColorSpace bytesPerRow: (w+7)/8 bitsPerPixel: 0 ] autorelease ]; - if (imgrep == nil) goto outOfMemory; - [ imgrep getBitmapDataPlanes: planes ]; - + imgrep =[[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL pixelsWide: w pixelsHigh: h bitsPerSample: 1 samplesPerPixel: 2 hasAlpha: YES isPlanar: YES colorSpaceName: NSDeviceBlackColorSpace bytesPerRow: (w + 7) / 8 bitsPerPixel:0] autorelease]; + if (imgrep == nil) + goto outOfMemory; + [imgrep getBitmapDataPlanes:planes]; + /* copy data and mask, extending the mask to all black pixels because the inversion effect doesn't work with Cocoa's alpha-blended cursors */ - for (i = 0; i < (w+7)/8*h; i++) { + for (i = 0; i < (w + 7) / 8 * h; i++) { planes[0][i] = data[i]; planes[1][i] = mask[i] | data[i]; } - + /* create image and cursor */ - img = [ [ [ NSImage alloc ] initWithSize: NSMakeSize(w, h) ] autorelease ]; - if (img == nil) goto outOfMemory; - [ img addRepresentation: imgrep ]; - if (system_version < 0x1030) { /* on 10.2, cursors must be 16*16 */ + img =[[[NSImage alloc] initWithSize:NSMakeSize(w, h)] autorelease]; + if (img == nil) + goto outOfMemory; + [img addRepresentation:imgrep]; + if (system_version < 0x1030) { /* on 10.2, cursors must be 16*16 */ if (w > 16 || h > 16) { /* too big: scale it down */ - [ img setScalesWhenResized: YES ]; - hot_x = hot_x*16/w; - hot_y = hot_y*16/h; - } - else { /* too small (or just right): extend it (from the bottom left corner, so hot_y must be adjusted) */ + [img setScalesWhenResized:YES]; + hot_x = hot_x * 16 / w; + hot_y = hot_y * 16 / h; + } else { /* too small (or just right): extend it (from the bottom left corner, so hot_y must be adjusted) */ hot_y += 16 - h; } - [ img setSize: NSMakeSize(16, 16) ]; + [img setSize:NSMakeSize(16, 16)]; } - cursor->nscursor = [ [ NSCursor alloc ] initWithImage: img hotSpot: NSMakePoint(hot_x, hot_y) ]; - if (cursor->nscursor == nil) goto outOfMemory; - - [ pool release ]; - return(cursor); + cursor->nscursor =[[NSCursor alloc] initWithImage: img hotSpot:NSMakePoint(hot_x, + hot_y)]; + if (cursor->nscursor == nil) + goto outOfMemory; -outOfMemory: - [ pool release ]; - if (cursor != NULL) SDL_free(cursor); + [pool release]; + return (cursor); + + outOfMemory: + [pool release]; + if (cursor != NULL) + SDL_free(cursor); SDL_OutOfMemory(); - return(NULL); + return (NULL); } -void QZ_ShowMouse (_THIS) { +void +QZ_ShowMouse(_THIS) +{ if (!cursor_visible) { - [ NSCursor unhide ]; + [NSCursor unhide]; cursor_visible = YES; } } -void QZ_HideMouse (_THIS) { +void +QZ_HideMouse(_THIS) +{ if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS) && cursor_visible) { - [ NSCursor hide ]; + [NSCursor hide]; cursor_visible = NO; } } -BOOL QZ_IsMouseInWindow (_THIS) { - if (qz_window == nil) return YES; /*fullscreen*/ +BOOL +QZ_IsMouseInWindow(_THIS) +{ + if (qz_window == nil) + return YES; /*fullscreen */ else { - NSPoint p = [ qz_window mouseLocationOutsideOfEventStream ]; - p.y -= 1.0f; /* Apparently y goes from 1 to h, not from 0 to h-1 (i.e. the "location of the mouse" seems to be defined as "the location of the top left corner of the mouse pointer's hot pixel" */ - return NSPointInRect(p, [ window_view frame ]); + NSPoint p =[qz_window mouseLocationOutsideOfEventStream]; + p.y -= 1.0f; /* Apparently y goes from 1 to h, not from 0 to h-1 (i.e. the "location of the mouse" seems to be defined as "the location of the top left corner of the mouse pointer's hot pixel" */ + return NSPointInRect(p,[window_view frame]); } } -int QZ_ShowWMCursor (_THIS, WMcursor *cursor) { +int +QZ_ShowWMCursor(_THIS, WMcursor * cursor) +{ - if ( cursor == NULL) { - if ( cursor_should_be_visible ) { - QZ_HideMouse (this); + if (cursor == NULL) { + if (cursor_should_be_visible) { + QZ_HideMouse(this); cursor_should_be_visible = NO; - QZ_ChangeGrabState (this, QZ_HIDECURSOR); + QZ_ChangeGrabState(this, QZ_HIDECURSOR); } - } - else { - [ cursor->nscursor set ]; - if ( ! cursor_should_be_visible ) { - QZ_ShowMouse (this); + } else { + [cursor->nscursor set]; + if (!cursor_should_be_visible) { + QZ_ShowMouse(this); cursor_should_be_visible = YES; - QZ_ChangeGrabState (this, QZ_SHOWCURSOR); + QZ_ChangeGrabState(this, QZ_SHOWCURSOR); } } @@ -143,141 +161,166 @@ */ /* Convert Cocoa screen coordinate to Cocoa window coordinate */ -void QZ_PrivateGlobalToLocal (_THIS, NSPoint *p) { +void +QZ_PrivateGlobalToLocal(_THIS, NSPoint * p) +{ - *p = [ qz_window convertScreenToBase:*p ]; + *p =[qz_window convertScreenToBase:*p]; } /* Convert Cocoa window coordinate to Cocoa screen coordinate */ -void QZ_PrivateLocalToGlobal (_THIS, NSPoint *p) { +void +QZ_PrivateLocalToGlobal(_THIS, NSPoint * p) +{ - *p = [ qz_window convertBaseToScreen:*p ]; + *p =[qz_window convertBaseToScreen:*p]; } /* Convert SDL coordinate to Cocoa coordinate */ -void QZ_PrivateSDLToCocoa (_THIS, NSPoint *p) { +void +QZ_PrivateSDLToCocoa(_THIS, NSPoint * p) +{ + + if (CGDisplayIsCaptured(display_id)) { /* capture signals fullscreen */ - if ( CGDisplayIsCaptured (display_id) ) { /* capture signals fullscreen */ - - p->y = CGDisplayPixelsHigh (display_id) - p->y; - } - else { - - *p = [ window_view convertPoint:*p toView: nil ]; - + p->y = CGDisplayPixelsHigh(display_id) - p->y; + } else { + + *p =[window_view convertPoint: *p toView:nil]; + /* We need a workaround in OpenGL mode */ - if ( SDL_VideoSurface->flags & SDL_OPENGL ) { - p->y = [window_view frame].size.height - p->y; + if (SDL_VideoSurface->flags & SDL_OPENGL) { + p->y =[window_view frame].size.height - p->y; } } } /* Convert Cocoa coordinate to SDL coordinate */ -void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p) { +void +QZ_PrivateCocoaToSDL(_THIS, NSPoint * p) +{ + + if (CGDisplayIsCaptured(display_id)) { /* capture signals fullscreen */ - if ( CGDisplayIsCaptured (display_id) ) { /* capture signals fullscreen */ - - p->y = CGDisplayPixelsHigh (display_id) - p->y; - } - else { + p->y = CGDisplayPixelsHigh(display_id) - p->y; + } else { + + *p =[window_view convertPoint: *p fromView:nil]; - *p = [ window_view convertPoint:*p fromView: nil ]; - /* We need a workaround in OpenGL mode */ - if ( SDL_VideoSurface != NULL && (SDL_VideoSurface->flags & SDL_OPENGL) ) { - p->y = [window_view frame].size.height - p->y; + if (SDL_VideoSurface != NULL + && (SDL_VideoSurface->flags & SDL_OPENGL)) { + p->y =[window_view frame].size.height - p->y; } } } /* Convert SDL coordinate to window server (CoreGraphics) coordinate */ -CGPoint QZ_PrivateSDLToCG (_THIS, NSPoint *p) { - +CGPoint +QZ_PrivateSDLToCG(_THIS, NSPoint * p) +{ + CGPoint cgp; - - if ( ! CGDisplayIsCaptured (display_id) ) { /* not captured => not fullscreen => local coord */ - + + if (!CGDisplayIsCaptured(display_id)) { /* not captured => not fullscreen => local coord */ + int height; - - QZ_PrivateSDLToCocoa (this, p); - QZ_PrivateLocalToGlobal (this, p); - - height = CGDisplayPixelsHigh (display_id); + + QZ_PrivateSDLToCocoa(this, p); + QZ_PrivateLocalToGlobal(this, p); + + height = CGDisplayPixelsHigh(display_id); p->y = height - p->y; } - + cgp.x = p->x; cgp.y = p->y; - + return cgp; } -#if 0 /* Dead code */ +#if 0 /* Dead code */ /* Convert window server (CoreGraphics) coordinate to SDL coordinate */ -void QZ_PrivateCGToSDL (_THIS, NSPoint *p) { - - if ( ! CGDisplayIsCaptured (display_id) ) { /* not captured => not fullscreen => local coord */ - +void +QZ_PrivateCGToSDL(_THIS, NSPoint * p) +{ + + if (!CGDisplayIsCaptured(display_id)) { /* not captured => not fullscreen => local coord */ + int height; /* Convert CG Global to Cocoa Global */ - height = CGDisplayPixelsHigh (display_id); + height = CGDisplayPixelsHigh(display_id); p->y = height - p->y; - QZ_PrivateGlobalToLocal (this, p); - QZ_PrivateCocoaToSDL (this, p); + QZ_PrivateGlobalToLocal(this, p); + QZ_PrivateCocoaToSDL(this, p); } } #endif /* Dead code */ -void QZ_PrivateWarpCursor (_THIS, int x, int y) { - +void +QZ_PrivateWarpCursor(_THIS, int x, int y) +{ + NSPoint p; CGPoint cgp; - - p = NSMakePoint (x, y); - cgp = QZ_PrivateSDLToCG (this, &p); - + + p = NSMakePoint(x, y); + cgp = QZ_PrivateSDLToCG(this, &p); + /* this is the magic call that fixes cursor "freezing" after warp */ - CGSetLocalEventsSuppressionInterval (0.0); - CGWarpMouseCursorPosition (cgp); + CGSetLocalEventsSuppressionInterval(0.0); + CGWarpMouseCursorPosition(cgp); } -void QZ_WarpWMCursor (_THIS, Uint16 x, Uint16 y) { +void +QZ_WarpWMCursor(_THIS, Uint16 x, Uint16 y) +{ /* Only allow warping when in foreground */ - if ( ! [ NSApp isActive ] ) + if (![NSApp isActive]) return; - + /* Do the actual warp */ - if (grab_state != QZ_INVISIBLE_GRAB) QZ_PrivateWarpCursor (this, x, y); + if (grab_state != QZ_INVISIBLE_GRAB) + QZ_PrivateWarpCursor(this, x, y); /* Generate the mouse moved event */ - SDL_PrivateMouseMotion (0, 0, x, y); + SDL_PrivateMouseMotion(0, 0, x, y); } -void QZ_MoveWMCursor (_THIS, int x, int y) { } -void QZ_CheckMouseMode (_THIS) { } +void +QZ_MoveWMCursor(_THIS, int x, int y) +{ +} +void +QZ_CheckMouseMode(_THIS) +{ +} -void QZ_SetCaption (_THIS, const char *title, const char *icon) { +void +QZ_SetCaption(_THIS, const char *title, const char *icon) +{ - if ( qz_window != nil ) { + if (qz_window != nil) { NSString *string; - if ( title != NULL ) { - string = [ [ NSString alloc ] initWithUTF8String:title ]; - [ qz_window setTitle:string ]; - [ string release ]; + if (title != NULL) { + string =[[NSString alloc] initWithUTF8String:title]; + [qz_window setTitle:string]; + [string release]; } - if ( icon != NULL ) { - string = [ [ NSString alloc ] initWithUTF8String:icon ]; - [ qz_window setMiniwindowTitle:string ]; - [ string release ]; + if (icon != NULL) { + string =[[NSString alloc] initWithUTF8String:icon]; + [qz_window setMiniwindowTitle:string]; + [string release]; } } } -void QZ_SetIcon (_THIS, SDL_Surface *icon, Uint8 *mask) +void +QZ_SetIcon(_THIS, SDL_Surface * icon, Uint8 * mask) { NSBitmapImageRep *imgrep; NSImage *img; @@ -287,72 +330,82 @@ SDL_bool iconSrcAlpha; Uint8 iconAlphaValue; int i, j, maskPitch, index; - - pool = [ [ NSAutoreleasePool alloc ] init ]; - - imgrep = [ [ [ NSBitmapImageRep alloc ] initWithBitmapDataPlanes: NULL pixelsWide: icon->w pixelsHigh: icon->h bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES isPlanar: NO colorSpaceName: NSDeviceRGBColorSpace bytesPerRow: 4*icon->w bitsPerPixel: 32 ] autorelease ]; - if (imgrep == nil) goto freePool; - pixels = [ imgrep bitmapData ]; - SDL_memset(pixels, 0, 4*icon->w*icon->h); /* make the background, which will survive in colorkeyed areas, completely transparent */ - + + pool =[[NSAutoreleasePool alloc] init]; + + imgrep =[[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL pixelsWide: icon->w pixelsHigh: icon->h bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES isPlanar: NO colorSpaceName: NSDeviceRGBColorSpace bytesPerRow: 4 * icon->w bitsPerPixel:32] autorelease]; + if (imgrep == nil) + goto freePool; + pixels =[imgrep bitmapData]; + SDL_memset(pixels, 0, 4 * icon->w * icon->h); /* make the background, which will survive in colorkeyed areas, completely transparent */ + #if SDL_BYTEORDER == SDL_BIG_ENDIAN #define BYTEORDER_DEPENDENT_RGBA_MASKS 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF #else #define BYTEORDER_DEPENDENT_RGBA_MASKS 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 #endif - mergedSurface = SDL_CreateRGBSurfaceFrom(pixels, icon->w, icon->h, 32, 4*icon->w, BYTEORDER_DEPENDENT_RGBA_MASKS); - if (mergedSurface == NULL) goto freePool; - + mergedSurface = + SDL_CreateRGBSurfaceFrom(pixels, icon->w, icon->h, 32, 4 * icon->w, + BYTEORDER_DEPENDENT_RGBA_MASKS); + if (mergedSurface == NULL) + goto freePool; + /* blit, with temporarily cleared SRCALPHA flag because we want to copy, not alpha-blend */ iconSrcAlpha = ((icon->flags & SDL_SRCALPHA) != 0); iconAlphaValue = icon->format->alpha; SDL_SetAlpha(icon, 0, 255); SDL_BlitSurface(icon, NULL, mergedSurface, NULL); - if (iconSrcAlpha) SDL_SetAlpha(icon, SDL_SRCALPHA, iconAlphaValue); - + if (iconSrcAlpha) + SDL_SetAlpha(icon, SDL_SRCALPHA, iconAlphaValue); + SDL_FreeSurface(mergedSurface); - + /* apply mask, source alpha, and premultiply color values by alpha */ - maskPitch = (icon->w+7)/8; + maskPitch = (icon->w + 7) / 8; for (i = 0; i < icon->h; i++) { for (j = 0; j < icon->w; j++) { - index = i*4*icon->w + j*4; - if (!(mask[i*maskPitch + j/8] & (128 >> j%8))) { + index = i * 4 * icon->w + j * 4; + if (!(mask[i * maskPitch + j / 8] & (128 >> j % 8))) { pixels[index + 3] = 0; - } - else { + } else { if (iconSrcAlpha) { - if (icon->format->Amask == 0) pixels[index + 3] = icon->format->alpha; - } - else { + if (icon->format->Amask == 0) + pixels[index + 3] = icon->format->alpha; + } else { pixels[index + 3] = 255; } } if (pixels[index + 3] < 255) { - pixels[index + 0] = (Uint16)pixels[index + 0]*pixels[index + 3]/255; - pixels[index + 1] = (Uint16)pixels[index + 1]*pixels[index + 3]/255; - pixels[index + 2] = (Uint16)pixels[index + 2]*pixels[index + 3]/255; + pixels[index + 0] = + (Uint16) pixels[index + 0] * pixels[index + 3] / 255; + pixels[index + 1] = + (Uint16) pixels[index + 1] * pixels[index + 3] / 255; + pixels[index + 2] = + (Uint16) pixels[index + 2] * pixels[index + 3] / 255; } } } - - img = [ [ [ NSImage alloc ] initWithSize: NSMakeSize(icon->w, icon->h) ] autorelease ]; - if (img == nil) goto freePool; - [ img addRepresentation: imgrep ]; - [ NSApp setApplicationIconImage:img ]; - -freePool: - [ pool release ]; + + img =[[[NSImage alloc] initWithSize:NSMakeSize(icon->w, + icon->h)] autorelease]; + if (img == nil) + goto freePool; + [img addRepresentation:imgrep]; + [NSApp setApplicationIconImage:img]; + + freePool: + [pool release]; } -int QZ_IconifyWindow (_THIS) { +int +QZ_IconifyWindow(_THIS) +{ - if ( ! [ qz_window isMiniaturized ] ) { - [ qz_window miniaturize:nil ]; + if (![qz_window isMiniaturized]) { + [qz_window miniaturize:nil]; return 1; - } - else { - SDL_SetError ("window already iconified"); + } else { + SDL_SetError("window already iconified"); return 0; } } @@ -363,74 +416,75 @@ return 0; }*/ -void QZ_ChangeGrabState (_THIS, int action) { +void +QZ_ChangeGrabState(_THIS, int action) +{ /* - Figure out what the next state should be based on the action. - Ignore actions that can't change the current state. - */ - if ( grab_state == QZ_UNGRABBED ) { - if ( action == QZ_ENABLE_GRAB ) { - if ( cursor_should_be_visible ) + Figure out what the next state should be based on the action. + Ignore actions that can't change the current state. + */ + if (grab_state == QZ_UNGRABBED) { + if (action == QZ_ENABLE_GRAB) { + if (cursor_should_be_visible) grab_state = QZ_VISIBLE_GRAB; else grab_state = QZ_INVISIBLE_GRAB; } - } - else if ( grab_state == QZ_VISIBLE_GRAB ) { - if ( action == QZ_DISABLE_GRAB ) + } else if (grab_state == QZ_VISIBLE_GRAB) { + if (action == QZ_DISABLE_GRAB) grab_state = QZ_UNGRABBED; - else if ( action == QZ_HIDECURSOR ) + else if (action == QZ_HIDECURSOR) grab_state = QZ_INVISIBLE_GRAB; - } - else { - assert( grab_state == QZ_INVISIBLE_GRAB ); - - if ( action == QZ_DISABLE_GRAB ) + } else { + assert(grab_state == QZ_INVISIBLE_GRAB); + + if (action == QZ_DISABLE_GRAB) grab_state = QZ_UNGRABBED; - else if ( action == QZ_SHOWCURSOR ) + else if (action == QZ_SHOWCURSOR) grab_state = QZ_VISIBLE_GRAB; } - + /* now apply the new state */ if (grab_state == QZ_UNGRABBED) { - - CGAssociateMouseAndMouseCursorPosition (1); - } - else if (grab_state == QZ_VISIBLE_GRAB) { - - CGAssociateMouseAndMouseCursorPosition (1); - } - else { - assert( grab_state == QZ_INVISIBLE_GRAB ); + + CGAssociateMouseAndMouseCursorPosition(1); + } else if (grab_state == QZ_VISIBLE_GRAB) { - QZ_PrivateWarpCursor (this, SDL_VideoSurface->w / 2, SDL_VideoSurface->h / 2); - CGAssociateMouseAndMouseCursorPosition (0); + CGAssociateMouseAndMouseCursorPosition(1); + } else { + assert(grab_state == QZ_INVISIBLE_GRAB); + + QZ_PrivateWarpCursor(this, SDL_VideoSurface->w / 2, + SDL_VideoSurface->h / 2); + CGAssociateMouseAndMouseCursorPosition(0); } } -SDL_GrabMode QZ_GrabInput (_THIS, SDL_GrabMode grab_mode) { +SDL_GrabMode +QZ_GrabInput(_THIS, SDL_GrabMode grab_mode) +{ int doGrab = grab_mode & SDL_GRAB_ON; - /*int fullscreen = grab_mode & SDL_GRAB_FULLSCREEN;*/ + /*int fullscreen = grab_mode & SDL_GRAB_FULLSCREEN; */ - if ( this->screen == NULL ) { - SDL_SetError ("QZ_GrabInput: screen is NULL"); + if (this->screen == NULL) { + SDL_SetError("QZ_GrabInput: screen is NULL"); return SDL_GRAB_OFF; } - - if ( ! video_set ) { + + if (!video_set) { /*SDL_SetError ("QZ_GrabInput: video is not set, grab will take effect on mode switch"); */ current_grab_mode = grab_mode; return grab_mode; /* Will be set later on mode switch */ } - if ( grab_mode != SDL_GRAB_QUERY ) { - if ( doGrab ) - QZ_ChangeGrabState (this, QZ_ENABLE_GRAB); + if (grab_mode != SDL_GRAB_QUERY) { + if (doGrab) + QZ_ChangeGrabState(this, QZ_ENABLE_GRAB); else - QZ_ChangeGrabState (this, QZ_DISABLE_GRAB); - + QZ_ChangeGrabState(this, QZ_DISABLE_GRAB); + current_grab_mode = doGrab ? SDL_GRAB_ON : SDL_GRAB_OFF; }