summaryrefslogtreecommitdiffstats
path: root/winit/src/application.rs
diff options
context:
space:
mode:
authorLibravatar dtzxporter <dtzxporter@users.noreply.github.com>2024-01-25 15:23:30 -0500
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-02-07 19:33:01 +0100
commit66823e9a65328e1da9b75f99958d05846d8ead43 (patch)
tree3680a14c824b1e84b4547d80a8fd49794002466c /winit/src/application.rs
parentb4dcf4ecf702a493476791efd95e190e5c1db812 (diff)
downloadiced-66823e9a65328e1da9b75f99958d05846d8ead43.tar.gz
iced-66823e9a65328e1da9b75f99958d05846d8ead43.tar.bz2
iced-66823e9a65328e1da9b75f99958d05846d8ead43.zip
Emulate `AboutToWait` event on Windows while resizing
More details: https://github.com/rust-windowing/winit/issues/3272
Diffstat (limited to 'winit/src/application.rs')
-rw-r--r--winit/src/application.rs51
1 files changed, 38 insertions, 13 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs
index 6a176834..52cf7fe8 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -213,25 +213,50 @@ 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;
- }
+ #[allow(unused_mut)]
+ let mut 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 _ = 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(())