diff options
author | Christian Duerr <contact@christianduerr.com> | 2021-07-17 23:14:39 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-17 23:14:39 +0000 |
commit | d8f0d3fabf811bedb26bb7752e4a7c2efab98d53 (patch) | |
tree | 34209356257acbec358e8064cc01eb9ede3742f9 /alacritty_terminal | |
parent | e447156612d3239f6b0e938043038d0ce6edaebf (diff) | |
download | alacritty-d8f0d3fabf811bedb26bb7752e4a7c2efab98d53.tar.gz alacritty-d8f0d3fabf811bedb26bb7752e4a7c2efab98d53.zip |
Fix vi cursor tracking during scrolling
This resolves an issue with the vi mode cursor where it would not keep
track of the content while scrolled up in history but instead slowly
leave the viewport due to its absolute positioning.
While an alternative solution would have been to always keep the vi mode
cursor in the same spot on the viewport, keeping track of the content is
not only more easy to implement but it also makes for a nicer connection
between the vi mode cursor and the content below it.
Fixes #5339.
Diffstat (limited to 'alacritty_terminal')
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index 1c29327a..b560d69e 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -562,6 +562,12 @@ impl<T> Term<T> { self.selection = self.selection.take().and_then(|s| s.rotate(self, ®ion, -(lines as i32))); + // Scroll vi mode cursor. + let line = &mut self.vi_mode_cursor.point.line; + if region.start <= *line && region.end > *line { + *line = min(*line + lines, region.end - 1); + } + // Scroll between origin and bottom self.grid.scroll_down(®ion, lines); } @@ -581,6 +587,14 @@ impl<T> Term<T> { // Scroll selection. self.selection = self.selection.take().and_then(|s| s.rotate(self, ®ion, lines as i32)); + // Scroll vi mode cursor. + let viewport_top = Line(-(self.grid.display_offset() as i32)); + let top = if region.start == 0 { viewport_top } else { region.start }; + let line = &mut self.vi_mode_cursor.point.line; + if (top <= *line) && region.end > *line { + *line = max(*line - lines, top); + } + // Scroll from origin to bottom less number of lines. self.grid.scroll_up(®ion, lines); } |