Mac: Added a hint to opt-out of new Spaces code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 540f0d8..a7c0162 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -348,6 +348,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
*/
typedef enum
diff --git a/src/video/cocoa/SDL_cocoavideo.h b/src/video/cocoa/SDL_cocoavideo.h
index f5836bd..f194e1f 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 0ab015f..6766b71 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 36d762a..1b58a67 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. */