From 0b00bc8c991698166e4ef2bb0036adabf16302d4 Mon Sep 17 00:00:00 2001 From: Arend van Beelen jr Date: Tue, 4 Jul 2023 23:50:53 +0200 Subject: [PATCH] Expose `WindowDestroyed` events (#9016) # Objective I'm creating an iOS game and had to find a way to persist game state when the application is terminated. This required listening to the [`applicationWillTerminate()` method](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623111-applicationwillterminate), but I cannot do so myself anymore since `winit` already set up a delegate to listen for it, and there can be only one delegate. So I had to move up the stack and try to respond to one of the events from `winit` instead. It appears `winit` fires two events that could serve my purpose: `WindowEvent::Destroyed` and `Event::LoopDestroyed`. It seemed to me the former might be slightly more generally useful, and I also found a past discussion that suggested it would be appropriate for Bevy to have a `WindowDestroyed` event: https://github.com/bevyengine/bevy/pull/5589#discussion_r942811021 ## Solution - I've added the `WindowDestroyed` event, which fires when `winit` fires `WindowEvent::Destroyed`. --- ## Changelog ### Added - Introduced a new `WindowDestroyed` event type. It is used to indicate a window has been destroyed by the windowing system. --- src/lib.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ac4db6d..46b3e3e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -41,8 +41,8 @@ use bevy_utils::{ use bevy_window::{ exit_on_all_closed, CursorEntered, CursorLeft, CursorMoved, FileDragAndDrop, Ime, ReceivedCharacter, RequestRedraw, Window, WindowBackendScaleFactorChanged, - WindowCloseRequested, WindowCreated, WindowFocused, WindowMoved, WindowResized, - WindowScaleFactorChanged, WindowThemeChanged, + WindowCloseRequested, WindowCreated, WindowDestroyed, WindowFocused, WindowMoved, + WindowResized, WindowScaleFactorChanged, WindowThemeChanged, }; #[cfg(target_os = "android")] @@ -231,6 +231,7 @@ struct WindowEvents<'w> { window_focused: EventWriter<'w, WindowFocused>, window_moved: EventWriter<'w, WindowMoved>, window_theme_changed: EventWriter<'w, WindowThemeChanged>, + window_destroyed: EventWriter<'w, WindowDestroyed>, } #[derive(SystemParam)] @@ -638,6 +639,11 @@ pub fn winit_runner(mut app: App) { theme: convert_winit_theme(theme), }); } + WindowEvent::Destroyed => { + window_events.window_destroyed.send(WindowDestroyed { + window: window_entity, + }); + } _ => {} }