diff options
| author | 2024-02-07 19:50:46 +0100 | |
|---|---|---|
| committer | 2024-02-07 19:50:46 +0100 | |
| commit | 80a29a277e2f15c0711efc37dc6c86c2ef98879e (patch) | |
| tree | ffc246d652d036b0189824da99932c3c7276e1fb /winit/src | |
| 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 'winit/src')
| -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(())  }  | 
