diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/subscription.rs | 27 | ||||
| -rw-r--r-- | native/src/window.rs | 15 | 
2 files changed, 41 insertions, 1 deletions
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, +    }) +}  | 
