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);
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));
}
}
})
}

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 {
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);
}
}