summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/solar_system/src/main.rs3
-rw-r--r--native/src/subscription.rs27
-rw-r--r--native/src/window.rs15
-rw-r--r--winit/src/window.rs2
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> {