From 6abfaac01daa6f1ba959c8e522d4fd439babaaee Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 8 Nov 2019 12:39:34 -0500 Subject: ignore the scroll region when moving if we're already outside of it --- CHANGELOG.md | 7 +++++++ src/grid.rs | 16 ++++++++++++---- tests/scroll.rs | 3 +++ 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] -- cgit v1.2.3-54-g00ecf