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

张小白 created

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

Change summary

crates/gpui/src/platform/windows/events.rs | 7 +++----
crates/gpui/src/platform/windows/window.rs | 6 +++---
2 files changed, 6 insertions(+), 7 deletions(-)

Detailed changes

crates/gpui/src/platform/windows/events.rs 🔗

@@ -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
     // 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);
+        lock.restore_from_minimized = lock.callbacks.request_frame.take();
         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 new_size = size(DevicePixels(width), DevicePixels(height));
     let scale_factor = lock.scale_factor;
-    if may_have_been_minimized {
+    if lock.restore_from_minimized.is_some() {
         lock.renderer
             .update_drawable_size_even_if_unchanged(new_size);
+        lock.callbacks.request_frame = lock.restore_from_minimized.take();
     } else {
         lock.renderer.update_drawable_size(new_size);
     }

crates/gpui/src/platform/windows/window.rs 🔗

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