clear on resize, fixing garble

This commit is contained in:
🪞👃🪞 2024-11-03 16:34:05 +02:00
parent bb8ab496c0
commit be7501b08c

View file

@ -4,7 +4,7 @@ pub(crate) use crossterm::{ExecutableCommand};
pub use crossterm::event::{Event, KeyEvent, KeyCode, KeyModifiers}; pub use crossterm::event::{Event, KeyEvent, KeyCode, KeyModifiers};
pub use ratatui::prelude::{Rect, Style, Color, Buffer}; pub use ratatui::prelude::{Rect, Style, Color, Buffer};
pub use ratatui::style::{Stylize, Modifier}; pub use ratatui::style::{Stylize, Modifier};
use ratatui::backend::{Backend, CrosstermBackend}; use ratatui::backend::{Backend, CrosstermBackend, ClearType};
use std::io::Stdout; use std::io::Stdout;
use crossterm::terminal::{ use crossterm::terminal::{
EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen,
@ -97,17 +97,20 @@ impl Tui {
let exited = engine.read().unwrap().exited.clone(); let exited = engine.read().unwrap().exited.clone();
let engine = engine.clone(); let engine = engine.clone();
let state = state.clone(); let state = state.clone();
let mut buffer = Buffer::empty( let size = engine.read().unwrap().backend.size().expect("get size failed");
engine.read().unwrap().backend.size().expect("get size failed") let mut buffer = Buffer::empty(size);
);
spawn(move || loop { spawn(move || loop {
if exited.fetch_and(true, Ordering::Relaxed) { if exited.fetch_and(true, Ordering::Relaxed) {
break 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 let Ok(state) = state.try_read() {
if buffer.area != size { if buffer.area != size {
engine.write().unwrap().backend.clear_region(ClearType::All)
.expect("clear failed");
buffer.resize(size); buffer.resize(size);
buffer.reset();
} }
let mut output = TuiOutput { buffer, area: size.xywh() }; let mut output = TuiOutput { buffer, area: size.xywh() };
state.render(&mut output).expect("render failed"); 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 { fn flip (&mut self, mut buffer: Buffer, size: ratatui::prelude::Rect) -> Buffer {
if self.buffer.area != size { if self.buffer.area != size {
self.backend.clear_region(ClearType::All).unwrap();
self.buffer.resize(size); self.buffer.resize(size);
self.buffer.reset();
} }
let updates = self.buffer.diff(&buffer); let updates = self.buffer.diff(&buffer);
self.backend.draw(updates.into_iter()).expect("failed to render"); self.backend.draw(updates.into_iter()).expect("failed to render");