Skip to content

Commit 9103857

Browse files
committed
Fix scroll offset bugs
1 parent ae93501 commit 9103857

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/grid.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,14 @@ impl Grid {
122122
self.scrollback
123123
.iter()
124124
.skip(scrollback_len - self.scrollback_offset)
125-
.chain(self.rows.iter().take(rows_len - self.scrollback_offset))
125+
// when scrollback_offset > rows_len (e.g. rows = 3,
126+
// scrollback_len = 10, offset = 9) the skip(10 - 9)
127+
// will take 9 rows instead of 3. we need to set
128+
// the upper bound to rows_len (e.g. 3)
129+
.take(rows_len)
130+
// same for rows_len - scrollback_offset (e.g. 3 - 9).
131+
// it'll panic with overflow. we have to saturate the subtraction.
132+
.chain(self.rows.iter().take(rows_len.saturating_sub(self.scrollback_offset)))
126133
}
127134

128135
pub fn drawing_rows(&self) -> impl Iterator<Item = &crate::row::Row> {

tests/scroll.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::ops::RangeInclusive;
2+
13
mod helpers;
24

35
#[test]
@@ -110,3 +112,25 @@ fn edge_of_screen() {
110112
b"\x1b[24;75H\x1b[31mfoobar\x1b[24;80H"
111113
);
112114
}
115+
116+
#[test]
117+
fn scrollback_larger_than_rows() {
118+
let mut parser = vt100::Parser::new(3, 20, 10);
119+
120+
parser.process(&gen_nums(1..=10, "\r\n").as_bytes());
121+
122+
// 1. Extra rows returned
123+
parser.screen_mut().set_scrollback(4);
124+
assert_eq!(parser.screen().contents(), gen_nums(4..=6, "\n"));
125+
126+
// 2. Subtraction overflow
127+
parser.screen_mut().set_scrollback(10);
128+
assert_eq!(parser.screen().contents(), gen_nums(1..=4, "\n"));
129+
}
130+
131+
#[cfg(test)]
132+
fn gen_nums(range: RangeInclusive<u8>, join: &str) -> String {
133+
range.map(|num| num.to_string())
134+
.collect::<Vec<String>>()
135+
.join(join)
136+
}

0 commit comments

Comments
 (0)