winit_async/runtime/
native.rs1use super::Runtime;
2use crate::Error;
3use crate::runtime::AsyncApplication;
4use crate::tls::runtime;
5use async_local_executor::{Executor, spawn_local};
6use winit::event_loop::EventLoop;
7
8#[inline]
9pub fn run_app<E, F>(future: F) -> Result<(), Error<E>>
10where
11 F: IntoFuture<Output = Result<(), E>> + 'static,
12{
13 let event_loop = EventLoop::new().map_err(Error::EventLoop)?;
14 let proxy = event_loop.create_proxy();
15 let mut executor = Executor::new(move || proxy.send_event(()).unwrap());
16 let executor_guard = executor.enter();
17 let handle = spawn_local(async move {
18 let result = future.await;
19 runtime().event_loop().exit();
20 async_local_executor::exit();
21 result
22 });
23 let mut runtime = Runtime::new();
24 let runtime_guard = runtime.enter();
25 event_loop
26 .run_app(&mut AsyncApplication)
27 .map_err(Error::EventLoop)?;
28 drop(runtime_guard);
29 drop(executor_guard);
30 let Some(result) = handle.result() else {
31 return Ok(());
32 };
33 result.map_err(Error::App)
34}