gpui(windows): Force a paint message when running out foreground budget (#46609) (cherry-pick to preview) (#46622)

zed-zippy[bot] , Lukas Wirth , and John Tur created

Cherry-pick of #46609 to preview

----
Release Notes:

- Fixed zed no longer rendering on windows in a timely manner if it gets
overloaded with foreground work

Co-authored-by: John Tur <john-tur@outlook.com>

Co-authored-by: Lukas Wirth <lukas@zed.dev>
Co-authored-by: John Tur <john-tur@outlook.com>

Change summary

crates/gpui/src/platform/windows/platform.rs | 5 +++++
1 file changed, 5 insertions(+)

Detailed changes

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

@@ -838,6 +838,11 @@ impl WindowsPlatformInner {
                     let peek_msg = |msg: &mut _, msg_kind| unsafe {
                         PeekMessageW(msg, None, 0, 0, PM_REMOVE | msg_kind).as_bool()
                     };
+                    // We need to process a paint message here as otherwise we will re-enter `run_foreground_task` before painting if we have work remaining.
+                    // The reason for this is that windows prefers custom application message processing over system messages.
+                    if peek_msg(&mut msg, PM_QS_PAINT) {
+                        process_message(&msg);
+                    }
                     while peek_msg(&mut msg, PM_QS_INPUT) {
                         process_message(&msg);
                     }