mirror of
https://github.com/rust-windowing/winit.git
synced 2026-08-30 13:20:06 -04:00
Don't panic when getting refresh rate failed (#2533)
This fixes a crash on macOS when trying to get the monitor refresh rate from the disabled monitor. Co-authored-by: Jet Spark <lixiaopeng.jetspark@bytedance.com> Co-authored-by: Mads Marquart <mads@marquart.dk>
This commit is contained in:
@@ -143,6 +143,9 @@ impl MonitorHandle {
|
||||
|
||||
/// The monitor refresh rate used by the system.
|
||||
///
|
||||
/// Return `Some` if succeed, or `None` if failed, which usually happens when the monitor
|
||||
/// the window is on is removed.
|
||||
///
|
||||
/// When using exclusive fullscreen, the refresh rate of the [`VideoMode`] that was used to
|
||||
/// enter fullscreen should be used instead.
|
||||
#[inline]
|
||||
|
||||
@@ -215,15 +215,18 @@ impl MonitorHandle {
|
||||
pub fn refresh_rate_millihertz(&self) -> Option<u32> {
|
||||
unsafe {
|
||||
let mut display_link = std::ptr::null_mut();
|
||||
assert_eq!(
|
||||
ffi::CVDisplayLinkCreateWithCGDisplay(self.0, &mut display_link),
|
||||
ffi::kCVReturnSuccess
|
||||
);
|
||||
if ffi::CVDisplayLinkCreateWithCGDisplay(self.0, &mut display_link)
|
||||
!= ffi::kCVReturnSuccess
|
||||
{
|
||||
return None;
|
||||
}
|
||||
let time = ffi::CVDisplayLinkGetNominalOutputVideoRefreshPeriod(display_link);
|
||||
ffi::CVDisplayLinkRelease(display_link);
|
||||
|
||||
// This value is indefinite if an invalid display link was specified
|
||||
assert!(time.flags & ffi::kCVTimeIsIndefinite == 0);
|
||||
if time.flags & ffi::kCVTimeIsIndefinite != 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
Some((time.time_scale as i64 / time.time_value * 1000) as u32)
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ impl MonitorHandle {
|
||||
|
||||
#[inline]
|
||||
pub fn refresh_rate_millihertz(&self) -> Option<u32> {
|
||||
let monitor_info = get_monitor_info(self.0).unwrap();
|
||||
let monitor_info = get_monitor_info(self.0).ok()?;
|
||||
let device_name = monitor_info.szDevice.as_ptr();
|
||||
unsafe {
|
||||
let mut mode: DEVMODEW = mem::zeroed();
|
||||
|
||||
Reference in New Issue
Block a user