aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-12 08:36:55 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-12 08:38:51 -0500
commitabbc965bc094f95f4754caf2fcca840fd1f0a781 (patch)
tree08bb638d34db07b6afced27036b3dd2188ffc90c
parentcbab71b33b10e9779824aa6562dc8c8395a0d2fd (diff)
downloadvt100-rust-abbc965bc094f95f4754caf2fcca840fd1f0a781.tar.gz
vt100-rust-abbc965bc094f95f4754caf2fcca840fd1f0a781.zip
actually resize the underlying grid when requested
-rw-r--r--CHANGELOG.md8
-rw-r--r--src/grid.rs8
-rw-r--r--tests/basic.rs14
3 files changed, 30 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c23c2e..95c6a0d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## Unreleased
+
+### Fixed
+
+* `Screen::set_size` now actually resizes when requested (previously the
+ underlying storage was not being resized, leading to panics when writing
+ outside of the original screen).
+
## [0.5.0] - 2019-11-12
### Added
diff --git a/src/grid.rs b/src/grid.rs
index 2705834..80d44ba 100644
--- a/src/grid.rs
+++ b/src/grid.rs
@@ -60,7 +60,15 @@ impl Grid {
}
}
+ if self.scroll_bottom == self.size.rows - 1 {
+ self.scroll_bottom = size.rows - 1;
+ }
+
self.size = size;
+ for row in &mut self.rows {
+ row.resize(size.cols as usize, crate::cell::Cell::default());
+ }
+ self.rows.resize(size.rows as usize, self.new_row());
if self.scroll_bottom >= size.rows {
self.scroll_bottom = size.rows - 1;
diff --git a/tests/basic.rs b/tests/basic.rs
index 33a272d..4eec69b 100644
--- a/tests/basic.rs
+++ b/tests/basic.rs
@@ -56,6 +56,20 @@ fn set_size() {
parser.set_size(34, 8);
assert_eq!(parser.screen().contents(), "01234567\n89012345\n6789");
+
+ let mut parser = vt100::Parser::default();
+ assert_eq!(parser.screen().size(), (24, 80));
+ parser.set_size(30, 100);
+ assert_eq!(parser.screen().size(), (30, 100));
+ parser.process(b"\x1b[75Cfoobar");
+ assert_eq!(parser.screen().contents(), " foobar");
+
+ let mut parser = vt100::Parser::default();
+ assert_eq!(parser.screen().size(), (24, 80));
+ parser.set_size(30, 100);
+ assert_eq!(parser.screen().size(), (30, 100));
+ parser.process(b"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\x1b[24;99Hfoobar");
+ assert_eq!(parser.screen().contents(), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24 foobar");
}
#[test]