diff options
Diffstat (limited to 'src/screen.rs')
-rw-r--r-- | src/screen.rs | 110 |
1 files changed, 80 insertions, 30 deletions
diff --git a/src/screen.rs b/src/screen.rs index 88a3629..9caa0eb 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -1,6 +1,5 @@ -pub struct Screen { +struct State { size: crate::pos::Pos, - parser: crate::parser::Parser, cells: Vec<Vec<crate::cell::Cell>>, cursor_position: crate::pos::Pos, fgcolor: crate::color::Color, @@ -11,49 +10,97 @@ pub struct Screen { underline: bool, } +impl vte::Perform for State { + fn print(&mut self, _c: char) {} + + fn execute(&mut self, _b: u8) {} + + fn hook( + &mut self, + _params: &[i64], + _intermediates: &[u8], + _ignore: bool, + ) { + } + + fn put(&mut self, _b: u8) {} + + fn unhook(&mut self) {} + + fn osc_dispatch(&mut self, _params: &[&[u8]]) {} + + fn csi_dispatch( + &mut self, + _params: &[i64], + _intermediates: &[u8], + _ignore: bool, + _c: char, + ) { + } + + fn esc_dispatch( + &mut self, + _params: &[i64], + _intermediates: &[u8], + _ignore: bool, + _b: u8, + ) { + } +} + +pub struct Screen { + parser: vte::Parser, + state: State, +} + impl Screen { pub fn new(rows: u16, cols: u16) -> Self { Self { - size: crate::pos::Pos { - row: rows, - col: cols, + parser: vte::Parser::new(), + state: State { + size: crate::pos::Pos { + row: rows, + col: cols, + }, + cells: vec![ + vec![crate::cell::Cell::default(); cols as usize]; + rows as usize + ], + cursor_position: crate::pos::Pos::default(), + fgcolor: crate::color::Color::default(), + bgcolor: crate::color::Color::default(), + bold: false, + italic: false, + inverse: false, + underline: false, }, - parser: crate::parser::Parser::new(), - cells: vec![ - vec![crate::cell::Cell::default(); cols as usize]; - rows as usize - ], - cursor_position: crate::pos::Pos::default(), - fgcolor: crate::color::Color::default(), - bgcolor: crate::color::Color::default(), - bold: false, - italic: false, - inverse: false, - underline: false, } } pub fn rows(&self) -> u16 { - self.size.row + self.state.size.row } pub fn cols(&self) -> u16 { - self.size.col + self.state.size.col } pub fn set_window_size(&mut self, rows: u16, cols: u16) { - self.size = crate::pos::Pos { + self.state.size = crate::pos::Pos { row: rows, col: cols, }; } - pub fn process(&mut self, bytes: &[u8]) -> usize { - unimplemented!() + pub fn process(&mut self, bytes: &[u8]) { + for byte in bytes { + self.parser.advance(&mut self.state, *byte); + } } pub fn cell(&self, row: u16, col: u16) -> Option<&crate::cell::Cell> { - self.cells + self.state + .cells .get(row as usize) .and_then(|v| v.get(col as usize)) } @@ -79,31 +126,34 @@ impl Screen { } pub fn cursor_position(&self) -> (u16, u16) { - (self.cursor_position.row, self.cursor_position.col) + ( + self.state.cursor_position.row, + self.state.cursor_position.col, + ) } pub fn fgcolor(&self) -> crate::color::Color { - self.fgcolor + self.state.fgcolor } pub fn bgcolor(&self) -> crate::color::Color { - self.bgcolor + self.state.bgcolor } pub fn bold(&self) -> bool { - self.bold + self.state.bold } pub fn italic(&self) -> bool { - self.italic + self.state.italic } pub fn inverse(&self) -> bool { - self.inverse + self.state.inverse } pub fn underline(&self) -> bool { - self.underline + self.state.underline } pub fn title(&self) -> Option<&str> { |