diff options
Diffstat (limited to 'winit')
-rw-r--r-- | winit/src/program.rs | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/winit/src/program.rs b/winit/src/program.rs index efe8a978..c5c3133d 100644 --- a/winit/src/program.rs +++ b/winit/src/program.rs @@ -650,7 +650,7 @@ async fn run_instance<P, C>( mut runtime: Runtime<P::Executor, Proxy<P::Message>, Action<P::Message>>, mut proxy: Proxy<P::Message>, mut debug: Debug, - mut boot: oneshot::Receiver<Boot<C>>, + boot: oneshot::Receiver<Boot<C>>, mut event_receiver: mpsc::UnboundedReceiver<Event<Action<P::Message>>>, mut control_sender: mpsc::UnboundedSender<Control>, is_daemon: bool, @@ -665,7 +665,7 @@ async fn run_instance<P, C>( let Boot { mut compositor, mut clipboard, - } = boot.try_recv().ok().flatten().expect("Receive boot"); + } = boot.await.expect("Receive boot"); let mut window_manager = WindowManager::new(); let mut is_window_opening = !is_daemon; @@ -679,7 +679,18 @@ async fn run_instance<P, C>( debug.startup_finished(); - while let Some(event) = event_receiver.next().await { + loop { + // Empty the queue if possible + let event = if let Ok(event) = event_receiver.try_next() { + event + } else { + event_receiver.next().await + }; + + let Some(event) = event else { + break; + }; + match event { Event::WindowCreated { id, @@ -1212,13 +1223,15 @@ fn run_action<P, C>( *is_window_opening = true; } window::Action::Close(id) => { - let _ = window_manager.remove(id); + let window = window_manager.remove(id); let _ = ui_caches.remove(&id); - events.push(( - id, - core::Event::Window(core::window::Event::Closed), - )); + if window.is_some() { + events.push(( + id, + core::Event::Window(core::window::Event::Closed), + )); + } } window::Action::GetOldest(channel) => { let id = |