From 61ba0fbfb6aa30d9249fe0376318f107e3c24cf3 Mon Sep 17 00:00:00 2001 From: Aaron Loucks Date: Sat, 29 Mar 2025 11:44:26 -0400 Subject: [PATCH] Process WindowCloseRequested events after app update Pressing the window close button when in a reactive UpdateMode isn't handled until the reactive wait timeout is triggered or the user triggers some other device event. This change adds an explict check for the WindowCloseRequested event to trigger another app update to process it. --- crates/bevy_winit/src/state.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crates/bevy_winit/src/state.rs b/crates/bevy_winit/src/state.rs index ffab9ff6dc..155e7aa072 100644 --- a/crates/bevy_winit/src/state.rs +++ b/crates/bevy_winit/src/state.rs @@ -537,6 +537,7 @@ impl ApplicationHandler for WinitAppRunnerState { impl WinitAppRunnerState { fn redraw_requested(&mut self, event_loop: &ActiveEventLoop) { let mut redraw_event_reader = EventCursor::::default(); + let mut close_event_reader = EventCursor::::default(); let mut focused_windows_state: SystemState<(Res, Query<(Entity, &Window)>)> = SystemState::new(self.world_mut()); @@ -662,6 +663,19 @@ impl WinitAppRunnerState { let (config, windows) = focused_windows_state.get(self.world()); let focused = windows.iter().any(|(_, window)| window.focused); update_mode = config.update_mode(focused); + + // Running the app may have produced WindowCloseRequested events that should be processed + if let Some(close_request_events) = + self.world().get_resource::>() + { + if close_event_reader + .read(close_request_events) + .last() + .is_some() + { + self.redraw_requested = true; + } + } } // The update mode could have been changed, so we need to redraw and force an update