diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 540f0d893..a7c016208 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -347,6 +347,26 @@ extern "C" { */ #define SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT" +/** + * \brief A variable that dictates policy for fullscreen Spaces on Mac OS X. + * + * This hint only applies to Mac OS X. + * + * The variable can be set to the following values: + * "0" - Disable Spaces support (FULLSCREEN_DESKTOP won't use them and + * SDL_WINDOW_RESIZABLE windows won't offer the "fullscreen" + * button on their titlebars). + * "1" - Enable Spaces support (FULLSCREEN_DESKTOP will use them and + * SDL_WINDOW_RESIZABLE windows will offer the "fullscreen" + * button on their titlebars. + * + * The default value is "1". Spaces are disabled regardless of this hint if + * the OS isn't at least Mac OS X Lion (10.7). This hint must be set before + * any windows are created. + */ +#define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" + + /** * \brief An enumeration of hint priorities */ diff --git a/src/video/cocoa/SDL_cocoavideo.h b/src/video/cocoa/SDL_cocoavideo.h index f5836bd87..f194e1f72 100644 --- a/src/video/cocoa/SDL_cocoavideo.h +++ b/src/video/cocoa/SDL_cocoavideo.h @@ -46,6 +46,7 @@ typedef struct SDL_VideoData { SInt32 osversion; + int allow_spaces; unsigned int modifierFlags; void *key_layout; SDLTranslatorResponder *fieldEdit; diff --git a/src/video/cocoa/SDL_cocoavideo.m b/src/video/cocoa/SDL_cocoavideo.m index 0ab015f2f..6766b71bb 100644 --- a/src/video/cocoa/SDL_cocoavideo.m +++ b/src/video/cocoa/SDL_cocoavideo.m @@ -148,9 +148,15 @@ VideoBootStrap COCOA_bootstrap = { int Cocoa_VideoInit(_THIS) { + SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; + Cocoa_InitModes(_this); Cocoa_InitKeyboard(_this); Cocoa_InitMouse(_this); + + const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES); + data->allow_spaces = ( (data->osversion >= 0x1070) && (!hint || (*hint != '0')) ); + return 0; } diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 36d762a2b..1b58a678b 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -38,6 +38,7 @@ #include "SDL_cocoashape.h" #include "SDL_cocoamouse.h" #include "SDL_cocoaopengl.h" +#include "SDL_assert.h" /* #define DEBUG_COCOAWINDOW */ @@ -121,9 +122,7 @@ GetWindowStyle(SDL_Window * window) { unsigned int style; - if ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) { - style = (NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask); - } else if (window->flags & SDL_WINDOW_FULLSCREEN) { + if (window->flags & SDL_WINDOW_FULLSCREEN) { style = NSBorderlessWindowMask; } else { if (window->flags & SDL_WINDOW_BORDERLESS) { @@ -262,11 +261,12 @@ SetWindowStyle(SDL_Window * window, unsigned int style) { SDL_Window *window = _data->window; NSWindow *nswindow = _data->nswindow; + SDL_VideoData *videodata = ((SDL_WindowData *) window->driverdata)->videodata; - if (state && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP)) { + if (!videodata->allow_spaces) { + return NO; /* Spaces are forcibly disabled. */ + } else if (state && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP)) { return NO; /* we only allow you to make a Space on FULLSCREEN_DESKTOP windows. */ - } else if (![nswindow respondsToSelector: @selector(toggleFullScreen:)]) { - return NO; /* No Spaces support? Older Mac OS X? */ } else if (state == isFullscreenSpace) { return YES; /* already there. */ } @@ -281,7 +281,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style) } inFullscreenTransition = YES; - /* you need to be FullScreenPrimary, or toggleFullScreen doesn't work. Unset it again in windowDid[Enter|Exit]FullScreen. */ + /* you need to be FullScreenPrimary, or toggleFullScreen doesn't work. Unset it again in windowDidExitFullScreen. */ [nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; [nswindow performSelectorOnMainThread: @selector(toggleFullScreen:) withObject:nswindow waitUntilDone:NO]; return YES; @@ -987,6 +987,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created int Cocoa_CreateWindow(_THIS, SDL_Window * window) { + SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSWindow *nswindow; SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); @@ -1031,7 +1032,9 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window) } [nswindow setBackgroundColor:[NSColor blackColor]]; - if ([nswindow respondsToSelector: @selector(toggleFullScreen:)]) { + if (videodata->allow_spaces) { + SDL_assert(videodata->osversion >= 0x1070); + SDL_assert([nswindow respondsToSelector:@selector(toggleFullScreen:)]); /* we put FULLSCREEN_DESKTOP windows in their own Space, without a toggle button or menubar, later */ if (window->flags & SDL_WINDOW_RESIZABLE) { /* resizable windows are Spaces-friendly: they get the "go fullscreen" toggle button on their titlebar. */