small software-rendered rust tty
ABCD
| -rw-r--r-- | src/main.rs | 9 | ||||
| -rw-r--r-- | src/render.rs | 6 | ||||
| -rw-r--r-- | src/term.rs | 82 |
3 files changed, 76 insertions, 21 deletions
diff --git a/src/main.rs b/src/main.rs index 65d453e..bcba804 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,9 @@ -#![feature(deadline_api, deref_patterns, generic_const_exprs)] +#![feature( + deadline_api, + deref_patterns, + generic_const_exprs, + if_let_guard +)] use std::fs::File; use std::io::Write; use std::iter::successors; @@ -174,7 +179,7 @@ fn main() -> Result<()> { style: Default::default(), cursor: (1, 1), size: (cols, rows), - scrollback: Scrollback::default(), + row: 0, cells: vec![Cell::default(); cols as usize * rows as usize], p: Default::default(), mode: Mode::Normal, diff --git a/src/render.rs b/src/render.rs index 3ee5581..debe5e0 100644 --- a/src/render.rs +++ b/src/render.rs @@ -17,7 +17,11 @@ pub fn render( let m = FONT.metrics(&[]); let sz = ppem * (m.max_width / m.units_per_em as f32); let mut i = Image::build(w as _, h as _).fill(colors::BACKGROUND); - for (col, k) in x.cells.chunks_exact(x.size.0 as _).zip(0..).skip(1) { + for (col, k) in x.cells[x.size.0 as usize * x.row..] + .chunks_exact(x.size.0 as _) + .zip(0..) + .skip(1) + { for (cell, j) in col.iter().skip(2).zip(0..) { if cell.style.bg != colors::BACKGROUND { let cell = Image::<_, 4>::build( diff --git a/src/term.rs b/src/term.rs index b3c22f7..c59df6b 100644 --- a/src/term.rs +++ b/src/term.rs @@ -1,3 +1,5 @@ +use std::iter::repeat_n; + use ctlfun::Parameter::*; use ctlfun::TerminalInput::*; use ctlfun::{ControlFunction, TerminalInputParser}; @@ -6,8 +8,9 @@ pub struct Terminal { pub style: Style, pub cursor: (u16, u16), pub size: (u16, u16), - pub scrollback: Scrollback, + pub cells: Vec<Cell>, + pub row: usize, pub p: TerminalInputParser, pub mode: Mode, } @@ -15,13 +18,6 @@ pub enum Mode { Normal, Raw, } -#[derive(Default)] -pub struct Scrollback { - // invariant: len() / t.size.w == height - pub history: Vec<Cell>, - pub height: u16, -} -impl Scrollback {} #[derive(Clone, Copy)] pub struct Style { @@ -59,9 +55,32 @@ impl Terminal { self.cursor.0 = 1; self.cursor.1 += 1; } - let c = &mut self.cells[(self.cursor.1 * self.size.0 - + self.cursor.0) - as usize]; + while self.cursor.1 >= self.size.1 { + println!("newline"); + self.cursor.1 -= 1; + // self.cells + // .drain(..self.size.0 as usize) + // .for_each(drop); + self.row += 1; + self.cells.extend(repeat_n( + Cell::default(), + self.size.0 as usize, + )); + } + assert!( + self.cells.len() + == self.row * self.size.0 as usize + + self.size.0 as usize * self.size.1 as usize + ); + assert!( + self.cells[self.row * self.size.0 as usize..].len() + == self.size.0 as usize * self.size.1 as usize + ); + dbg!(self.cursor, self.size); + let c = &mut self.cells[self.row * self.size.0 as usize..] + // y*w+x + [(self.cursor.1 * self.size.0 + self.cursor.0) + as usize]; c.letter = Some(x); c.style = self.style; } @@ -84,7 +103,7 @@ impl Terminal { } &[Value(49)] => self.style.bg = colors::BACKGROUND, &[Value(x @ (90..=97))] => { - self.style.color = colors::FOUR[x as usize - 72] + self.style.color = colors::FOUR[x as usize - 82] } &[Value(x @ (100..=107))] => { self.style.bg = colors::FOUR[x as usize - 92] @@ -118,20 +137,47 @@ impl Terminal { Control(ControlFunction { start: b'[', params, + end: b'A', + .. + }) if let [p] = params => { + self.cursor.1 -= p.value_or(1); + } + Control(ControlFunction { + start: b'[', + params, + end: b'B', + .. + }) if let [p] = params => { + self.cursor.1 += p.value_or(1); + } + Control(ControlFunction { + start: b'[', + params, end: b'C', .. - }) if params == &[Default] => self.cursor.0 += 1, + }) if let [p] = params => { + self.cursor.0 += p.value_or(1); + } + Control(ControlFunction { + start: b'[', + params, + end: b'D', + .. + }) if let [p] = params => { + self.cursor.0 -= p.value_or(1); + } Control(ControlFunction { start: b'[', params, end: b'K', .. }) if params == &[Default] => { - for cell in &mut self.cells[(self.cursor.1 * self.size.0 - + self.cursor.0 - + 1) - as usize - ..(self.cursor.1 * self.size.0 + self.size.0) as usize] + for cell in &mut self.cells + [self.row * self.size.0 as usize..] + [(self.cursor.1 * self.size.0 + self.cursor.0 + 1) + as usize + ..(self.cursor.1 * self.size.0 + self.size.0) + as usize] // [self.cursor.1 as usize..self.size.0 as usize] // [self.cursor.0 as usize..] { |