diff options
author | 2023-01-18 15:01:17 -0800 | |
---|---|---|
committer | 2023-01-18 15:01:17 -0800 | |
commit | 70d487ba20a50c06c73f0ffcd8198f1a7eac7f37 (patch) | |
tree | afb8e161b18236d4440cba8bb0e0ce896858d653 /native/src/window | |
parent | 790fa3e7a01a790aa3f07083fe9abf6b68fa7ba1 (diff) | |
parent | 5ef0648bf447aaca8b96782643401e54a2bf7759 (diff) | |
download | iced-70d487ba20a50c06c73f0ffcd8198f1a7eac7f37.tar.gz iced-70d487ba20a50c06c73f0ffcd8198f1a7eac7f37.tar.bz2 iced-70d487ba20a50c06c73f0ffcd8198f1a7eac7f37.zip |
Merge remote-tracking branch 'origin/master' into feat/multi-window-support
# Conflicts:
# examples/events/src/main.rs
# glutin/src/application.rs
# native/src/window.rs
# winit/src/window.rs
Diffstat (limited to '')
-rw-r--r-- | native/src/window.rs | 20 | ||||
-rw-r--r-- | native/src/window/event.rs | 7 | ||||
-rw-r--r-- | native/src/window/redraw_request.rs | 38 |
3 files changed, 65 insertions, 0 deletions
diff --git a/native/src/window.rs b/native/src/window.rs index 96a5fe61..d3c8c96f 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -6,6 +6,7 @@ mod id; mod mode; mod position; mod settings; +mod redraw_request; mod user_attention; pub use action::Action; @@ -15,4 +16,23 @@ pub use id::Id; pub use mode::Mode; pub use position::Position; pub use settings::Settings; +pub use redraw_request::RedrawRequest; pub use user_attention::UserAttention; + +use crate::subscription::{self, Subscription}; +use crate::time::Instant; + +/// Subscribes to the frames of the window of the running application. +/// +/// The resulting [`Subscription`] will produce items at a rate equal to the +/// refresh rate of the window. Note that this rate may be variable, as it is +/// normally managed by the graphics driver and/or the OS. +/// +/// In any case, this [`Subscription`] is useful to smoothly draw application-driven +/// animations without missing any frames. +pub fn frames() -> Subscription<Instant> { + subscription::raw_events(|event, _status| match event { + crate::Event::Window(Event::RedrawRequested(at)) => Some(at), + _ => None, + }) +} diff --git a/native/src/window/event.rs b/native/src/window/event.rs index 86321ac0..e2fb5e66 100644 --- a/native/src/window/event.rs +++ b/native/src/window/event.rs @@ -1,3 +1,5 @@ +use crate::time::Instant; + use std::path::PathBuf; /// A window-related event. @@ -19,6 +21,11 @@ pub enum Event { height: u32, }, + /// A window redraw was requested. + /// + /// The [`Instant`] contains the current time. + RedrawRequested(Instant), + /// The user has requested for the window to close. /// /// Usually, you will want to terminate the execution whenever this event diff --git a/native/src/window/redraw_request.rs b/native/src/window/redraw_request.rs new file mode 100644 index 00000000..3b4f0fd3 --- /dev/null +++ b/native/src/window/redraw_request.rs @@ -0,0 +1,38 @@ +use crate::time::Instant; + +/// A request to redraw a window. +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum RedrawRequest { + /// Redraw the next frame. + NextFrame, + + /// Redraw at the given time. + At(Instant), +} + +#[cfg(test)] +mod tests { + use super::*; + use std::time::{Duration, Instant}; + + #[test] + fn ordering() { + let now = Instant::now(); + let later = now + Duration::from_millis(10); + + assert_eq!(RedrawRequest::NextFrame, RedrawRequest::NextFrame); + assert_eq!(RedrawRequest::At(now), RedrawRequest::At(now)); + + assert!(RedrawRequest::NextFrame < RedrawRequest::At(now)); + assert!(RedrawRequest::At(now) > RedrawRequest::NextFrame); + assert!(RedrawRequest::At(now) < RedrawRequest::At(later)); + assert!(RedrawRequest::At(later) > RedrawRequest::At(now)); + + assert!(RedrawRequest::NextFrame <= RedrawRequest::NextFrame); + assert!(RedrawRequest::NextFrame <= RedrawRequest::At(now)); + assert!(RedrawRequest::At(now) >= RedrawRequest::NextFrame); + assert!(RedrawRequest::At(now) <= RedrawRequest::At(now)); + assert!(RedrawRequest::At(now) <= RedrawRequest::At(later)); + assert!(RedrawRequest::At(later) >= RedrawRequest::At(now)); + } +} |