aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md3
-rw-r--r--src/grid/mod.rs16
-rw-r--r--src/grid/storage.rs2
-rw-r--r--src/term/mod.rs20
4 files changed, 31 insertions, 10 deletions
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<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),