gpui: Do not panic when GetMonitorInfoW fails (#43397)

Fixes ZED-29R

Release Notes:

- N/A *or* Added/Fixed/Improved ...
This commit is contained in:
Lukas Wirth
2025-11-24 13:35:24 +00:00
committed by GitHub
parent 2d55c088cc
commit f6f8fc1229
2 changed files with 20 additions and 21 deletions
+18 -19
View File
@@ -63,22 +63,21 @@ impl WindowsDisplay {
})
}
pub fn new_with_handle(monitor: HMONITOR) -> Self {
let info = get_monitor_info(monitor).expect("unable to get monitor info");
pub fn new_with_handle(monitor: HMONITOR) -> anyhow::Result<Self> {
let info = get_monitor_info(monitor)?;
let monitor_size = info.monitorInfo.rcMonitor;
let uuid = generate_uuid(&info.szDevice);
let display_id = available_monitors()
.iter()
.position(|handle| handle.0 == monitor.0)
.unwrap();
let scale_factor =
get_scale_factor_for_monitor(monitor).expect("unable to get scale factor for monitor");
let scale_factor = get_scale_factor_for_monitor(monitor)?;
let physical_size = size(
(monitor_size.right - monitor_size.left).into(),
(monitor_size.bottom - monitor_size.top).into(),
);
WindowsDisplay {
Ok(WindowsDisplay {
handle: monitor,
display_id: DisplayId(display_id as _),
scale_factor,
@@ -95,21 +94,20 @@ impl WindowsDisplay {
size: physical_size,
},
uuid,
}
})
}
fn new_with_handle_and_id(handle: HMONITOR, display_id: DisplayId) -> Self {
let info = get_monitor_info(handle).expect("unable to get monitor info");
fn new_with_handle_and_id(handle: HMONITOR, display_id: DisplayId) -> anyhow::Result<Self> {
let info = get_monitor_info(handle)?;
let monitor_size = info.monitorInfo.rcMonitor;
let uuid = generate_uuid(&info.szDevice);
let scale_factor =
get_scale_factor_for_monitor(handle).expect("unable to get scale factor for monitor");
let scale_factor = get_scale_factor_for_monitor(handle)?;
let physical_size = size(
(monitor_size.right - monitor_size.left).into(),
(monitor_size.bottom - monitor_size.top).into(),
);
WindowsDisplay {
Ok(WindowsDisplay {
handle,
display_id,
scale_factor,
@@ -126,7 +124,7 @@ impl WindowsDisplay {
size: physical_size,
},
uuid,
}
})
}
pub fn primary_monitor() -> Option<Self> {
@@ -140,7 +138,7 @@ impl WindowsDisplay {
);
return None;
}
Some(WindowsDisplay::new_with_handle(monitor))
WindowsDisplay::new_with_handle(monitor).log_err()
}
/// Check if the center point of given bounds is inside this monitor
@@ -154,7 +152,9 @@ impl WindowsDisplay {
if monitor.is_invalid() {
false
} else {
let display = WindowsDisplay::new_with_handle(monitor);
let Ok(display) = WindowsDisplay::new_with_handle(monitor) else {
return false;
};
display.uuid == self.uuid
}
}
@@ -163,11 +163,10 @@ impl WindowsDisplay {
available_monitors()
.into_iter()
.enumerate()
.map(|(id, handle)| {
Rc::new(WindowsDisplay::new_with_handle_and_id(
handle,
DisplayId(id as _),
)) as Rc<dyn PlatformDisplay>
.filter_map(|(id, handle)| {
Some(Rc::new(
WindowsDisplay::new_with_handle_and_id(handle, DisplayId(id as _)).ok()?,
) as Rc<dyn PlatformDisplay>)
})
.collect()
}
+2 -2
View File
@@ -138,7 +138,7 @@ impl WindowsWindowInner {
// monitor is invalid, we do nothing.
if !monitor.is_invalid() && lock.display.handle != monitor {
// we will get the same monitor if we only have one
lock.display = WindowsDisplay::new_with_handle(monitor);
lock.display = WindowsDisplay::new_with_handle(monitor).log_err()?;
}
}
if let Some(mut callback) = lock.callbacks.moved.take() {
@@ -829,7 +829,7 @@ impl WindowsWindowInner {
log::error!("No monitor detected!");
return None;
}
let new_display = WindowsDisplay::new_with_handle(new_monitor);
let new_display = WindowsDisplay::new_with_handle(new_monitor).log_err()?;
self.state.borrow_mut().display = new_display;
Some(0)
}