Lazier rendering, less background work

This commit is contained in:
Joshua Barretto 2025-10-30 18:51:53 +00:00
parent f5e9701d01
commit a311f49e4b
2 changed files with 26 additions and 14 deletions

View file

@ -36,14 +36,14 @@ fn main() -> Result<(), Error> {
let mut ui = ui::Root::new(&mut state, &open_buffers); let mut ui = ui::Root::new(&mut state, &open_buffers);
Terminal::with(move |term| { Terminal::with(move |term| {
let mut needs_render = true;
loop { loop {
// Render the state to the screen // Wait for a while, or until an event occurs
term.update(|fb| ui.render(&state, fb));
// Wait for a while
term.wait_at_least(Duration::from_millis(250)); term.wait_at_least(Duration::from_millis(250));
while let Some(ev) = term.get_event() { 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 // Resize events are special and need handling by the terminal
if let TerminalEvent::Resize(cols, rows) = ev { if let TerminalEvent::Resize(cols, rows) = ev {
term.set_size([cols, rows]); 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));
}
} }
}) })
} }

View file

@ -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 { if let Some(path) = &self.path {
let stale = std::fs::metadata(path) let stale = std::fs::metadata(path)
.and_then(|m| m.modified()) .and_then(|m| m.modified())
.map(|lm| lm > self.opened_at.expect("state buffer must have open time")); .map_or(true, |lm| {
match (stale, self.unsaved) { lm > self.opened_at.expect("state buffer must have open time")
(Ok(false), _) => {} });
(Ok(true), true) => self.diverged = true, if stale {
(Ok(true), false) => self.reload(), if self.unsaved {
(Err(_), _) => {} 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; self.tick += 1;
for b in self.buffers.values_mut() { for b in self.buffers.values_mut() {
b.tick(); b.tick(needs_render);
} }
} }