diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 36b24f3424ddc..6210378110db0 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -281,6 +281,7 @@ - (BOOL)runWithEntrypoint:(NSString*)entrypoint { [self sendUserLocales]; [self updateWindowMetrics]; + [self updateDisplayConfig]; return YES; } @@ -317,6 +318,31 @@ - (NSOpenGLContext*)resourceContext { 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;