use crate::event_loop::EventLoop;
use crate::filter::{Filter, ReturnOrFinish};
use crate::sync::ThreadSafety;
use futures_lite::pin;
use std::future::Future;
pub trait EventLoopExtRunReturn {
fn block_on_return<F>(&mut self, future: F) -> ReturnOrFinish<i32, F::Output>
where
F: Future;
}
impl<TS: ThreadSafety> EventLoopExtRunReturn for EventLoop<TS> {
fn block_on_return<F>(&mut self, fut: F) -> ReturnOrFinish<i32, F::Output>
where
F: Future,
{
use winit::platform::run_return::EventLoopExtRunReturn as _;
let inner = &mut self.inner;
pin!(fut);
let mut filter = Filter::<TS>::new(inner);
let mut output = None;
let exit = inner.run_return({
let output = &mut output;
move |event, elwt, flow| match filter.handle_event(fut.as_mut(), event, elwt, flow) {
ReturnOrFinish::FutureReturned(out) => {
*output = Some(out);
flow.set_exit()
}
ReturnOrFinish::Output(()) => {}
}
});
match output {
Some(output) => ReturnOrFinish::FutureReturned(output),
None => ReturnOrFinish::Output(exit),
}
}
}