From 0b876c3d4e87b65ea3b3f05ec3274b16600e47fc Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 3 Oct 2020 19:38:55 +0200 Subject: Add refresh rate hint --- pugl/detail/implementation.c | 1 + pugl/detail/mac.m | 20 ++++++++++++++++++++ pugl/detail/win.c | 4 ++-- pugl/detail/win.h | 1 - pugl/detail/x11.c | 13 +++++++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) (limited to 'pugl/detail') diff --git a/pugl/detail/implementation.c b/pugl/detail/implementation.c index 31ee643..6a5f932 100644 --- a/pugl/detail/implementation.c +++ b/pugl/detail/implementation.c @@ -117,6 +117,7 @@ puglSetDefaultHints(PuglHints hints) hints[PUGL_SWAP_INTERVAL] = PUGL_DONT_CARE; hints[PUGL_RESIZABLE] = PUGL_FALSE; hints[PUGL_IGNORE_KEY_REPEAT] = PUGL_FALSE; + hints[PUGL_REFRESH_RATE] = PUGL_DONT_CARE; } PuglWorld* diff --git a/pugl/detail/mac.m b/pugl/detail/mac.m index 0c50d20..64590c6 100644 --- a/pugl/detail/mac.m +++ b/pugl/detail/mac.m @@ -880,6 +880,26 @@ puglRealize(PuglView* view) view->hints[PUGL_ALPHA_BITS] = 8; } + CGDirectDisplayID displayId = CGMainDisplayID(); + CGDisplayModeRef mode = CGDisplayCopyDisplayMode(displayId); + + // Try to get refresh rate from mode (usually fails) + view->hints[PUGL_REFRESH_RATE] = (int)CGDisplayModeGetRefreshRate(mode); + + CGDisplayModeRelease(mode); + if (view->hints[PUGL_REFRESH_RATE] == 0) { + // Get refresh rate from a display link + // TODO: Keep and actually use the display link for something? + CVDisplayLinkRef link; + CVDisplayLinkCreateWithCGDisplay(displayId, &link); + + const CVTime p = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link); + const double r = p.timeScale / (double)p.timeValue; + view->hints[PUGL_REFRESH_RATE] = (int)lrint(r); + + CVDisplayLinkRelease(link); + } + if (view->frame.width == 0.0 && view->frame.height == 0.0) { if (view->defaultWidth == 0.0 && view->defaultHeight == 0.0) { return PUGL_BAD_CONFIGURATION; diff --git a/pugl/detail/win.c b/pugl/detail/win.c index 38eca9d..17346cb 100644 --- a/pugl/detail/win.c +++ b/pugl/detail/win.c @@ -183,7 +183,7 @@ puglRealize(PuglView* view) // Get refresh rate for resize draw timer DEVMODEA devMode = {0}; EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devMode); - view->impl->refreshRate = devMode.dmDisplayFrequency; + view->hints[PUGL_REFRESH_RATE] = (int)devMode.dmDisplayFrequency; // Register window class if necessary if (!puglRegisterWindowClass(view->world->className)) { @@ -592,7 +592,7 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam) view->impl->resizing = true; SetTimer(view->impl->hwnd, PUGL_RESIZE_TIMER_ID, - 1000 / view->impl->refreshRate, + 1000 / (UINT)view->hints[PUGL_REFRESH_RATE], NULL); break; case WM_TIMER: diff --git a/pugl/detail/win.h b/pugl/detail/win.h index 1b9b0c4..547bd02 100644 --- a/pugl/detail/win.h +++ b/pugl/detail/win.h @@ -38,7 +38,6 @@ struct PuglInternalsImpl { HCURSOR cursor; HDC hdc; PuglSurface* surface; - DWORD refreshRate; bool flashing; bool resizing; bool mouseTracked; diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c index 7b8daf2..f9a45e8 100644 --- a/pugl/detail/x11.c +++ b/pugl/detail/x11.c @@ -37,6 +37,10 @@ #include #include +#ifdef HAVE_XRANDR +# include +#endif + #ifdef HAVE_XSYNC # include # include @@ -325,6 +329,15 @@ puglRealize(PuglView* view) return st; } +#ifdef HAVE_XRANDR + // Set refresh rate hint to the real refresh rate + XRRScreenConfiguration* conf = XRRGetScreenInfo(display, xParent); + short current_rate = XRRConfigCurrentRate(conf); + + view->hints[PUGL_REFRESH_RATE] = current_rate; + XRRFreeScreenConfigInfo(conf); +#endif + updateSizeHints(view); XClassHint classHint = { world->className, world->className }; -- cgit v1.2.1