diff --git a/CHANGELOG.md b/CHANGELOG.md index e3d0fb18..cb5d2334 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Automatic copying of selection to clipboard when mouse is released outside of Alacritty - Scrollback history live reload only working when shrinking lines - Crash when decreasing scrollback history in config while scrolled in history +- Resetting the terminal while in the alt screen will no longer disable scrollback +- Cursor jumping around when leaving alt screen while not in the alt screen +- Text lingering around when resetting while scrolled up in the history ## Version 0.2.9 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 Grid { } } } + + // 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 Storage { } // 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),