use crate::surface::{SequenceNo, Surface};
use crate::terminal::Terminal;
use crate::Result;
use std::ops::{Deref, DerefMut};
pub struct BufferedTerminal<T: Terminal> {
terminal: T,
surface: Surface,
seqno: SequenceNo,
}
impl<T: Terminal> BufferedTerminal<T> {
pub fn new(mut terminal: T) -> Result<Self> {
let size = terminal.get_screen_size()?;
let surface = Surface::new(size.cols, size.rows);
Ok(Self {
terminal,
surface,
seqno: 0,
})
}
pub fn terminal(&mut self) -> &mut T {
&mut self.terminal
}
pub fn flush(&mut self) -> Result<()> {
{
let (seq, changes) = self.surface.get_changes(self.seqno);
self.seqno = 0;
self.terminal.render(&changes)?;
self.seqno = seq;
}
self.surface.flush_changes_older_than(self.seqno);
Ok(())
}
pub fn repaint(&mut self) -> Result<()> {
self.seqno = 0;
self.flush()
}
pub fn check_for_resize(&mut self) -> Result<bool> {
let size = self.terminal.get_screen_size()?;
let (width, height) = self.surface.dimensions();
if (width != size.cols) || (height != size.rows) {
self.surface.resize(size.cols, size.rows);
Ok(true)
} else {
Ok(false)
}
}
}
impl<T: Terminal> Deref for BufferedTerminal<T> {
type Target = Surface;
fn deref(&self) -> &Surface {
&self.surface
}
}
impl<T: Terminal> DerefMut for BufferedTerminal<T> {
fn deref_mut(&mut self) -> &mut Surface {
&mut self.surface
}
}