windows: Fix crashing when minimizing a window on Windows 11 (#22414)

Closes #22366

This PR fixes the issue of crashing when minimizing a window on Windows
11. And this PR supersedes #22366.

The main change in this PR is to stop rendering the window when it is
minimized. Additionally, I’ve made some modifications to the code in
#21756 to improve clarity (I think...).

cc @mgsloan 

Release Notes:

- N/A
This commit is contained in:
张小白 2024-12-25 17:52:19 +08:00 committed by GitHub
parent 1a9f0a647a
commit 95911aaa14
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 6 additions and 7 deletions

View file

@ -146,19 +146,18 @@ fn handle_size_msg(
// Don't resize the renderer when the window is minimized, but record that it was minimized so // 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`. // that on restore the swap chain can be recreated via `update_drawable_size_even_if_unchanged`.
if wparam.0 == SIZE_MINIMIZED as usize { if wparam.0 == SIZE_MINIMIZED as usize {
lock.is_minimized = Some(true); lock.restore_from_minimized = lock.callbacks.request_frame.take();
return Some(0); 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 width = lparam.loword().max(1) as i32;
let height = lparam.hiword().max(1) as i32; let height = lparam.hiword().max(1) as i32;
let new_size = size(DevicePixels(width), DevicePixels(height)); let new_size = size(DevicePixels(width), DevicePixels(height));
let scale_factor = lock.scale_factor; let scale_factor = lock.scale_factor;
if may_have_been_minimized { if lock.restore_from_minimized.is_some() {
lock.renderer lock.renderer
.update_drawable_size_even_if_unchanged(new_size); .update_drawable_size_even_if_unchanged(new_size);
lock.callbacks.request_frame = lock.restore_from_minimized.take();
} else { } else {
lock.renderer.update_drawable_size(new_size); lock.renderer.update_drawable_size(new_size);
} }

View file

@ -38,7 +38,7 @@ pub struct WindowsWindowState {
pub fullscreen_restore_bounds: Bounds<Pixels>, pub fullscreen_restore_bounds: Bounds<Pixels>,
pub border_offset: WindowBorderOffset, pub border_offset: WindowBorderOffset,
pub scale_factor: f32, pub scale_factor: f32,
pub is_minimized: Option<bool>, pub restore_from_minimized: Option<Box<dyn FnMut(RequestFrameOptions)>>,
pub callbacks: Callbacks, pub callbacks: Callbacks,
pub input_handler: Option<PlatformInputHandler>, pub input_handler: Option<PlatformInputHandler>,
@ -94,7 +94,7 @@ impl WindowsWindowState {
size: logical_size, size: logical_size,
}; };
let border_offset = WindowBorderOffset::default(); let border_offset = WindowBorderOffset::default();
let is_minimized = None; let restore_from_minimized = None;
let renderer = windows_renderer::init(gpu_context, hwnd, transparent)?; let renderer = windows_renderer::init(gpu_context, hwnd, transparent)?;
let callbacks = Callbacks::default(); let callbacks = Callbacks::default();
let input_handler = None; let input_handler = None;
@ -112,7 +112,7 @@ impl WindowsWindowState {
fullscreen_restore_bounds, fullscreen_restore_bounds,
border_offset, border_offset,
scale_factor, scale_factor,
is_minimized, restore_from_minimized,
callbacks, callbacks,
input_handler, input_handler,
system_key_handled, system_key_handled,