21 #include "../../SDL_internal.h" 24 #if SDL_VIDEO_DRIVER_COCOA 29 #include <IOKit/graphics/IOGraphicsLib.h> 32 #include <CoreVideo/CVBase.h> 33 #include <CoreVideo/CVDisplayLink.h> 36 #include <Carbon/Carbon.h> 39 #include <AvailabilityMacros.h> 43 Cocoa_ToggleMenuBar(
const BOOL show)
50 #if (MAC_OS_X_VERSION_MIN_REQUIRED < 1070) && !defined(__LP64__) 60 CG_SetError(
const char *prefix, CGDisplayErr
result)
66 error =
"kCGErrorFailure";
68 case kCGErrorIllegalArgument:
69 error =
"kCGErrorIllegalArgument";
71 case kCGErrorInvalidConnection:
72 error =
"kCGErrorInvalidConnection";
74 case kCGErrorInvalidContext:
75 error =
"kCGErrorInvalidContext";
77 case kCGErrorCannotComplete:
78 error =
"kCGErrorCannotComplete";
80 case kCGErrorNotImplemented:
81 error =
"kCGErrorNotImplemented";
83 case kCGErrorRangeCheck:
84 error =
"kCGErrorRangeCheck";
86 case kCGErrorTypeCheck:
87 error =
"kCGErrorTypeCheck";
89 case kCGErrorInvalidOperation:
90 error =
"kCGErrorInvalidOperation";
92 case kCGErrorNoneAvailable:
93 error =
"kCGErrorNoneAvailable";
96 error =
"Unknown Error";
118 fmt = CGDisplayModeCopyPixelEncoding(vidmode);
119 width = (int) CGDisplayModeGetWidth(vidmode);
120 height = (int) CGDisplayModeGetHeight(vidmode);
121 refreshRate = (int) (CGDisplayModeGetRefreshRate(vidmode) + 0.5);
123 if (CFStringCompare(fmt, CFSTR(IO32BitDirectPixels),
124 kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
126 }
else if (CFStringCompare(fmt, CFSTR(IO16BitDirectPixels),
127 kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
129 }
else if (CFStringCompare(fmt, CFSTR(kIO30BitDirectPixels),
130 kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
139 if (refreshRate == 0 && link !=
NULL) {
140 CVTime
time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);
141 if ((time.flags & kCVTimeIsIndefinite) == 0 && time.timeValue != 0) {
142 refreshRate = (int) ((time.timeScale / (
double) time.timeValue) + 0.5);
170 Cocoa_GetDisplayName(CGDirectDisplayID displayID)
172 CFDictionaryRef deviceInfo = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), kIODisplayOnlyPreferredName);
173 NSDictionary *localizedNames = [(NSDictionary *)deviceInfo objectForKey:[NSString stringWithUTF8String:kDisplayProductName]];
174 const char* displayName =
NULL;
176 if ([localizedNames
count] > 0) {
177 displayName =
SDL_strdup([[localizedNames objectForKey:[[localizedNames allKeys] objectAtIndex:0]] UTF8String]);
179 CFRelease(deviceInfo);
188 CGDirectDisplayID *displays;
189 CGDisplayCount numDisplays;
193 result = CGGetOnlineDisplayList(0,
NULL, &numDisplays);
194 if (result != kCGErrorSuccess) {
195 CG_SetError(
"CGGetOnlineDisplayList()", result);
199 result = CGGetOnlineDisplayList(numDisplays, displays, &numDisplays);
200 if (result != kCGErrorSuccess) {
201 CG_SetError(
"CGGetOnlineDisplayList()", result);
207 for (pass = 0; pass < 2; ++pass) {
208 for (i = 0; i < numDisplays; ++i) {
212 CGDisplayModeRef moderef =
NULL;
213 CVDisplayLinkRef link =
NULL;
216 if (!CGDisplayIsMain(displays[i])) {
220 if (CGDisplayIsMain(displays[i])) {
225 if (CGDisplayMirrorsDisplay(displays[i]) != kCGNullDirectDisplay) {
229 moderef = CGDisplayCopyDisplayMode(displays[i]);
237 CGDisplayModeRelease(moderef);
240 displaydata->
display = displays[i];
242 CVDisplayLinkCreateWithCGDisplay(displays[i], &link);
246 display.
name = (
char *)Cocoa_GetDisplayName(displays[i]);
247 if (!GetDisplayMode(
_this, moderef, link, &mode)) {
248 CVDisplayLinkRelease(link);
249 CGDisplayModeRelease(moderef);
255 CVDisplayLinkRelease(link);
273 cgrect = CGDisplayBounds(displaydata->
display);
274 rect->
x = (int)cgrect.origin.x;
275 rect->
y = (
int)cgrect.origin.y;
276 rect->
w = (int)cgrect.size.width;
277 rect->
h = (
int)cgrect.size.height;
285 const CGDirectDisplayID cgdisplay = displaydata->
display;
286 NSArray *screens = [NSScreen screens];
290 for (NSScreen *i
in screens) {
291 const CGDirectDisplayID thisDisplay = (CGDirectDisplayID) [[[i deviceDescription] objectForKey:
@"NSScreenNumber"] unsignedIntValue];
292 if (thisDisplay == cgdisplay) {
303 const NSRect
frame = [screen visibleFrame];
304 rect->
x = (int)frame.origin.x;
305 rect->
y = (
int)(CGDisplayPixelsHigh(kCGDirectMainDisplay) - frame.origin.
y - frame.
size.height);
306 rect->
w = (int)frame.size.width;
307 rect->
h = (
int)frame.size.height;
315 const float MM_IN_INCH = 25.4f;
319 CGSize displaySize = CGDisplayScreenSize(data->
display);
320 int pixelWidth = (int) CGDisplayPixelsWide(data->
display);
321 int pixelHeight = (int) CGDisplayPixelsHigh(data->
display);
324 *ddpi =
SDL_ComputeDiagonalDPI(pixelWidth, pixelHeight, displaySize.width / MM_IN_INCH, displaySize.height / MM_IN_INCH);
327 *hdpi = pixelWidth * MM_IN_INCH / displaySize.width;
330 *vdpi = pixelHeight * MM_IN_INCH / displaySize.height;
340 CVDisplayLinkRef link =
NULL;
341 CGDisplayModeRef desktopmoderef;
345 CVDisplayLinkCreateWithCGDisplay(data->
display, &link);
347 desktopmoderef = CGDisplayCopyDisplayMode(data->
display);
355 if (desktopmoderef && GetDisplayMode(
_this, desktopmoderef, link, &desktopmode)) {
357 CGDisplayModeRelease(desktopmoderef);
361 CGDisplayModeRelease(desktopmoderef);
364 modes = CGDisplayCopyAllDisplayModes(data->
display,
NULL);
368 const CFIndex
count = CFArrayGetCount(modes);
370 for (i = 0; i <
count; i++) {
371 CGDisplayModeRef moderef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
374 if (GetDisplayMode(
_this, moderef, link, &mode)) {
376 CGDisplayModeRetain(moderef);
386 CVDisplayLinkRelease(link);
394 CGDisplayFadeReservationToken fade_token = kCGDisplayFadeReservationInvalidToken;
398 if (CGAcquireDisplayFadeReservation(5, &fade_token) == kCGErrorSuccess) {
399 CGDisplayFade(fade_token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0,
TRUE);
404 CGDisplaySetDisplayMode(displaydata->
display, data->moderef,
NULL);
406 if (CGDisplayIsMain(displaydata->
display)) {
407 CGReleaseAllDisplays();
409 CGDisplayRelease(displaydata->
display);
412 if (CGDisplayIsMain(displaydata->
display)) {
413 Cocoa_ToggleMenuBar(YES);
417 if (CGDisplayIsMain(displaydata->
display)) {
419 result = CGCaptureAllDisplays();
421 result = CGDisplayCapture(displaydata->
display);
423 if (result != kCGErrorSuccess) {
424 CG_SetError(
"CGDisplayCapture()", result);
429 result = CGDisplaySetDisplayMode(displaydata->
display, data->moderef,
NULL);
430 if (result != kCGErrorSuccess) {
431 CG_SetError(
"CGDisplaySwitchToMode()", result);
436 if (CGDisplayIsMain(displaydata->
display)) {
437 Cocoa_ToggleMenuBar(NO);
442 if (fade_token != kCGDisplayFadeReservationInvalidToken) {
443 CGDisplayFade(fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0,
FALSE);
444 CGReleaseDisplayFadeReservation(fade_token);
451 CGDisplayRelease(displaydata->
display);
453 if (fade_token != kCGDisplayFadeReservationInvalidToken) {
454 CGDisplayFade (fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0,
FALSE);
455 CGReleaseDisplayFadeReservation(fade_token);
470 Cocoa_SetDisplayMode(_this, display, &display->desktop_mode);
474 CGDisplayModeRelease(mode->
moderef);
478 CGDisplayModeRelease(mode->
moderef);
482 Cocoa_ToggleMenuBar(YES);
void Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
EGLSurface EGLnsecsANDROID time
GLuint GLuint GLsizei count
The structure that defines a display mode.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
CGDirectDisplayID display
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
GLint GLint GLsizei width
int Cocoa_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
static SDL_VideoDevice * _this
#define SDL_small_alloc(type, count, pisstack)
int Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
SDL_DisplayMode * display_modes
int Cocoa_GetDisplayDPI(_THIS, SDL_VideoDisplay *display, float *ddpi, float *hpdi, float *vdpi)
SDL_DisplayMode current_mode
SDL_VideoDisplay * displays
GLint GLint GLint GLint GLint GLint y
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
#define SDL_assert(condition)
SDL_DisplayMode desktop_mode
GLint GLint GLsizei GLsizei height
#define SDL_small_free(ptr, isstack)
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
int Cocoa_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect)
void Cocoa_QuitModes(_THIS)
void Cocoa_InitModes(_THIS)
float SDL_ComputeDiagonalDPI(int hpix, int vpix, float hinches, float vinches)
A rectangle, with the origin at the upper left (integer).