From fc8b468d84f1fef5bf5183dd0b36d9411d454ea7 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Sat, 26 Sep 2020 06:47:26 -0700 Subject: [PATCH] [macOS] Set the display refresh rate (flutter/engine#21095) Fixes: https://github.com/flutter/flutter/issues/49222 --- .../macos/framework/Source/FlutterEngine.mm | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/engine/src/flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/engine/src/flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 36b24f3424d..6210378110d 100644 --- a/engine/src/flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/engine/src/flutter/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -281,6 +281,7 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, [self sendUserLocales]; [self updateWindowMetrics]; + [self updateDisplayConfig]; return YES; } @@ -317,6 +318,31 @@ static bool OnAcquireExternalTexture(FlutterEngine* engine, return _resourceContext; } +- (void)updateDisplayConfig { + if (!_engine) { + return; + } + + CVDisplayLinkRef displayLinkRef; + CGDirectDisplayID mainDisplayID = CGMainDisplayID(); + CVDisplayLinkCreateWithCGDisplay(mainDisplayID, &displayLinkRef); + CVTime nominal = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(displayLinkRef); + if (!(nominal.flags & kCVTimeIsIndefinite)) { + double refreshRate = static_cast(nominal.timeScale) / nominal.timeValue; + + FlutterEngineDisplay display; + display.struct_size = sizeof(display); + display.display_id = mainDisplayID; + display.refresh_rate = round(refreshRate); + + std::vector displays = {display}; + FlutterEngineNotifyDisplayUpdate(_engine, kFlutterEngineDisplaysUpdateTypeStartup, + displays.data(), displays.size()); + } + + CVDisplayLinkRelease(displayLinkRef); +} + - (void)updateWindowMetrics { if (!_engine) { return;