Skip to main content

winit_async/runtime/
native.rs

1use 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}