Add exit code on windows

This commit is contained in:
MultisampledNight
2021-12-17 18:15:35 +01:00
parent fbd3d03de9
commit e0b3cf2abc
2 changed files with 24 additions and 12 deletions

View File

@@ -188,11 +188,11 @@ impl<T: 'static> EventLoop<T> {
where where
F: 'static + FnMut(Event<'_, T>, &RootELW<T>, &mut ControlFlow), F: 'static + FnMut(Event<'_, T>, &RootELW<T>, &mut ControlFlow),
{ {
self.run_return(event_handler); let exit_code = self.run_return(event_handler);
::std::process::exit(0); ::std::process::exit(exit_code);
} }
pub fn run_return<F>(&mut self, mut event_handler: F) pub fn run_return<F>(&mut self, mut event_handler: F) -> i32
where where
F: FnMut(Event<'_, T>, &RootELW<T>, &mut ControlFlow), F: FnMut(Event<'_, T>, &RootELW<T>, &mut ControlFlow),
{ {
@@ -225,7 +225,9 @@ impl<T: 'static> EventLoop<T> {
panic::resume_unwind(payload); 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; break 'main;
} }
} }
@@ -234,7 +236,15 @@ impl<T: 'static> EventLoop<T> {
unsafe { unsafe {
runner.loop_destroyed(); 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(); runner.reset_runner();
exit_code
} }
pub fn create_proxy(&self) -> EventLoopProxy<T> { pub fn create_proxy(&self) -> EventLoopProxy<T> {
@@ -763,7 +773,7 @@ unsafe fn process_control_flow<T: 'static>(runner: &EventLoopRunner<T>) {
Box::into_raw(WaitUntilInstantBox::new(until)) as LPARAM, Box::into_raw(WaitUntilInstantBox::new(until)) as LPARAM,
); );
} }
ControlFlow::Exit => (), ControlFlow::Exit(_) => (),
} }
} }

View File

@@ -241,10 +241,10 @@ impl<T> EventLoopRunner<T> {
let mut event_handler = self.event_handler.take() let mut event_handler = self.event_handler.take()
.expect("either event handler is re-entrant (likely), or no event handler is registered (very unlikely)"); .expect("either event handler is re-entrant (likely), or no event handler is registered (very unlikely)");
if control_flow != ControlFlow::Exit { if let ControlFlow::Exit(code) = control_flow {
event_handler(event, &mut control_flow); event_handler(event, &mut ControlFlow::Exit(code));
} else { } else {
event_handler(event, &mut ControlFlow::Exit); event_handler(event, &mut control_flow);
} }
assert!(self.event_handler.replace(Some(event_handler)).is_none()); assert!(self.event_handler.replace(Some(event_handler)).is_none());
@@ -372,10 +372,12 @@ impl<T> EventLoopRunner<T> {
let start_cause = match (init, self.control_flow()) { let start_cause = match (init, self.control_flow()) {
(true, _) => StartCause::Init, (true, _) => StartCause::Init,
(false, ControlFlow::Poll) => StartCause::Poll, (false, ControlFlow::Poll) => StartCause::Poll,
(false, ControlFlow::Exit) | (false, ControlFlow::Wait) => StartCause::WaitCancelled { (false, ControlFlow::Exit(_)) | (false, ControlFlow::Wait) => {
StartCause::WaitCancelled {
requested_resume: None, requested_resume: None,
start: self.last_events_cleared.get(), start: self.last_events_cleared.get(),
}, }
}
(false, ControlFlow::WaitUntil(requested_resume)) => { (false, ControlFlow::WaitUntil(requested_resume)) => {
if Instant::now() < requested_resume { if Instant::now() < requested_resume {
StartCause::WaitCancelled { StartCause::WaitCancelled {