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> { | 
