macOS: Make sure the desktop's display mode is always in SDL's list of display modes.

Alex Szpakowski 2017-12-29 22:13:40 -04:00
parent 616827ae64
commit 64ec4c3334
1 changed files with 32 additions and 8 deletions

View File

@ -340,29 +340,53 @@ void
Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display) Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
{ {
SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata; SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata;
CFArrayRef modes = CGDisplayCopyAllDisplayModes(data->display, NULL); CVDisplayLinkRef link = NULL;
CGDisplayModeRef desktopmoderef;
SDL_DisplayMode desktopmode;
CFArrayRef modes;
CVDisplayLinkCreateWithCGDisplay(data->display, &link);
desktopmoderef = CGDisplayCopyDisplayMode(data->display);
/* CopyAllDisplayModes won't always contain the desktop display mode (if
* NULL is passed in) - for example on a retina 15" MBP, System Preferences
* allows choosing 1920x1200 but it's not in the list. AddDisplayMode makes
* sure there are no duplicates so it's safe to always add the desktop mode
* even in cases where it is in the CopyAllDisplayModes list.
*/
if (desktopmoderef && GetDisplayMode(_this, desktopmoderef, link, &desktopmode)) {
if (!SDL_AddDisplayMode(display, &desktopmode)) {
CGDisplayModeRelease(desktopmoderef);
SDL_free(desktopmode.driverdata);
}
} else {
CGDisplayModeRelease(desktopmoderef);
}
modes = CGDisplayCopyAllDisplayModes(data->display, NULL);
if (modes) { if (modes) {
CVDisplayLinkRef link = NULL;
const CFIndex count = CFArrayGetCount(modes);
CFIndex i; CFIndex i;
const CFIndex count = CFArrayGetCount(modes);
CVDisplayLinkCreateWithCGDisplay(data->display, &link);
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
CGDisplayModeRef moderef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); CGDisplayModeRef moderef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
SDL_DisplayMode mode; SDL_DisplayMode mode;
if (GetDisplayMode(_this, moderef, link, &mode)) { if (GetDisplayMode(_this, moderef, link, &mode)) {
CGDisplayModeRetain(moderef); if (SDL_AddDisplayMode(display, &mode)) {
if (!SDL_AddDisplayMode(display, &mode)) { CGDisplayModeRetain(moderef);
} else {
SDL_free(mode.driverdata); SDL_free(mode.driverdata);
} }
} }
} }
CVDisplayLinkRelease(link);
CFRelease(modes); CFRelease(modes);
} }
CVDisplayLinkRelease(link);
} }
int int