blob: eace771c4b45052e2e5634a09a298bc0e1145fab [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/display/mac/screen_utils_mac.h"
namespace display {
NSScreen* GetNSScreenFromDisplayID(CGDirectDisplayID display_id) {
for (NSScreen* screen in NSScreen.screens) {
CGDirectDisplayID screen_display_id = kCGNullDirectDisplay;
if (@available(macOS 26, *)) {
screen_display_id = screen.CGDirectDisplayID;
} else {
screen_display_id =
[screen.deviceDescription[@"NSScreenNumber"] unsignedIntValue];
}
if (screen_display_id == display_id) {
return screen;
}
}
return nullptr;
}
base::TimeDelta GetNSScreenRefreshInterval(CGDirectDisplayID display_id) {
NSScreen* screen = GetNSScreenFromDisplayID(display_id);
base::TimeDelta interval;
if (screen) {
interval = base::Seconds(1) * screen.minimumRefreshInterval;
}
// For ExternalDisplayLinkMac, we start to use a display link before it's
// actually created in the browser. If this NSScreen is invalid, just use a
// default value. Viz will be updated again later if anything goes wrong in
// the browser.
if (interval.is_positive()) {
return interval;
} else {
return base::Seconds(1) / 60.0;
}
}
void GetNSScreenRefreshIntervalRange(CGDirectDisplayID display_id,
base::TimeDelta& min_interval,
base::TimeDelta& max_interval,
base::TimeDelta& granularity) {
NSScreen* screen = GetNSScreenFromDisplayID(display_id);
if (screen) {
min_interval = base::Seconds(1) * screen.minimumRefreshInterval;
max_interval = base::Seconds(1) * screen.maximumRefreshInterval;
granularity = base::Seconds(1) * screen.displayUpdateGranularity;
} else {
min_interval = max_interval = granularity = base::Seconds(1) / 60.0;
}
}
} // namespace display