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);
}