small software-rendered rust tty
| -rw-r--r-- | src/main.rs | 63 | ||||
| -rw-r--r-- | src/render.rs | 10 | ||||
| -rw-r--r-- | src/term.rs | 5 |
3 files changed, 45 insertions, 33 deletions
diff --git a/src/main.rs b/src/main.rs index 5a110f0..7d383e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -92,35 +92,42 @@ fn main() -> Result<()> { use Key::*; let mut shifting = false; while let Ok((k, s)) = krx.recv() { - if s == true { - if k == LeftShift || k == RightShift { - shifting = true; - continue; - } - let x = match k { - Enter => b"\n", - Space => b" ", - Period => b".", - Slash => b"/", - Backslash => b"\\", - Backspace => b"", - LeftBracket => b"[", - RightBracket => b"]", - Semicolon if shifting => b":", - Semicolon => b";", - Comma => b",", - - Key0 | Key1 | Key2 | Key3 | Key4 | Key5 | Key6 - | Key7 | Key8 | Key9 => &[k as u8 + b'0'], - - _ => &[k as u8 - 10 + b'a'], - }; - write(pty1.as_fd(), x).unwrap(); - } else { + if !s { if k == LeftShift || k == RightShift { shifting = false; } + continue; } + + let x = match k { + LeftSuper | RightSuper => continue, + LeftShift | RightShift => { + shifting = true; + continue; + } + Enter => b"\n", + Space => b" ", + Period => b".", + Slash => b"/", + Backslash => b"\\", + Backspace => b"", + Equal if shifting => b"+", + Equal => b"=", + Minus if shifting => b"_", + Minus => b"-", + LeftBracket if shifting => b"{", + LeftBracket => b"[", + RightBracket => b"]", + Semicolon if shifting => b":", + Semicolon => b";", + Comma => b",", + + Key0 | Key1 | Key2 | Key3 | Key4 | Key5 | Key6 | Key7 + | Key8 | Key9 => &[k as u8 + b'0'], + + _ => &[k as u8 - 10 + b'a'], + }; + write(pty1.as_fd(), x).unwrap(); } }); @@ -142,9 +149,9 @@ fn main() -> Result<()> { sleep(Duration::from_millis(100)); w.update(); - let ppem = 18.0; + let ppem = 20.0; let (fw, fh) = render::dims(&FONT, ppem); - let cols = (w.get_size().0 as f32 / fw).floor() as u16; + let cols = (w.get_size().0 as f32 / fw).floor() as u16 + 1; let rows = (w.get_size().1 as f32 / fh).floor() as u16; dbg!(rows, cols); let mut t = Terminal { @@ -183,7 +190,7 @@ fn main() -> Result<()> { fn tparse() { println!("-------------------"); let mut x = TerminalInputParser::new(); - for c in "\x1b[32m greninator \x1b[0m".as_bytes() { + for c in "\x1b[32;1m greninator \x1b[0m".as_bytes() { use ctlfun::TerminalInput::*; match x.parse_byte(*c) { Char(x) => { diff --git a/src/render.rs b/src/render.rs index 2e9780c..b52ce56 100644 --- a/src/render.rs +++ b/src/render.rs @@ -13,7 +13,7 @@ pub fn render( let m = FONT.metrics(&[]); let sz = ppem * (m.max_width / m.units_per_em as f32); let mut i = Image::alloc(w as _, h as _); - for (col, k) in x.cells.chunks_exact(x.size.0 as _).zip(0..) { + for (col, k) in x.cells.chunks_exact(x.size.0 as _).zip(0..).skip(1) { for (cell, j) in col.iter().skip(2).zip(0..).filter(_.0.letter.is_some()) { @@ -42,9 +42,9 @@ pub fn render( .buf(&*x.data), ) .as_ref(), - 4 + ((j * sz as i32) + x.placement.left) as u32, - (k as f32 * (ppem * 1.25)) as u32 - - x.placement.top as u32, + 4 + ((j as f32 * sz) + x.placement.left as f32) as u32, + ((k as f32 * (ppem * 1.25)) as u32) + .saturating_sub(x.placement.top as u32), // x.placement.height - x.placement.top as u32, ); } @@ -55,7 +55,7 @@ pub fn render( pub fn dims(font: &FontRef, ppem: f32) -> (f32, f32) { let m = font.metrics(&[]); - (ppem * (m.max_width / m.units_per_em as f32), ppem) + (ppem * (m.max_width / m.units_per_em as f32), ppem * 1.25) } pub static FONT: LazyLock<FontRef<'static>> = LazyLock::new(|| { diff --git a/src/term.rs b/src/term.rs index 87192bd..32d0529 100644 --- a/src/term.rs +++ b/src/term.rs @@ -37,6 +37,11 @@ impl Terminal { Char(x) => { dbg!(x); self.cursor.0 += 1; + if self.cursor.0 == self.size.0 { + println!("overflow"); + self.cursor.0 = 1; + self.cursor.1 += 1; + } self.cells[(self.cursor.1 * self.size.0 + self.cursor.0) as usize] .letter = Some(x); |