small software-rendered rust tty
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/src/main.rs b/src/main.rs index 7d383e7..33f8a0e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -#![feature(deadline_api, deref_patterns)] +#![feature(deadline_api, deref_patterns, generic_const_exprs)] use std::fs::File; use std::io::Write; use std::iter::successors; @@ -8,6 +8,8 @@ use std::sync::mpsc; use std::thread::sleep; use std::time::Duration; +pub mod colors; + use anyhow::Result; use ctlfun::TerminalInputParser; use fimg::Image; @@ -21,7 +23,8 @@ fn spawn(shell: &str) -> Result<OwnedFd> { let x = unsafe { forkpty(None, None)? }; match x { ForkptyResult::Child => { - let sh = Command::new(shell).spawn()?.wait(); + let sh = + Command::new(shell).env("TERM", "vt100").spawn()?.wait(); // std::thread::sleep(Duration::from_millis(5000)); // exit(0); @@ -105,7 +108,13 @@ fn main() -> Result<()> { shifting = true; continue; } - Enter => b"\n", + Enter => &b"\n"[..], + Up => b"\x1b[A", + Down => b"\x1b[B", + Right => b"\x1b[C", + Left => b"\x1d[D", + Apostrophe if shifting => b"\"", + Apostrophe => b"'", Space => b" ", Period => b".", Slash => b"/", @@ -155,21 +164,20 @@ fn main() -> Result<()> { let rows = (w.get_size().1 as f32 / fh).floor() as u16; dbg!(rows, cols); let mut t = Terminal { + style: Default::default(), cursor: (1, 1), size: (cols, rows), scrollback: Scrollback::default(), - cells: vec![ - Cell { - bg: [0; 3], - color: [0; 3], - style: 0, - letter: None, - }; - cols as usize * rows as usize - ], + cells: vec![Cell::default(); cols as usize * rows as usize], p: Default::default(), mode: Mode::Normal, }; + let cj = + swash::FontRef::from_index(&include_bytes!("../cjk.ttc")[..], 0) + .unwrap(); + let m = cj.metrics(&[]); + dbg!(m); + let mut f = File::create("x").unwrap(); loop { while let Ok(x) = trx.recv_timeout(Duration::from_millis(16)) { @@ -187,10 +195,12 @@ fn main() -> Result<()> { } #[test] -fn tparse() { +fn tpaxrse() { println!("-------------------"); let mut x = TerminalInputParser::new(); - for c in "\x1b[32;1m greninator \x1b[0m".as_bytes() { + for c in + "\x1b[32;1mgren\x1b[33myellow\x1b[42mbggreen\x1b[0m".as_bytes() + { use ctlfun::TerminalInput::*; match x.parse_byte(*c) { Char(x) => { |