small software-rendered rust tty
exclude alternate window from scroll
| -rw-r--r-- | src/main.rs | 1 | ||||
| -rw-r--r-- | src/render.rs | 5 | ||||
| -rw-r--r-- | src/term.rs | 17 |
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(); |