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
F: 'static + FnMut(Event<'_, T>, &RootELW<T>, &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<F>(&mut self, mut event_handler: F)
pub fn run_return<F>(&mut self, mut event_handler: F) -> i32
where
F: FnMut(Event<'_, T>, &RootELW<T>, &mut ControlFlow),
{
@@ -225,7 +225,9 @@ impl<T: 'static> EventLoop<T> {
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<T: 'static> EventLoop<T> {
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<T> {
@@ -763,7 +773,7 @@ unsafe fn process_control_flow<T: 'static>(runner: &EventLoopRunner<T>) {
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()
.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<T> EventLoopRunner<T> {
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 {