diff options
-rw-r--r-- | examples/solar_system/src/main.rs | 3 | ||||
-rw-r--r-- | native/src/subscription.rs | 27 | ||||
-rw-r--r-- | native/src/window.rs | 15 | ||||
-rw-r--r-- | winit/src/window.rs | 2 |
4 files changed, 43 insertions, 4 deletions
diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 9e303576..9a4ee754 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -9,7 +9,6 @@ use iced::application; use iced::executor; use iced::theme::{self, Theme}; -use iced::time; use iced::widget::canvas; use iced::widget::canvas::gradient::{self, Gradient}; use iced::widget::canvas::stroke::{self, Stroke}; @@ -90,7 +89,7 @@ impl Application for SolarSystem { } fn subscription(&self) -> Subscription<Message> { - time::every(time::Duration::from_millis(10)).map(Message::Tick) + window::frames().map(Message::Tick) } } diff --git a/native/src/subscription.rs b/native/src/subscription.rs index 980a8116..4c0d80a7 100644 --- a/native/src/subscription.rs +++ b/native/src/subscription.rs @@ -59,8 +59,11 @@ pub fn events_with<Message>( where Message: 'static + MaybeSend, { + #[derive(Hash)] + struct EventsWith; + Subscription::from_recipe(Runner { - id: f, + id: (EventsWith, f), spawn: move |events| { use futures::future; use futures::stream::StreamExt; @@ -75,6 +78,28 @@ where }) } +pub(crate) fn raw_events<Message>( + f: fn(Event, event::Status) -> Option<Message>, +) -> Subscription<Message> +where + Message: 'static + MaybeSend, +{ + #[derive(Hash)] + struct RawEvents; + + Subscription::from_recipe(Runner { + id: (RawEvents, f), + spawn: move |events| { + use futures::future; + use futures::stream::StreamExt; + + events.filter_map(move |(event, status)| { + future::ready(f(event, status)) + }) + }, + }) +} + /// Returns a [`Subscription`] that will create and asynchronously run the /// given [`Stream`]. /// diff --git a/native/src/window.rs b/native/src/window.rs index 1b97e655..4bccc471 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -8,3 +8,18 @@ pub use action::Action; pub use event::Event; pub use mode::Mode; pub use user_attention::UserAttention; + +use crate::subscription::{self, Subscription}; + +use std::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 +/// framerate of the monitor of said window. +pub fn frames() -> Subscription<Instant> { + subscription::raw_events(|event, _status| match event { + crate::Event::Window(Event::RedrawRequested(at)) => Some(at), + _ => None, + }) +} diff --git a/winit/src/window.rs b/winit/src/window.rs index 89db3262..0b9e4c46 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -2,7 +2,7 @@ use crate::command::{self, Command}; use iced_native::window; -pub use window::{Event, Mode, UserAttention}; +pub use window::{frames, Event, Mode, UserAttention}; /// Closes the current window and exits the application. pub fn close<Message>() -> Command<Message> { |