aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-12-04 21:04:30 -0500
committerJesse Luehrs <doy@tozt.net>2021-12-04 21:04:30 -0500
commit087cdb93d971934cdf2a6a577d8d5fe94380611d (patch)
tree64a7bc045c0a5bc16b20915868e0275c59222f6c
parentd4bce2deb371f7615c937150f2538e78c40e086b (diff)
downloadvt100-rust-087cdb93d971934cdf2a6a577d8d5fe94380611d.tar.gz
vt100-rust-087cdb93d971934cdf2a6a577d8d5fe94380611d.zip
delay allocation of the alternate screen
-rw-r--r--CHANGELOG.md7
-rw-r--r--src/grid.rs13
-rw-r--r--src/screen.rs5
3 files changed, 23 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 404671f..75c5e60 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [Unreleased]
+
+## Changed
+
+* Delay allocation of the alternate screen until it is used (saves a bit of
+ memory in basic cases)
+
## [0.13.1] - 2021-12-04
## Fixed
diff --git a/src/grid.rs b/src/grid.rs
index 246e9e6..9681638 100644
--- a/src/grid.rs
+++ b/src/grid.rs
@@ -21,7 +21,7 @@ impl Grid {
size,
pos: Pos::default(),
saved_pos: Pos::default(),
- rows: vec![crate::row::Row::new(size.cols); size.rows as usize],
+ rows: vec![],
scroll_top: 0,
scroll_bottom: size.rows - 1,
origin_mode: false,
@@ -32,6 +32,17 @@ impl Grid {
}
}
+ pub fn allocate_rows(&mut self) {
+ if self.rows.is_empty() {
+ self.rows.extend(
+ std::iter::repeat_with(|| {
+ crate::row::Row::new(self.size.cols)
+ })
+ .take(self.size.rows as usize),
+ );
+ }
+ }
+
fn new_row(&self) -> crate::row::Row {
crate::row::Row::new(self.size.cols)
}
diff --git a/src/screen.rs b/src/screen.rs
index 74e0559..ae6bd2d 100644
--- a/src/screen.rs
+++ b/src/screen.rs
@@ -85,8 +85,10 @@ impl Screen {
size: crate::grid::Size,
scrollback_len: usize,
) -> Self {
+ let mut grid = crate::grid::Grid::new(size, scrollback_len);
+ grid.allocate_rows();
Self {
- grid: crate::grid::Grid::new(size, scrollback_len),
+ grid,
alternate_grid: crate::grid::Grid::new(size, 0),
attrs: crate::attrs::Attrs::default(),
@@ -759,6 +761,7 @@ impl Screen {
fn enter_alternate_grid(&mut self) {
self.grid_mut().set_scrollback(0);
self.set_mode(MODE_ALTERNATE_SCREEN);
+ self.alternate_grid.allocate_rows();
}
fn exit_alternate_grid(&mut self) {