diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/src/shell.rs | 24 | 
1 files changed, 17 insertions, 7 deletions
| diff --git a/core/src/shell.rs b/core/src/shell.rs index 2952ceff..7a92a2be 100644 --- a/core/src/shell.rs +++ b/core/src/shell.rs @@ -1,3 +1,4 @@ +use crate::time::Instant;  use crate::window;  /// A connection to the state of a shell. @@ -35,14 +36,19 @@ impl<'a, Message> Shell<'a, Message> {          self.messages.push(message);      } -    /// Requests a new frame to be drawn. -    pub fn request_redraw(&mut self, request: window::RedrawRequest) { +    /// Requests a new frame to be drawn as soon as possible. +    pub fn request_redraw(&mut self) { +        self.redraw_request = Some(window::RedrawRequest::NextFrame); +    } + +    /// Requests a new frame to be drawn at the given [`Instant`]. +    pub fn request_redraw_at(&mut self, at: Instant) {          match self.redraw_request {              None => { -                self.redraw_request = Some(request); +                self.redraw_request = Some(window::RedrawRequest::At(at));              } -            Some(current) if request < current => { -                self.redraw_request = Some(request); +            Some(window::RedrawRequest::At(current)) if at < current => { +                self.redraw_request = Some(window::RedrawRequest::At(at));              }              _ => {}          } @@ -95,8 +101,12 @@ impl<'a, Message> Shell<'a, Message> {      pub fn merge<B>(&mut self, other: Shell<'_, B>, f: impl Fn(B) -> Message) {          self.messages.extend(other.messages.drain(..).map(f)); -        if let Some(at) = other.redraw_request { -            self.request_redraw(at); +        if let Some(new) = other.redraw_request { +            self.redraw_request = Some( +                self.redraw_request +                    .map(|current| if current < new { current } else { new }) +                    .unwrap_or(new), +            );          }          self.is_layout_invalid = | 
