Fixed zero refresh rate on some monitors.
diff --git a/src/cocoa_monitor.m b/src/cocoa_monitor.m index e7aec2b..8340280 100644 --- a/src/cocoa_monitor.m +++ b/src/cocoa_monitor.m
@@ -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 @@ // 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 @@ 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 @@ 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); }