Skip to content

Commit

Permalink
Mac: Added a hint to opt-out of new Spaces code.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Mar 4, 2014
1 parent 3889d47 commit 9e67444
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 8 deletions.
20 changes: 20 additions & 0 deletions include/SDL_hints.h
Expand Up @@ -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
*/
Expand Down
1 change: 1 addition & 0 deletions src/video/cocoa/SDL_cocoavideo.h
Expand Up @@ -46,6 +46,7 @@
typedef struct SDL_VideoData
{
SInt32 osversion;
int allow_spaces;
unsigned int modifierFlags;
void *key_layout;
SDLTranslatorResponder *fieldEdit;
Expand Down
6 changes: 6 additions & 0 deletions src/video/cocoa/SDL_cocoavideo.m
Expand Up @@ -148,9 +148,15 @@
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;
}

Expand Down
19 changes: 11 additions & 8 deletions src/video/cocoa/SDL_cocoawindow.m
Expand Up @@ -38,6 +38,7 @@
#include "SDL_cocoashape.h"
#include "SDL_cocoamouse.h"
#include "SDL_cocoaopengl.h"
#include "SDL_assert.h"

/* #define DEBUG_COCOAWINDOW */

Expand Down Expand Up @@ -121,9 +122,7 @@ static void ConvertNSRect(NSRect *r)
{
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) {
Expand Down Expand Up @@ -262,11 +261,12 @@ -(BOOL) setFullscreenSpace:(BOOL) state
{
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. */
}
Expand All @@ -281,7 +281,7 @@ -(BOOL) setFullscreenSpace:(BOOL) state
}
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;
Expand Down Expand Up @@ -987,6 +987,7 @@ - (void)resetCursorRects
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);
Expand Down Expand Up @@ -1031,7 +1032,9 @@ - (void)resetCursorRects
}
[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. */
Expand Down

0 comments on commit 9e67444

Please sign in to comment.