On windows, recreate renderer swap chain on restore from minimized (#21756)

Closes #21688

Release Notes:

- Windows: Fix freeze after window minimize and maximize
This commit is contained in:
Michael Sloan 2024-12-10 11:59:44 -07:00 committed by GitHub
parent adc66473e7
commit ab1e9bf270
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 3 deletions

View file

@ -141,16 +141,27 @@ fn handle_size_msg(
lparam: LPARAM,
state_ptr: Rc<WindowsWindowStatePtr>,
) -> Option<isize> {
let mut lock = state_ptr.state.borrow_mut();
// Don't resize the renderer when the window is minimized, but record that it was minimized so
// that on restore the swap chain can be recreated via `update_drawable_size_even_if_unchanged`.
if wparam.0 == SIZE_MINIMIZED as usize {
lock.is_minimized = Some(true);
return Some(0);
}
let may_have_been_minimized = lock.is_minimized.unwrap_or(true);
lock.is_minimized = Some(false);
let width = lparam.loword().max(1) as i32;
let height = lparam.hiword().max(1) as i32;
let mut lock = state_ptr.state.borrow_mut();
let new_size = size(DevicePixels(width), DevicePixels(height));
let scale_factor = lock.scale_factor;
lock.renderer.update_drawable_size(new_size);
if may_have_been_minimized {
lock.renderer
.update_drawable_size_even_if_unchanged(new_size);
} else {
lock.renderer.update_drawable_size(new_size);
}
let new_size = new_size.to_pixels(scale_factor);
lock.logical_size = new_size;
if let Some(mut callback) = lock.callbacks.resize.take() {