aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-08 12:39:34 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-08 12:39:34 -0500
commit6abfaac01daa6f1ba959c8e522d4fd439babaaee (patch)
treed38f20e67208fe417f5419d9864cffd95c464982
parentd743018c4c0ae459a9586898a4dca132eecad3cb (diff)
downloadvt100-rust-6abfaac01daa6f1ba959c8e522d4fd439babaaee.tar.gz
vt100-rust-6abfaac01daa6f1ba959c8e522d4fd439babaaee.zip
ignore the scroll region when moving if we're already outside of it
-rw-r--r--CHANGELOG.md7
-rw-r--r--src/grid.rs16
-rw-r--r--tests/scroll.rs3
3 files changed, 22 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 89a5e88..4f97f97 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## Unreleased
+
+### Fixed
+
+* Fixed cursor movement when the cursor position is already outside of an
+ active scroll region.
+
## [0.3.2] - 2019-11-08
### Fixed
diff --git a/src/grid.rs b/src/grid.rs
index 4951d25..fa5d437 100644
--- a/src/grid.rs
+++ b/src/grid.rs
@@ -315,28 +315,36 @@ impl Grid {
self.pos.col = 0;
}
+ fn in_scroll_region(&self) -> bool {
+ self.pos.row >= self.scroll_top && self.pos.row <= self.scroll_bottom
+ }
+
pub fn set_origin_mode(&mut self, mode: bool) {
self.origin_mode = mode;
self.set_pos(Pos { row: 0, col: 0 })
}
pub fn row_inc_clamp(&mut self, count: u16) {
+ let in_scroll_region = self.in_scroll_region();
self.pos.row = self.pos.row.saturating_add(count);
- self.row_clamp_bottom(true);
+ self.row_clamp_bottom(in_scroll_region);
}
pub fn row_inc_scroll(&mut self, count: u16) {
+ let in_scroll_region = self.in_scroll_region();
self.pos.row = self.pos.row.saturating_add(count);
- let lines = self.row_clamp_bottom(true);
+ let lines = self.row_clamp_bottom(in_scroll_region);
self.scroll_up(lines);
}
pub fn row_dec_clamp(&mut self, count: u16) {
+ let in_scroll_region = self.in_scroll_region();
self.pos.row = self.pos.row.saturating_sub(count);
- self.row_clamp_top(true);
+ self.row_clamp_top(in_scroll_region);
}
pub fn row_dec_scroll(&mut self, count: u16) {
+ let in_scroll_region = self.in_scroll_region();
// need to account for clamping by both row_clamp_top and by
// saturating_sub
let extra_lines = if count > self.pos.row {
@@ -345,7 +353,7 @@ impl Grid {
0
};
self.pos.row = self.pos.row.saturating_sub(count);
- let lines = self.row_clamp_top(true);
+ let lines = self.row_clamp_top(in_scroll_region);
self.scroll_down(lines + extra_lines);
}
diff --git a/tests/scroll.rs b/tests/scroll.rs
index 1aa9377..2291ca3 100644
--- a/tests/scroll.rs
+++ b/tests/scroll.rs
@@ -33,6 +33,9 @@ fn scroll_regions() {
assert_eq!(parser.screen().cursor_position(), (9, 49));
parser.process(b"\x1b[23d");
assert_eq!(parser.screen().cursor_position(), (22, 49));
+ parser.process(b"\n");
+ assert_eq!(parser.screen().cursor_position(), (23, 49));
+ assert_eq!(parser.screen().contents(), "1\n2\n3\n4\n5\n6\n7\n8\n9\n\n10\n11\n12\n13\n14\n\n\n15\n16\n17\n21\n22\n23\n24");
}
#[test]