From d3ca685b7763fac10c5ae2db7339adb136585e92 Mon Sep 17 00:00:00 2001 From: Arend van Beelen jr Date: Wed, 22 Nov 2023 13:14:51 +0100 Subject: [PATCH] Fix crash when running iPad build on macOS --- CHANGELOG.md | 1 + src/platform_impl/ios/app_state.rs | 14 +++++++++++--- src/platform_impl/ios/event_loop.rs | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05ba2d40..7993a000 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Unreleased` header. # Unreleased +- Fix crash when running iOS app on macOS. - On X11, check common alternative cursor names when loading cursor. - On Windows, fix so `drag_window` and `drag_resize_window` can be called from another thread. - On Windows, fix `set_control_flow` in `AboutToWait` not being taken in account. diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index 5a4a9cb2..b486c2f6 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -200,6 +200,10 @@ impl AppState { ) } + fn has_terminated(&self) -> bool { + matches!(self.state(), AppStateImpl::Terminated) + } + fn will_launch_transition(&mut self, queued_event_handler: Box) { let (queued_windows, queued_events, queued_gpu_redraws) = match self.take_state() { AppStateImpl::NotLaunched { @@ -243,7 +247,7 @@ impl AppState { fn wakeup_transition(&mut self) -> Option { // before `AppState::did_finish_launching` is called, pretend there is no running // event loop. - if !self.has_launched() { + if !self.has_launched() || self.has_terminated() { return None; } @@ -390,7 +394,7 @@ impl AppState { } fn events_cleared_transition(&mut self) { - if !self.has_launched() { + if !self.has_launched() || self.has_terminated() { return; } let (waiting_event_handler, old) = match self.take_state() { @@ -586,6 +590,10 @@ pub(crate) fn handle_nonuser_events>( events: I, ) { let mut this = AppState::get_mut(mtm); + if this.has_terminated() { + return; + } + let (mut event_handler, active_control_flow, processing_redraws) = match this.try_user_callback_transition() { UserCallbackTransitionResult::ReentrancyPrevented { queued_events } => { @@ -737,7 +745,7 @@ fn handle_user_events(mtm: MainThreadMarker) { pub fn handle_main_events_cleared(mtm: MainThreadMarker) { let mut this = AppState::get_mut(mtm); - if !this.has_launched() { + if !this.has_launched() || this.has_terminated() { return; } match this.state_mut() { diff --git a/src/platform_impl/ios/event_loop.rs b/src/platform_impl/ios/event_loop.rs index dab69606..a260f78a 100644 --- a/src/platform_impl/ios/event_loop.rs +++ b/src/platform_impl/ios/event_loop.rs @@ -289,7 +289,7 @@ fn setup_control_flow_observers() { #[allow(non_upper_case_globals)] match activity { kCFRunLoopBeforeWaiting => app_state::handle_main_events_cleared(mtm), - kCFRunLoopExit => unimplemented!(), // not expected to ever happen + kCFRunLoopExit => {} // may happen when running on macOS _ => unreachable!(), } } @@ -304,7 +304,7 @@ fn setup_control_flow_observers() { #[allow(non_upper_case_globals)] match activity { kCFRunLoopBeforeWaiting => app_state::handle_events_cleared(mtm), - kCFRunLoopExit => unimplemented!(), // not expected to ever happen + kCFRunLoopExit => {} // may happen when running on macOS _ => unreachable!(), } }