diff options
Diffstat (limited to 'alacritty_terminal/src/term/mod.rs')
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 150 |
1 files changed, 128 insertions, 22 deletions
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index 7fbd8dc8..590c7d63 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -1146,32 +1146,13 @@ impl<T> Term<T> { num_lines = Line(2); } - // Scroll up to keep cursor in terminal - if self.cursor.point.line >= num_lines { - let lines = self.cursor.point.line - num_lines + 1; - let template = Cell { bg: self.cursor.template.bg, ..Cell::default() }; - self.grid.scroll_up(&(Line(0)..old_lines), lines, &template); - } - - // Scroll up alt grid as well - if self.cursor_save_alt.point.line >= num_lines { - let lines = self.cursor_save_alt.point.line - num_lines + 1; - let template = Cell { bg: self.cursor_save_alt.template.bg, ..Cell::default() }; - self.alt_grid.scroll_up(&(Line(0)..old_lines), lines, &template); - } - - // Move prompt down when growing if scrollback lines are available - if num_lines > old_lines && !self.mode.contains(TermMode::ALT_SCREEN) { - let growage = min(num_lines - old_lines, Line(self.grid.history_size())); - self.cursor.point.line += growage; - } - debug!("New num_cols is {} and num_lines is {}", num_cols, num_lines); - // Resize grids to new size let is_alt = self.mode.contains(TermMode::ALT_SCREEN); let alt_cursor_point = if is_alt { &mut self.cursor_save.point } else { &mut self.cursor_save_alt.point }; + + // Resize grids to new size self.grid.resize(!is_alt, num_lines, num_cols, &mut self.cursor.point, &Cell::default()); self.alt_grid.resize(is_alt, num_lines, num_cols, alt_cursor_point, &Cell::default()); @@ -2183,6 +2164,8 @@ impl IndexMut<Column> for TabStops { #[cfg(test)] mod tests { + use super::*; + use std::mem; use crate::ansi::{self, CharsetIndex, Handler, StandardCharset}; @@ -2193,7 +2176,6 @@ mod tests { use crate::index::{Column, Line, Point, Side}; use crate::selection::Selection; use crate::term::cell::{Cell, Flags}; - use crate::term::{SizeInfo, Term}; struct Mock; impl EventListener for Mock { @@ -2363,6 +2345,130 @@ mod tests { } #[test] + fn grow_lines_updates_active_cursor_pos() { + let mut size = SizeInfo { + width: 100.0, + height: 10.0, + cell_width: 1.0, + cell_height: 1.0, + padding_x: 0.0, + padding_y: 0.0, + dpr: 1.0, + }; + let mut term = Term::new(&MockConfig::default(), &size, Clipboard::new_nop(), Mock); + + // Create 10 lines of scrollback + for _ in 0..19 { + term.newline(); + } + assert_eq!(term.grid.history_size(), 10); + assert_eq!(term.cursor.point, Point::new(Line(9), Column(0))); + + // Increase visible lines + size.height = 30.; + term.resize(&size); + + assert_eq!(term.grid.history_size(), 0); + assert_eq!(term.cursor.point, Point::new(Line(19), Column(0))); + } + + #[test] + fn grow_lines_updates_inactive_cursor_pos() { + let mut size = SizeInfo { + width: 100.0, + height: 10.0, + cell_width: 1.0, + cell_height: 1.0, + padding_x: 0.0, + padding_y: 0.0, + dpr: 1.0, + }; + let mut term = Term::new(&MockConfig::default(), &size, Clipboard::new_nop(), Mock); + + // Create 10 lines of scrollback + for _ in 0..19 { + term.newline(); + } + assert_eq!(term.grid.history_size(), 10); + assert_eq!(term.cursor.point, Point::new(Line(9), Column(0))); + + // Enter alt screen + term.set_mode(ansi::Mode::SwapScreenAndSetRestoreCursor); + + // Increase visible lines + size.height = 30.; + term.resize(&size); + + // Leave alt screen + term.unset_mode(ansi::Mode::SwapScreenAndSetRestoreCursor); + + assert_eq!(term.grid().history_size(), 0); + assert_eq!(term.cursor.point, Point::new(Line(19), Column(0))); + } + + #[test] + fn shrink_lines_updates_active_cursor_pos() { + let mut size = SizeInfo { + width: 100.0, + height: 10.0, + cell_width: 1.0, + cell_height: 1.0, + padding_x: 0.0, + padding_y: 0.0, + dpr: 1.0, + }; + let mut term = Term::new(&MockConfig::default(), &size, Clipboard::new_nop(), Mock); + + // Create 10 lines of scrollback + for _ in 0..19 { + term.newline(); + } + assert_eq!(term.grid.history_size(), 10); + assert_eq!(term.cursor.point, Point::new(Line(9), Column(0))); + + // Increase visible lines + size.height = 5.; + term.resize(&size); + + assert_eq!(term.grid().history_size(), 15); + assert_eq!(term.cursor.point, Point::new(Line(4), Column(0))); + } + + #[test] + fn shrink_lines_updates_inactive_cursor_pos() { + let mut size = SizeInfo { + width: 100.0, + height: 10.0, + cell_width: 1.0, + cell_height: 1.0, + padding_x: 0.0, + padding_y: 0.0, + dpr: 1.0, + }; + let mut term = Term::new(&MockConfig::default(), &size, Clipboard::new_nop(), Mock); + + // Create 10 lines of scrollback + for _ in 0..19 { + term.newline(); + } + assert_eq!(term.grid.history_size(), 10); + assert_eq!(term.cursor.point, Point::new(Line(9), Column(0))); + + // Enter alt screen + term.set_mode(ansi::Mode::SwapScreenAndSetRestoreCursor); + + // Increase visible lines + size.height = 5.; + term.resize(&size); + + // Leave alt screen + term.unset_mode(ansi::Mode::SwapScreenAndSetRestoreCursor); + + assert_eq!(term.grid().history_size(), 15); + assert_eq!(term.cursor.point, Point::new(Line(4), Column(0))); + } + + #[test] fn window_title() { let size = SizeInfo { width: 21.0, |