#![allow(dead_code)]
use super::ansi_handler::AnsiHandler;
use super::term_grid::TerminalGrid;
use std::sync::{Arc, Mutex};
use vte::Parser;
pub struct TerminalRenderer {
grid: Arc<Mutex<TerminalGrid>>,
parser: Parser,
}
impl TerminalRenderer {
pub fn new(cols: usize, rows: usize, max_scrollback: usize) -> Self {
Self {
grid: Arc::new(Mutex::new(TerminalGrid::new(cols, rows, max_scrollback))),
parser: Parser::new(),
}
}
pub fn from_grid(grid: Arc<Mutex<TerminalGrid>>) -> Self {
Self {
grid,
parser: Parser::new(),
}
}
pub fn grid(&self) -> Arc<Mutex<TerminalGrid>> {
self.grid.clone()
}
pub fn feed_output(&mut self, data: &[u8]) {
let mut grid = self.grid.lock().expect("terminal grid mutex poisoned");
let mut handler = AnsiHandler::new(&mut grid);
self.parser.advance(&mut handler, data);
}
pub fn feed_output_chunks(&mut self, chunks: &[Vec<u8>]) {
if chunks.is_empty() {
return;
}
let mut grid = self.grid.lock().expect("terminal grid mutex poisoned");
let mut handler = AnsiHandler::new(&mut grid);
for chunk in chunks {
self.parser.advance(&mut handler, chunk);
}
}
pub fn take_responses(&self) -> Vec<String> {
let mut grid = self.grid.lock().expect("terminal grid mutex poisoned");
grid.take_responses()
}
pub fn resize(&mut self, cols: usize, rows: usize) {
let mut grid = self.grid.lock().expect("terminal grid mutex poisoned");
grid.resize(cols, rows);
}
}