small software-rendered rust tty
| -rw-r--r-- | src/term.rs | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/term.rs b/src/term.rs index 04c8b24..aedd661 100644 --- a/src/term.rs +++ b/src/term.rs @@ -81,6 +81,13 @@ impl Terminal { self.cells[self.row * self.size.0 as usize..] .fill(Cell::default()); } + fn grow(&mut self, by: usize) { + self.row += by; + self.cells.extend(repeat_n( + Cell::default(), + (by * (self.size.0 + 1) as usize) as usize, + )); + } #[implicit_fn::implicit_fn] pub fn rx(&mut self, x: u8) { match self.p.parse_byte(x) { @@ -95,17 +102,14 @@ impl Terminal { while self.cursor.1 > self.size.1 { println!("newline"); self.cursor.1 -= 1; - self.row += 1; - self.cells.extend(repeat_n( - Cell::default(), - self.size.0 as usize, - )); + self.grow(1); } - // assert!( - // self.cells.len() - // == self.row * self.size.0 as usize - // + self.size.0 as usize * self.size.1 as usize - // ); + assert!( + self.cells.len() + == self.row * (self.size.0 as usize + 1) + + (self.size.0 as usize + 1) + * (self.size.1 as usize + 1) + ); // assert!( // self.cells[self.row * self.size.0 as usize..].len() // == self.size.0 as usize * self.size.1 as usize @@ -268,6 +272,15 @@ impl Terminal { } } Control(ControlFunction { + start: b'[', + params: [x], + end: b'M', + .. + }) => { + let x = x.value_or(1); + self.grow(x as _); + } + Control(ControlFunction { start: b'\r', params: [], .. |