diff --git a/src/platform_impl/windows/event_loop.rs b/src/platform_impl/windows/event_loop.rs index b7bc1cd42..0d666b106 100644 --- a/src/platform_impl/windows/event_loop.rs +++ b/src/platform_impl/windows/event_loop.rs @@ -188,11 +188,11 @@ impl EventLoop { where F: 'static + FnMut(Event<'_, T>, &RootELW, &mut ControlFlow), { - self.run_return(event_handler); - ::std::process::exit(0); + let exit_code = self.run_return(event_handler); + ::std::process::exit(exit_code); } - pub fn run_return(&mut self, mut event_handler: F) + pub fn run_return(&mut self, mut event_handler: F) -> i32 where F: FnMut(Event<'_, T>, &RootELW, &mut ControlFlow), { @@ -225,7 +225,9 @@ impl EventLoop { panic::resume_unwind(payload); } - if runner.control_flow() == ControlFlow::Exit && !runner.handling_events() { + if matches!(runner.control_flow(), ControlFlow::Exit(_)) + && !runner.handling_events() + { break 'main; } } @@ -234,7 +236,15 @@ impl EventLoop { unsafe { runner.loop_destroyed(); } + let exit_code = if let ControlFlow::Exit(code) = runner.control_flow() { + code + } else { + // we can't know what exactly the user wanted to return, so just assume 0 + 0 + }; + runner.reset_runner(); + exit_code } pub fn create_proxy(&self) -> EventLoopProxy { @@ -763,7 +773,7 @@ unsafe fn process_control_flow(runner: &EventLoopRunner) { Box::into_raw(WaitUntilInstantBox::new(until)) as LPARAM, ); } - ControlFlow::Exit => (), + ControlFlow::Exit(_) => (), } } diff --git a/src/platform_impl/windows/event_loop/runner.rs b/src/platform_impl/windows/event_loop/runner.rs index cf3276746..df9e52ebb 100644 --- a/src/platform_impl/windows/event_loop/runner.rs +++ b/src/platform_impl/windows/event_loop/runner.rs @@ -241,10 +241,10 @@ impl EventLoopRunner { let mut event_handler = self.event_handler.take() .expect("either event handler is re-entrant (likely), or no event handler is registered (very unlikely)"); - if control_flow != ControlFlow::Exit { - event_handler(event, &mut control_flow); + if let ControlFlow::Exit(code) = control_flow { + event_handler(event, &mut ControlFlow::Exit(code)); } else { - event_handler(event, &mut ControlFlow::Exit); + event_handler(event, &mut control_flow); } assert!(self.event_handler.replace(Some(event_handler)).is_none()); @@ -372,10 +372,12 @@ impl EventLoopRunner { let start_cause = match (init, self.control_flow()) { (true, _) => StartCause::Init, (false, ControlFlow::Poll) => StartCause::Poll, - (false, ControlFlow::Exit) | (false, ControlFlow::Wait) => StartCause::WaitCancelled { - requested_resume: None, - start: self.last_events_cleared.get(), - }, + (false, ControlFlow::Exit(_)) | (false, ControlFlow::Wait) => { + StartCause::WaitCancelled { + requested_resume: None, + start: self.last_events_cleared.get(), + } + } (false, ControlFlow::WaitUntil(requested_resume)) => { if Instant::now() < requested_resume { StartCause::WaitCancelled {