diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-11-09 12:34:39 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-11-09 14:58:57 -0500 |
commit | 44359ce5f1d4f13df5426175a5cbff45448c0c08 (patch) | |
tree | f25c11102f0563a4007adb5ecd91067f1068a624 /src/grid.rs | |
parent | 6052f0918ae43a33e1edcfffa37ecac0ca144070 (diff) | |
download | vt100-rust-44359ce5f1d4f13df5426175a5cbff45448c0c08.tar.gz vt100-rust-44359ce5f1d4f13df5426175a5cbff45448c0c08.zip |
optionally save scrollback rows
Diffstat (limited to 'src/grid.rs')
-rw-r--r-- | src/grid.rs | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/grid.rs b/src/grid.rs index 287e5e4..5a53c6e 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -12,10 +12,12 @@ pub struct Grid { scroll_bottom: u16, origin_mode: bool, saved_origin_mode: bool, + scrollback: std::collections::VecDeque<(usize, crate::row::Row)>, + scrollback_len: usize, } impl Grid { - pub fn new(size: Size) -> Self { + pub fn new(size: Size, scrollback_len: usize) -> Self { Self { size, pos: Pos::default(), @@ -25,6 +27,8 @@ impl Grid { scroll_bottom: size.rows - 1, origin_mode: false, saved_origin_mode: false, + scrollback: std::collections::VecDeque::new(), + scrollback_len, } } @@ -127,6 +131,10 @@ impl Grid { .expect("cursor not pointing to a cell") } + pub fn scrollback_len(&self) -> usize { + self.scrollback_len + } + pub fn write_contents(&self, contents: &mut String) { for row in self.rows() { row.write_contents(contents, 0, self.size.cols); @@ -309,7 +317,14 @@ impl Grid { for _ in 0..(count.min(self.size.rows - self.scroll_top)) { self.rows .insert(self.scroll_bottom as usize + 1, self.new_row()); - self.rows.remove(self.scroll_top as usize); + let removed = self.rows.remove(self.scroll_top as usize); + if self.scrollback_len > 0 && !self.scroll_region_active() { + let idx = self.scrollback.back().map_or(0, |r| r.0 + 1); + self.scrollback.push_back((idx, removed)); + while self.scrollback.len() > self.scrollback_len { + self.scrollback.pop_front(); + } + } } } @@ -337,6 +352,10 @@ impl Grid { self.pos.row >= self.scroll_top && self.pos.row <= self.scroll_bottom } + fn scroll_region_active(&self) -> bool { + self.scroll_top != 0 || self.scroll_bottom != self.size.rows - 1 + } + pub fn set_origin_mode(&mut self, mode: bool) { self.origin_mode = mode; self.set_pos(Pos { row: 0, col: 0 }) |