Lazier rendering, less background work
This commit is contained in:
parent
f5e9701d01
commit
a311f49e4b
2 changed files with 26 additions and 14 deletions
15
src/main.rs
15
src/main.rs
|
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
25
src/state.rs
25
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 {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue