diff --git a/src/main.rs b/src/main.rs index 11aca16..3c81217 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,14 +36,14 @@ fn main() -> Result<(), Error> { let mut ui = ui::Root::new(&mut state, &open_buffers); Terminal::with(move |term| { + let mut needs_render = true; loop { - // Render the state to the screen - term.update(|fb| ui.render(&state, fb)); - - // Wait for a while + // Wait for a while, or until an event occurs term.wait_at_least(Duration::from_millis(250)); while let Some(ev) = term.get_event() { + needs_render = true; // TODO: Don't always rerender? + // Resize events are special and need handling by the terminal if let TerminalEvent::Resize(cols, rows) = ev { term.set_size([cols, rows]); @@ -59,7 +59,12 @@ fn main() -> Result<(), Error> { } } - state.tick(); + state.tick(&mut needs_render); + + // Render the state to the screen + if needs_render { + term.update(|fb| ui.render(&state, fb)); + } } }) } diff --git a/src/state.rs b/src/state.rs index 1c0ecf2..aeb8303 100644 --- a/src/state.rs +++ b/src/state.rs @@ -867,16 +867,23 @@ impl Buffer { } } - pub fn tick(&mut self) { + pub fn tick(&mut self, needs_render: &mut bool) { if let Some(path) = &self.path { let stale = std::fs::metadata(path) .and_then(|m| m.modified()) - .map(|lm| lm > self.opened_at.expect("state buffer must have open time")); - match (stale, self.unsaved) { - (Ok(false), _) => {} - (Ok(true), true) => self.diverged = true, - (Ok(true), false) => self.reload(), - (Err(_), _) => {} + .map_or(true, |lm| { + lm > self.opened_at.expect("state buffer must have open time") + }); + if stale { + if self.unsaved { + if !self.diverged { + self.diverged = true; + *needs_render = true; + } + } else { + self.reload(); + *needs_render = true; + } } } @@ -985,10 +992,10 @@ impl State { } } - pub fn tick(&mut self) { + pub fn tick(&mut self, needs_render: &mut bool) { self.tick += 1; for b in self.buffers.values_mut() { - b.tick(); + b.tick(needs_render); } }