summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m')
-rw-r--r--3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m464
1 files changed, 0 insertions, 464 deletions
diff --git a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m b/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m
deleted file mode 100644
index 6ae9decbc2b..00000000000
--- a/3rdparty/SDL2/src/video/cocoa/SDL_cocoamodes.m
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-#include "../../SDL_internal.h"
-#include "SDL_assert.h"
-
-#if SDL_VIDEO_DRIVER_COCOA
-
-#include "SDL_cocoavideo.h"
-
-/* We need this for IODisplayCreateInfoDictionary and kIODisplayOnlyPreferredName */
-#include <IOKit/graphics/IOGraphicsLib.h>
-
-/* We need this for CVDisplayLinkGetNominalOutputVideoRefreshPeriod */
-#include <CoreVideo/CVBase.h>
-#include <CoreVideo/CVDisplayLink.h>
-
-/* we need this for ShowMenuBar() and HideMenuBar(). */
-#include <Carbon/Carbon.h>
-
-/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */
-#include <AvailabilityMacros.h>
-
-
-static void
-Cocoa_ToggleMenuBar(const BOOL show)
-{
- /* !!! FIXME: keep an eye on this.
- * ShowMenuBar/HideMenuBar is officially unavailable for 64-bit binaries.
- * It happens to work, as of 10.7, but we're going to see if
- * we can just simply do without it on newer OSes...
- */
-#if (MAC_OS_X_VERSION_MIN_REQUIRED < 1070) && !defined(__LP64__)
- if (show) {
- ShowMenuBar();
- } else {
- HideMenuBar();
- }
-#endif
-}
-
-static int
-CG_SetError(const char *prefix, CGDisplayErr result)
-{
- const char *error;
-
- switch (result) {
- case kCGErrorFailure:
- error = "kCGErrorFailure";
- break;
- case kCGErrorIllegalArgument:
- error = "kCGErrorIllegalArgument";
- break;
- case kCGErrorInvalidConnection:
- error = "kCGErrorInvalidConnection";
- break;
- case kCGErrorInvalidContext:
- error = "kCGErrorInvalidContext";
- break;
- case kCGErrorCannotComplete:
- error = "kCGErrorCannotComplete";
- break;
- case kCGErrorNotImplemented:
- error = "kCGErrorNotImplemented";
- break;
- case kCGErrorRangeCheck:
- error = "kCGErrorRangeCheck";
- break;
- case kCGErrorTypeCheck:
- error = "kCGErrorTypeCheck";
- break;
- case kCGErrorInvalidOperation:
- error = "kCGErrorInvalidOperation";
- break;
- case kCGErrorNoneAvailable:
- error = "kCGErrorNoneAvailable";
- break;
- default:
- error = "Unknown Error";
- break;
- }
- return SDL_SetError("%s: %s", prefix, error);
-}
-
-static SDL_bool
-GetDisplayMode(_THIS, CGDisplayModeRef vidmode, CVDisplayLinkRef link, SDL_DisplayMode *mode)
-{
- SDL_DisplayModeData *data;
- int width = 0;
- int height = 0;
- int bpp = 0;
- int refreshRate = 0;
- CFStringRef fmt;
-
- data = (SDL_DisplayModeData *) SDL_malloc(sizeof(*data));
- if (!data) {
- return SDL_FALSE;
- }
- data->moderef = vidmode;
-
- fmt = CGDisplayModeCopyPixelEncoding(vidmode);
- width = (int) CGDisplayModeGetWidth(vidmode);
- height = (int) CGDisplayModeGetHeight(vidmode);
- refreshRate = (int) (CGDisplayModeGetRefreshRate(vidmode) + 0.5);
-
- if (CFStringCompare(fmt, CFSTR(IO32BitDirectPixels),
- kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
- bpp = 32;
- } else if (CFStringCompare(fmt, CFSTR(IO16BitDirectPixels),
- kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
- bpp = 16;
- } else if (CFStringCompare(fmt, CFSTR(kIO30BitDirectPixels),
- kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
- bpp = 30;
- } else {
- bpp = 0; /* ignore 8-bit and such for now. */
- }
-
- CFRelease(fmt);
-
- /* CGDisplayModeGetRefreshRate returns 0 for many non-CRT displays. */
- if (refreshRate == 0 && link != NULL) {
- CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link);
- if ((time.flags & kCVTimeIsIndefinite) == 0 && time.timeValue != 0) {
- refreshRate = (int) ((time.timeScale / (double) time.timeValue) + 0.5);
- }
- }
-
- mode->format = SDL_PIXELFORMAT_UNKNOWN;
- switch (bpp) {
- case 16:
- mode->format = SDL_PIXELFORMAT_ARGB1555;
- break;
- case 30:
- mode->format = SDL_PIXELFORMAT_ARGB2101010;
- break;
- case 32:
- mode->format = SDL_PIXELFORMAT_ARGB8888;
- break;
- case 8: /* We don't support palettized modes now */
- default: /* Totally unrecognizable bit depth. */
- SDL_free(data);
- return SDL_FALSE;
- }
- mode->w = width;
- mode->h = height;
- mode->refresh_rate = refreshRate;
- mode->driverdata = data;
- return SDL_TRUE;
-}
-
-static const char *
-Cocoa_GetDisplayName(CGDirectDisplayID displayID)
-{
- CFDictionaryRef deviceInfo = IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), kIODisplayOnlyPreferredName);
- NSDictionary *localizedNames = [(NSDictionary *)deviceInfo objectForKey:[NSString stringWithUTF8String:kDisplayProductName]];
- const char* displayName = NULL;
-
- if ([localizedNames count] > 0) {
- displayName = SDL_strdup([[localizedNames objectForKey:[[localizedNames allKeys] objectAtIndex:0]] UTF8String]);
- }
- CFRelease(deviceInfo);
- return displayName;
-}
-
-void
-Cocoa_InitModes(_THIS)
-{ @autoreleasepool
-{
- CGDisplayErr result;
- CGDirectDisplayID *displays;
- CGDisplayCount numDisplays;
- int pass, i;
-
- result = CGGetOnlineDisplayList(0, NULL, &numDisplays);
- if (result != kCGErrorSuccess) {
- CG_SetError("CGGetOnlineDisplayList()", result);
- return;
- }
- displays = SDL_stack_alloc(CGDirectDisplayID, numDisplays);
- result = CGGetOnlineDisplayList(numDisplays, displays, &numDisplays);
- if (result != kCGErrorSuccess) {
- CG_SetError("CGGetOnlineDisplayList()", result);
- SDL_stack_free(displays);
- return;
- }
-
- /* Pick up the primary display in the first pass, then get the rest */
- for (pass = 0; pass < 2; ++pass) {
- for (i = 0; i < numDisplays; ++i) {
- SDL_VideoDisplay display;
- SDL_DisplayData *displaydata;
- SDL_DisplayMode mode;
- CGDisplayModeRef moderef = NULL;
- CVDisplayLinkRef link = NULL;
-
- if (pass == 0) {
- if (!CGDisplayIsMain(displays[i])) {
- continue;
- }
- } else {
- if (CGDisplayIsMain(displays[i])) {
- continue;
- }
- }
-
- if (CGDisplayMirrorsDisplay(displays[i]) != kCGNullDirectDisplay) {
- continue;
- }
-
- moderef = CGDisplayCopyDisplayMode(displays[i]);
-
- if (!moderef) {
- continue;
- }
-
- displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
- if (!displaydata) {
- CGDisplayModeRelease(moderef);
- continue;
- }
- displaydata->display = displays[i];
-
- CVDisplayLinkCreateWithCGDisplay(displays[i], &link);
-
- SDL_zero(display);
- /* this returns a stddup'ed string */
- display.name = (char *)Cocoa_GetDisplayName(displays[i]);
- if (!GetDisplayMode(_this, moderef, link, &mode)) {
- CVDisplayLinkRelease(link);
- CGDisplayModeRelease(moderef);
- SDL_free(display.name);
- SDL_free(displaydata);
- continue;
- }
-
- CVDisplayLinkRelease(link);
-
- display.desktop_mode = mode;
- display.current_mode = mode;
- display.driverdata = displaydata;
- SDL_AddVideoDisplay(&display);
- SDL_free(display.name);
- }
- }
- SDL_stack_free(displays);
-}}
-
-int
-Cocoa_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
-{
- SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
- CGRect cgrect;
-
- cgrect = CGDisplayBounds(displaydata->display);
- rect->x = (int)cgrect.origin.x;
- rect->y = (int)cgrect.origin.y;
- rect->w = (int)cgrect.size.width;
- rect->h = (int)cgrect.size.height;
- return 0;
-}
-
-int
-Cocoa_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
-{
- SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
- const CGDirectDisplayID cgdisplay = displaydata->display;
- NSArray *screens = [NSScreen screens];
- NSScreen *screen = nil;
-
- /* !!! FIXME: maybe track the NSScreen in SDL_DisplayData? */
- for (NSScreen *i in screens) {
- const CGDirectDisplayID thisDisplay = (CGDirectDisplayID) [[[i deviceDescription] objectForKey:@"NSScreenNumber"] unsignedIntValue];
- if (thisDisplay == cgdisplay) {
- screen = i;
- break;
- }
- }
-
- SDL_assert(screen != nil); /* didn't find it?! */
- if (screen == nil) {
- return -1;
- }
-
- const CGRect cgrect = CGDisplayBounds(cgdisplay);
- const NSRect frame = [screen visibleFrame];
-
- // !!! FIXME: I assume -[NSScreen visibleFrame] is relative to the origin of the screen in question and not the whole desktop.
- // !!! FIXME: The math vs CGDisplayBounds might be incorrect if that's not the case, though. Check this.
- rect->x = (int)(cgrect.origin.x + frame.origin.x);
- rect->y = (int)(cgrect.origin.y + frame.origin.y);
- rect->w = (int)frame.size.width;
- rect->h = (int)frame.size.height;
-
- return 0;
-}
-
-int
-Cocoa_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi)
-{
- const float MM_IN_INCH = 25.4f;
-
- SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata;
-
- CGSize displaySize = CGDisplayScreenSize(data->display);
- int pixelWidth = (int) CGDisplayPixelsWide(data->display);
- int pixelHeight = (int) CGDisplayPixelsHigh(data->display);
-
- if (ddpi) {
- *ddpi = SDL_ComputeDiagonalDPI(pixelWidth, pixelHeight, displaySize.width / MM_IN_INCH, displaySize.height / MM_IN_INCH);
- }
- if (hdpi) {
- *hdpi = pixelWidth * MM_IN_INCH / displaySize.width;
- }
- if (vdpi) {
- *vdpi = pixelHeight * MM_IN_INCH / displaySize.height;
- }
-
- return 0;
-}
-
-void
-Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
-{
- SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata;
- CFArrayRef modes = CGDisplayCopyAllDisplayModes(data->display, NULL);
-
- if (modes) {
- CVDisplayLinkRef link = NULL;
- const CFIndex count = CFArrayGetCount(modes);
- CFIndex i;
-
- CVDisplayLinkCreateWithCGDisplay(data->display, &link);
-
- for (i = 0; i < count; i++) {
- CGDisplayModeRef moderef = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i);
- SDL_DisplayMode mode;
- if (GetDisplayMode(_this, moderef, link, &mode)) {
- CGDisplayModeRetain(moderef);
- SDL_AddDisplayMode(display, &mode);
- }
- }
-
- CVDisplayLinkRelease(link);
- CFRelease(modes);
- }
-}
-
-int
-Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
-{
- SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
- SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata;
- CGDisplayFadeReservationToken fade_token = kCGDisplayFadeReservationInvalidToken;
- CGError result;
-
- /* Fade to black to hide resolution-switching flicker */
- if (CGAcquireDisplayFadeReservation(5, &fade_token) == kCGErrorSuccess) {
- CGDisplayFade(fade_token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE);
- }
-
- if (data == display->desktop_mode.driverdata) {
- /* Restoring desktop mode */
- CGDisplaySetDisplayMode(displaydata->display, data->moderef, NULL);
-
- if (CGDisplayIsMain(displaydata->display)) {
- CGReleaseAllDisplays();
- } else {
- CGDisplayRelease(displaydata->display);
- }
-
- if (CGDisplayIsMain(displaydata->display)) {
- Cocoa_ToggleMenuBar(YES);
- }
- } else {
- /* Put up the blanking window (a window above all other windows) */
- if (CGDisplayIsMain(displaydata->display)) {
- /* If we don't capture all displays, Cocoa tries to rearrange windows... *sigh* */
- result = CGCaptureAllDisplays();
- } else {
- result = CGDisplayCapture(displaydata->display);
- }
- if (result != kCGErrorSuccess) {
- CG_SetError("CGDisplayCapture()", result);
- goto ERR_NO_CAPTURE;
- }
-
- /* Do the physical switch */
- result = CGDisplaySetDisplayMode(displaydata->display, data->moderef, NULL);
- if (result != kCGErrorSuccess) {
- CG_SetError("CGDisplaySwitchToMode()", result);
- goto ERR_NO_SWITCH;
- }
-
- /* Hide the menu bar so it doesn't intercept events */
- if (CGDisplayIsMain(displaydata->display)) {
- Cocoa_ToggleMenuBar(NO);
- }
- }
-
- /* Fade in again (asynchronously) */
- if (fade_token != kCGDisplayFadeReservationInvalidToken) {
- CGDisplayFade(fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);
- CGReleaseDisplayFadeReservation(fade_token);
- }
-
- return 0;
-
- /* Since the blanking window covers *all* windows (even force quit) correct recovery is crucial */
-ERR_NO_SWITCH:
- CGDisplayRelease(displaydata->display);
-ERR_NO_CAPTURE:
- if (fade_token != kCGDisplayFadeReservationInvalidToken) {
- CGDisplayFade (fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);
- CGReleaseDisplayFadeReservation(fade_token);
- }
- return -1;
-}
-
-void
-Cocoa_QuitModes(_THIS)
-{
- int i, j;
-
- for (i = 0; i < _this->num_displays; ++i) {
- SDL_VideoDisplay *display = &_this->displays[i];
- SDL_DisplayModeData *mode;
-
- if (display->current_mode.driverdata != display->desktop_mode.driverdata) {
- Cocoa_SetDisplayMode(_this, display, &display->desktop_mode);
- }
-
- mode = (SDL_DisplayModeData *) display->desktop_mode.driverdata;
- CGDisplayModeRelease(mode->moderef);
-
- for (j = 0; j < display->num_display_modes; j++) {
- mode = (SDL_DisplayModeData*) display->display_modes[j].driverdata;
- CGDisplayModeRelease(mode->moderef);
- }
-
- }
- Cocoa_ToggleMenuBar(YES);
-}
-
-#endif /* SDL_VIDEO_DRIVER_COCOA */
-
-/* vi: set ts=4 sw=4 expandtab: */