small software-rendered rust tty
-rw-r--r--src/main.rs63
-rw-r--r--src/render.rs10
-rw-r--r--src/term.rs5
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);