small software-rendered rust tty
-rw-r--r--src/main.rs1
-rw-r--r--src/render.rs5
-rw-r--r--src/term.rs17
3 files changed, 15 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs
index 7efe0b8..d64add9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -146,6 +146,7 @@ fn main() -> Result<()> {
let rows = (w.get_size().1 as f32 / fh).floor() as u16 - 1;
println!("{}x{}", rows, cols);
let mut t = Terminal::new((cols, rows), false);
+ t.alternate.as_mut().unwrap().view_o = None;
unsafe {
let x = winsize {
ws_row: rows,
diff --git a/src/render.rs b/src/render.rs
index 2c978fe..72e315c 100644
--- a/src/render.rs
+++ b/src/render.rs
@@ -19,8 +19,9 @@ pub fn render(
let mut i = Image::build(w as _, h as _).fill(colors::BACKGROUND);
let c = x.cells.c();
let r = x.cells.r();
+ let vo = x.view_o.unwrap_or(x.cells.row);
for (col, k) in x.cells.cells
- [(x.view_o * c) as usize..(x.view_o * c + r * c) as usize]
+ [(vo * c) as usize..(vo * c + r * c) as usize]
.chunks_exact(c as _)
.zip(1..)
{
@@ -114,7 +115,7 @@ pub fn render(
}
}
- if x.view_o == x.cells.row {
+ if x.view_o == Some(x.cells.row) || x.view_o.is_none() {
let cell = Image::<_, 4>::build(3, (ppem * 1.25).ceil() as u32)
.fill([0xFF, 0xCC, 0x66, 255]);
unsafe {
diff --git a/src/term.rs b/src/term.rs
index ebf20a7..65d9ee5 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -11,7 +11,7 @@ pub struct Terminal {
pub cursor: (u16, u16),
pub saved_cursor: (u16, u16),
- pub view_o: u16,
+ pub view_o: Option<u16>,
pub cells: Cells,
pub p: TerminalInputParser,
pub mode: Mode,
@@ -23,7 +23,7 @@ use std::default::Default::default;
impl Terminal {
pub fn new(sz: (u16, u16), alt: bool) -> Self {
Self {
- view_o: 0,
+ view_o: Some(0),
style: default(),
saved_cursor: (1, 1),
cursor: (1, 1),
@@ -45,12 +45,15 @@ pub enum Mode {
impl Terminal {
pub fn scroll(&mut self, rows: f32) {
+ let Some(vo) = self.view_o.as_mut() else {
+ return;
+ };
if rows < 0.0 {
let rows = rows.ceil().abs() as u16;
- self.view_o = (self.view_o + rows).min(self.cells.row);
+ *vo = (*vo + rows).min(self.cells.row);
} else {
let rows = rows.floor() as u16;
- self.view_o = self.view_o.saturating_sub(rows);
+ *vo = vo.saturating_sub(rows);
}
}
@@ -77,8 +80,10 @@ impl Terminal {
println!("newline");
self.cursor.1 -= 1;
self.cells.grow(1);
- if self.view_o + 1 == self.cells.row {
- self.view_o += 1;
+ if let Some(vo) = self.view_o.as_mut()
+ && *vo + 1 == self.cells.row
+ {
+ *vo += 1;
}
}
let w = self.cells.c();