diff options
author | Christian Duerr <chrisduerr@users.noreply.github.com> | 2019-03-02 21:30:29 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-02 21:30:29 +0000 |
commit | de52ddb6c25a6d58cdfaa095ad6ec9abffa6564a (patch) | |
tree | ee40404604fa757f62844cab715eb14b6cbfc134 /src | |
parent | 9468b50b75be13d6b0d36ba2c01d36d92f008bf2 (diff) | |
download | alacritty-de52ddb6c25a6d58cdfaa095ad6ec9abffa6564a.tar.gz alacritty-de52ddb6c25a6d58cdfaa095ad6ec9abffa6564a.zip |
Fix alt screen bugs
This fixes two bugs with the alternate screen buffer.
When resetting while in the alt screen, Alacritty would not swap out
the grids leading to scrollback getting disabled. By swapping out the
grids again when resetting in the alternate screen buffer, scrollback is
now unaffected from a reset.
There was another issue with the cursor jumping around when leaving the
alt screen even though it was not active, this was fixed by skipping all
alt screen swap routines unless the current state matches the expected
state.
This fixes #2145.
Diffstat (limited to 'src')
-rw-r--r-- | src/grid/mod.rs | 16 | ||||
-rw-r--r-- | src/grid/storage.rs | 2 | ||||
-rw-r--r-- | src/term/mod.rs | 20 |
3 files changed, 28 insertions, 10 deletions
diff --git a/src/grid/mod.rs b/src/grid/mod.rs index 7766f9a9..80289cd6 100644 --- a/src/grid/mod.rs +++ b/src/grid/mod.rs @@ -404,6 +404,22 @@ impl<T: Copy + Clone> Grid<T> { } } } + + // Completely reset the grid state + pub fn reset(&mut self, template: &T) { + // Explicitly purge all lines from history + let shrinkage = self.raw.len() - self.lines.0; + self.raw.shrink_lines(shrinkage); + self.clear_history(); + + // Reset all visible lines + for row in 0..self.raw.len() { + self.raw[row].reset(template); + } + + self.display_offset = 0; + self.selection = None; + } } #[allow(clippy::len_without_is_empty)] diff --git a/src/grid/storage.rs b/src/grid/storage.rs index 19c1636d..87a129d0 100644 --- a/src/grid/storage.rs +++ b/src/grid/storage.rs @@ -160,7 +160,7 @@ impl<T> Storage<T> { } // Shrink the number of lines in the buffer - fn shrink_lines(&mut self, shrinkage: usize) { + pub fn shrink_lines(&mut self, shrinkage: usize) { self.len -= shrinkage; // Free memory diff --git a/src/term/mod.rs b/src/term/mod.rs index 2446f048..966ac182 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -1915,10 +1915,12 @@ impl ansi::Handler for Term { // Reset all important fields in the term struct #[inline] fn reset_state(&mut self) { + if self.alt { + self.swap_alt(); + } self.input_needs_wrap = false; self.next_title = None; self.next_mouse_cursor = None; - self.alt = false; self.cursor = Default::default(); self.active_charset = Default::default(); self.mode = Default::default(); @@ -1929,8 +1931,8 @@ impl ansi::Handler for Term { self.colors = self.original_colors; self.color_modified = [false; color::COUNT]; self.cursor_style = None; - self.grid.clear_history(); - self.grid.region_mut(..).each(|c| c.reset(&Cell::default())); + self.grid.reset(&Cell::default()); + self.alt_grid.reset(&Cell::default()); } #[inline] @@ -1981,12 +1983,12 @@ impl ansi::Handler for Term { trace!("Setting mode: {:?}", mode); match mode { ansi::Mode::SwapScreenAndSetRestoreCursor => { - self.mode.insert(mode::TermMode::ALT_SCREEN); - self.save_cursor_position(); if !self.alt { + self.mode.insert(mode::TermMode::ALT_SCREEN); + self.save_cursor_position(); self.swap_alt(); + self.save_cursor_position(); } - self.save_cursor_position(); }, ansi::Mode::ShowCursor => self.mode.insert(mode::TermMode::SHOW_CURSOR), ansi::Mode::CursorKeys => self.mode.insert(mode::TermMode::APP_CURSOR), @@ -2021,12 +2023,12 @@ impl ansi::Handler for Term { trace!("Unsetting mode: {:?}", mode); match mode { ansi::Mode::SwapScreenAndSetRestoreCursor => { - self.mode.remove(mode::TermMode::ALT_SCREEN); - self.restore_cursor_position(); if self.alt { + self.mode.remove(mode::TermMode::ALT_SCREEN); + self.restore_cursor_position(); self.swap_alt(); + self.restore_cursor_position(); } - self.restore_cursor_position(); }, ansi::Mode::ShowCursor => self.mode.remove(mode::TermMode::SHOW_CURSOR), ansi::Mode::CursorKeys => self.mode.remove(mode::TermMode::APP_CURSOR), |