diff options
author | 2024-02-07 19:50:46 +0100 | |
---|---|---|
committer | 2024-02-07 19:50:46 +0100 | |
commit | 80a29a277e2f15c0711efc37dc6c86c2ef98879e (patch) | |
tree | ffc246d652d036b0189824da99932c3c7276e1fb /winit | |
parent | b4dcf4ecf702a493476791efd95e190e5c1db812 (diff) | |
parent | a631f4d745848289a45c539191b8377e2e8e7c01 (diff) | |
download | iced-80a29a277e2f15c0711efc37dc6c86c2ef98879e.tar.gz iced-80a29a277e2f15c0711efc37dc6c86c2ef98879e.tar.bz2 iced-80a29a277e2f15c0711efc37dc6c86c2ef98879e.zip |
Merge pull request #2214 from dtzxporter/workaround-winit-win32-issues
Workaround issue with winit on windows not resuming the event loop.
Diffstat (limited to '')
-rw-r--r-- | winit/src/application.rs | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs index 6a176834..77e2c83e 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -213,26 +213,54 @@ where let mut context = task::Context::from_waker(task::noop_waker_ref()); - let _ = event_loop.run(move |event, event_loop| { - if event_loop.exiting() { - return; - } + let process_event = + move |event, event_loop: &winit::event_loop::EventLoopWindowTarget<_>| { + if event_loop.exiting() { + return; + } - event_sender.start_send(event).expect("Send event"); + event_sender.start_send(event).expect("Send event"); - let poll = instance.as_mut().poll(&mut context); + let poll = instance.as_mut().poll(&mut context); - match poll { - task::Poll::Pending => { - if let Ok(Some(flow)) = control_receiver.try_next() { - event_loop.set_control_flow(flow); + match poll { + task::Poll::Pending => { + if let Ok(Some(flow)) = control_receiver.try_next() { + event_loop.set_control_flow(flow); + } + } + task::Poll::Ready(_) => { + event_loop.exit(); } - } - task::Poll::Ready(_) => { - event_loop.exit(); } }; - }); + + #[cfg(not(target_os = "windows"))] + let _ = event_loop.run(process_event); + + // TODO: Remove when unnecessary + // On Windows, we emulate an `AboutToWait` event after every `Resized` event + // since the event loop does not resume during resize interaction. + // More details: https://github.com/rust-windowing/winit/issues/3272 + #[cfg(target_os = "windows")] + { + let mut process_event = process_event; + + let _ = event_loop.run(move |event, event_loop| { + if matches!( + event, + winit::event::Event::WindowEvent { + event: winit::event::WindowEvent::Resized(_), + .. + } + ) { + process_event(event, event_loop); + process_event(winit::event::Event::AboutToWait, event_loop); + } else { + process_event(event, event_loop); + } + }); + } Ok(()) } |