From be7501b08ce424dede45749b9cb1c9db3aab9720 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 3 Nov 2024 16:34:05 +0200 Subject: [PATCH] clear on resize, fixing garble --- crates/tek_core/src/tui.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/crates/tek_core/src/tui.rs b/crates/tek_core/src/tui.rs index 658f8773..c1d23c90 100644 --- a/crates/tek_core/src/tui.rs +++ b/crates/tek_core/src/tui.rs @@ -4,7 +4,7 @@ pub(crate) use crossterm::{ExecutableCommand}; pub use crossterm::event::{Event, KeyEvent, KeyCode, KeyModifiers}; pub use ratatui::prelude::{Rect, Style, Color, Buffer}; pub use ratatui::style::{Stylize, Modifier}; -use ratatui::backend::{Backend, CrosstermBackend}; +use ratatui::backend::{Backend, CrosstermBackend, ClearType}; use std::io::Stdout; use crossterm::terminal::{ EnterAlternateScreen, LeaveAlternateScreen, @@ -97,17 +97,20 @@ impl Tui { let exited = engine.read().unwrap().exited.clone(); let engine = engine.clone(); let state = state.clone(); - let mut buffer = Buffer::empty( - engine.read().unwrap().backend.size().expect("get size failed") - ); + let size = engine.read().unwrap().backend.size().expect("get size failed"); + let mut buffer = Buffer::empty(size); spawn(move || loop { if exited.fetch_and(true, Ordering::Relaxed) { break } - let size = engine.read().unwrap().backend.size().expect("get size failed"); + let size = engine.read().unwrap().backend.size() + .expect("get size failed"); if let Ok(state) = state.try_read() { if buffer.area != size { + engine.write().unwrap().backend.clear_region(ClearType::All) + .expect("clear failed"); buffer.resize(size); + buffer.reset(); } let mut output = TuiOutput { buffer, area: size.xywh() }; state.render(&mut output).expect("render failed"); @@ -118,7 +121,9 @@ impl Tui { } fn flip (&mut self, mut buffer: Buffer, size: ratatui::prelude::Rect) -> Buffer { if self.buffer.area != size { + self.backend.clear_region(ClearType::All).unwrap(); self.buffer.resize(size); + self.buffer.reset(); } let updates = self.buffer.diff(&buffer); self.backend.draw(updates.into_iter()).expect("failed to render");