23 #if SDL_VIDEO_DRIVER_COCOA
28 #include <IOKit/graphics/IOGraphicsLib.h>
31 #include <Carbon/Carbon.h>
34 #include <AvailabilityMacros.h>
36 static inline void Cocoa_ToggleMenuBar(
const BOOL show)
43 #if (MAC_OS_X_VERSION_MIN_REQUIRED < 1070) && !defined(__LP64__)
53 #define FORCE_OLD_API 0
56 #undef MAC_OS_X_VERSION_MIN_REQUIRED
57 #define MAC_OS_X_VERSION_MIN_REQUIRED 1050
61 IS_SNOW_LEOPARD_OR_LATER(
_THIS)
71 CG_SetError(
const char *prefix, CGDisplayErr
result)
77 error =
"kCGErrorFailure";
79 case kCGErrorIllegalArgument:
80 error =
"kCGErrorIllegalArgument";
82 case kCGErrorInvalidConnection:
83 error =
"kCGErrorInvalidConnection";
85 case kCGErrorInvalidContext:
86 error =
"kCGErrorInvalidContext";
88 case kCGErrorCannotComplete:
89 error =
"kCGErrorCannotComplete";
91 case kCGErrorNotImplemented:
92 error =
"kCGErrorNotImplemented";
94 case kCGErrorRangeCheck:
95 error =
"kCGErrorRangeCheck";
97 case kCGErrorTypeCheck:
98 error =
"kCGErrorTypeCheck";
100 case kCGErrorInvalidOperation:
101 error =
"kCGErrorInvalidOperation";
103 case kCGErrorNoneAvailable:
104 error =
"kCGErrorNoneAvailable";
107 error =
"Unknown Error";
120 long refreshRate = 0;
128 if (IS_SNOW_LEOPARD_OR_LATER(
_this)) {
129 CGDisplayModeRef vidmode = (CGDisplayModeRef) moderef;
130 CFStringRef fmt = CGDisplayModeCopyPixelEncoding(vidmode);
131 width = (long) CGDisplayModeGetWidth(vidmode);
132 height = (long) CGDisplayModeGetHeight(vidmode);
133 refreshRate = (long) CGDisplayModeGetRefreshRate(vidmode);
135 if (CFStringCompare(fmt, CFSTR(IO32BitDirectPixels),
136 kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
138 }
else if (CFStringCompare(fmt, CFSTR(IO16BitDirectPixels),
139 kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
148 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
149 if (!IS_SNOW_LEOPARD_OR_LATER(
_this)) {
151 CFDictionaryRef vidmode = (CFDictionaryRef) moderef;
152 number = CFDictionaryGetValue(vidmode, kCGDisplayWidth);
153 CFNumberGetValue(number, kCFNumberLongType, &width);
154 number = CFDictionaryGetValue(vidmode, kCGDisplayHeight);
155 CFNumberGetValue(number, kCFNumberLongType, &height);
156 number = CFDictionaryGetValue(vidmode, kCGDisplayBitsPerPixel);
157 CFNumberGetValue(number, kCFNumberLongType, &bpp);
158 number = CFDictionaryGetValue(vidmode, kCGDisplayRefreshRate);
159 CFNumberGetValue(number, kCFNumberLongType, &refreshRate);
183 Cocoa_ReleaseDisplayMode(
_THIS,
const void *moderef)
185 if (IS_SNOW_LEOPARD_OR_LATER(
_this)) {
186 CGDisplayModeRelease((CGDisplayModeRef) moderef);
191 Cocoa_ReleaseDisplayModeList(
_THIS, CFArrayRef modelist)
193 if (IS_SNOW_LEOPARD_OR_LATER(
_this)) {
199 Cocoa_GetDisplayName(CGDirectDisplayID displayID)
201 NSDictionary *deviceInfo = (NSDictionary *)IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), kIODisplayOnlyPreferredName);
202 NSDictionary *localizedNames = [deviceInfo objectForKey:[NSString stringWithUTF8String:kDisplayProductName]];
203 const char* displayName =
NULL;
205 if ([localizedNames
count] > 0) {
206 displayName =
SDL_strdup([[localizedNames objectForKey:[[localizedNames allKeys] objectAtIndex:0]] UTF8String]);
208 [deviceInfo release];
215 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
217 CGDirectDisplayID *displays;
218 CGDisplayCount numDisplays;
221 result = CGGetOnlineDisplayList(0,
NULL, &numDisplays);
222 if (result != kCGErrorSuccess) {
223 CG_SetError(
"CGGetOnlineDisplayList()", result);
228 result = CGGetOnlineDisplayList(numDisplays, displays, &numDisplays);
229 if (result != kCGErrorSuccess) {
230 CG_SetError(
"CGGetOnlineDisplayList()", result);
237 for (pass = 0; pass < 2; ++pass) {
238 for (i = 0; i < numDisplays; ++i) {
242 const void *moderef =
NULL;
245 if (!CGDisplayIsMain(displays[i])) {
249 if (CGDisplayIsMain(displays[i])) {
254 if (CGDisplayMirrorsDisplay(displays[i]) != kCGNullDirectDisplay) {
258 if (IS_SNOW_LEOPARD_OR_LATER(
_this)) {
259 moderef = CGDisplayCopyDisplayMode(displays[i]);
262 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
263 if (!IS_SNOW_LEOPARD_OR_LATER(
_this)) {
264 moderef = CGDisplayCurrentMode(displays[i]);
274 Cocoa_ReleaseDisplayMode(
_this, moderef);
277 displaydata->
display = displays[i];
281 display.
name = (
char *)Cocoa_GetDisplayName(displays[i]);
282 if (!GetDisplayMode (
_this, moderef, &mode)) {
283 Cocoa_ReleaseDisplayMode(
_this, moderef);
306 cgrect = CGDisplayBounds(displaydata->
display);
307 rect->
x = (
int)cgrect.origin.x;
308 rect->
y = (
int)cgrect.origin.y;
309 rect->
w = (
int)cgrect.size.width;
310 rect->
h = (
int)cgrect.size.height;
318 CFArrayRef modes =
NULL;
320 if (IS_SNOW_LEOPARD_OR_LATER(
_this)) {
321 modes = CGDisplayCopyAllDisplayModes(data->
display,
NULL);
324 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
325 if (!IS_SNOW_LEOPARD_OR_LATER(
_this)) {
326 modes = CGDisplayAvailableModes(data->
display);
331 const CFIndex
count = CFArrayGetCount(modes);
334 for (i = 0; i <
count; i++) {
335 const void *moderef = CFArrayGetValueAtIndex(modes, i);
337 if (GetDisplayMode(
_this, moderef, &mode)) {
338 if (IS_SNOW_LEOPARD_OR_LATER(
_this)) {
339 CGDisplayModeRetain((CGDisplayModeRef) moderef);
345 Cocoa_ReleaseDisplayModeList(
_this, modes);
350 Cocoa_SwitchMode(
_THIS, CGDirectDisplayID display,
const void *mode)
352 if (IS_SNOW_LEOPARD_OR_LATER(
_this)) {
353 return CGDisplaySetDisplayMode(display, (CGDisplayModeRef) mode,
NULL);
356 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
357 if (!IS_SNOW_LEOPARD_OR_LATER(
_this)) {
358 return CGDisplaySwitchToMode(display, (CFDictionaryRef) mode);
362 return kCGErrorFailure;
370 CGDisplayFadeReservationToken fade_token = kCGDisplayFadeReservationInvalidToken;
374 if (CGAcquireDisplayFadeReservation(5, &fade_token) == kCGErrorSuccess) {
375 CGDisplayFade(fade_token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0,
TRUE);
380 Cocoa_SwitchMode(
_this, displaydata->
display, data->moderef);
382 if (CGDisplayIsMain(displaydata->
display)) {
383 CGReleaseAllDisplays();
385 CGDisplayRelease(displaydata->
display);
388 if (CGDisplayIsMain(displaydata->
display)) {
389 Cocoa_ToggleMenuBar(YES);
393 if (CGDisplayIsMain(displaydata->
display)) {
395 result = CGCaptureAllDisplays();
397 result = CGDisplayCapture(displaydata->
display);
399 if (result != kCGErrorSuccess) {
400 CG_SetError(
"CGDisplayCapture()", result);
405 result = Cocoa_SwitchMode(
_this, displaydata->
display, data->moderef);
406 if (result != kCGErrorSuccess) {
407 CG_SetError(
"CGDisplaySwitchToMode()", result);
412 if (CGDisplayIsMain(displaydata->
display)) {
413 Cocoa_ToggleMenuBar(NO);
418 if (fade_token != kCGDisplayFadeReservationInvalidToken) {
419 CGDisplayFade(fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0,
FALSE);
420 CGReleaseDisplayFadeReservation(fade_token);
427 CGDisplayRelease(displaydata->
display);
429 if (fade_token != kCGDisplayFadeReservationInvalidToken) {
430 CGDisplayFade (fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0,
FALSE);
431 CGReleaseDisplayFadeReservation(fade_token);
458 Cocoa_ToggleMenuBar(YES);
void Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
#define SDL_stack_free(data)
DECLSPEC void SDLCALL SDL_free(void *mem)
The structure that defines a display mode.
EGLSurface EGLint EGLint EGLint EGLint height
CGDirectDisplayID display
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
static SDL_VideoDevice * _this
int Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
EGLSurface EGLint EGLint EGLint width
DECLSPEC char *SDLCALL SDL_strdup(const char *str)
SDL_DisplayMode * display_modes
SDL_DisplayMode current_mode
SDL_VideoDisplay * displays
DECLSPEC int SDLCALL SDL_SetError(const char *fmt,...)
DECLSPEC void *SDLCALL SDL_malloc(size_t size)
SDL_DisplayMode desktop_mode
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
#define SDL_stack_alloc(type, count)
int Cocoa_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
void Cocoa_QuitModes(_THIS)
void Cocoa_InitModes(_THIS)
A rectangle, with the origin at the upper left.
typedef BOOL(WINAPI *PFNWGLSETSTEREOEMITTERSTATE3DLPROC)(HDC hDC