|
|
|
@ -31,6 +31,8 @@ |
|
|
|
|
#include <limits.h> |
|
|
|
|
|
|
|
|
|
#include <IOKit/graphics/IOGraphicsLib.h> |
|
|
|
|
#include <IOKit/graphics/IOGraphicsLib.h> |
|
|
|
|
#include <CoreVideo/CVBase.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Get the name of the specified display |
|
|
|
@ -94,13 +96,21 @@ static GLboolean modeIsGood(CGDisplayModeRef mode) |
|
|
|
|
|
|
|
|
|
// Convert Core Graphics display mode to GLFW video mode |
|
|
|
|
// |
|
|
|
|
static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode) |
|
|
|
|
static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode, |
|
|
|
|
CVDisplayLinkRef link) |
|
|
|
|
{ |
|
|
|
|
GLFWvidmode result; |
|
|
|
|
result.width = (int) CGDisplayModeGetWidth(mode); |
|
|
|
|
result.height = (int) CGDisplayModeGetHeight(mode); |
|
|
|
|
result.refreshRate = (int) CGDisplayModeGetRefreshRate(mode); |
|
|
|
|
|
|
|
|
|
if (result.refreshRate == 0) |
|
|
|
|
{ |
|
|
|
|
const CVTime time = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link); |
|
|
|
|
if (!(time.flags & kCVTimeIsIndefinite)) |
|
|
|
|
result.refreshRate = (int) (time.timeScale / (double) time.timeValue); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); |
|
|
|
|
|
|
|
|
|
if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0) |
|
|
|
@ -334,6 +344,9 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) |
|
|
|
|
CFArrayRef modes; |
|
|
|
|
CFIndex count, i; |
|
|
|
|
GLFWvidmode* result; |
|
|
|
|
CVDisplayLinkRef link; |
|
|
|
|
|
|
|
|
|
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); |
|
|
|
|
|
|
|
|
|
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); |
|
|
|
|
count = CFArrayGetCount(modes); |
|
|
|
@ -348,21 +361,28 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) |
|
|
|
|
mode = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); |
|
|
|
|
if (modeIsGood(mode)) |
|
|
|
|
{ |
|
|
|
|
result[*found] = vidmodeFromCGDisplayMode(mode); |
|
|
|
|
result[*found] = vidmodeFromCGDisplayMode(mode, link); |
|
|
|
|
(*found)++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CFRelease(modes); |
|
|
|
|
|
|
|
|
|
CVDisplayLinkRelease(link); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode *mode) |
|
|
|
|
{ |
|
|
|
|
CGDisplayModeRef displayMode; |
|
|
|
|
CVDisplayLinkRef link; |
|
|
|
|
|
|
|
|
|
CVDisplayLinkCreateWithCGDisplay(monitor->ns.displayID, &link); |
|
|
|
|
|
|
|
|
|
displayMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); |
|
|
|
|
*mode = vidmodeFromCGDisplayMode(displayMode); |
|
|
|
|
*mode = vidmodeFromCGDisplayMode(displayMode, link); |
|
|
|
|
CGDisplayModeRelease(displayMode); |
|
|
|
|
|
|
|
|
|
CVDisplayLinkRelease(link); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|