small software-rendered rust tty
bendn 9 months ago
parent 84f0e2a · commit 05c3861
-rw-r--r--src/main.rs9
-rw-r--r--src/render.rs6
-rw-r--r--src/term.rs82
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..]
{