summaryrefslogtreecommitdiffstats
path: root/native/src/window.rs
blob: a8f8b10f9271d163b88b5333ea7fb88d09c9daf5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//! Build window-based GUI applications.
mod action;
mod event;
mod icon;
mod id;
mod mode;
mod position;
mod redraw_request;
mod settings;
mod user_attention;

pub use action::Action;
pub use event::Event;
pub use icon::Icon;
pub use id::Id;
pub use mode::Mode;
pub use position::Position;
pub use redraw_request::RedrawRequest;
pub use settings::Settings;
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<Frame> {
    subscription::raw_events(|event, _status| match event {
        crate::Event::Window(id, Event::RedrawRequested(at)) => {
            Some(Frame { id, at })
        }
        _ => None,
    })
}

/// The returned `Frame` for a framerate subscription.
#[derive(Debug)]
pub struct Frame {
    /// The `window::Id` that the `Frame` was produced in.
    pub id: Id,
    /// The `Instant` at which the frame was produced.
    pub at: Instant,
}