Fix scrollback history size 0 bug

There was an issue where alacritty would panic whenever the scrollback
history size is set to 0, this fixes that issue.

The panic was caused by a substraction with unsigned integers which was
underflowing, this has been fixed to use `saturating_sub`.

After that was fixed there was still a bug where scrollback would not
behave correctly because the number of lines in the grid was decided at
startup.
This has been adapted so whenever the size of the terminal changes, the
scrollback history and grid adapts to make sure the number of lines in
the terminal is always the number of visible lines plus the amount of
scrollback lines configured in the config file.

This fixes #1150.
This commit is contained in:
Christian Duerr 2018-04-07 01:50:14 +02:00 committed by Joe Wilm
parent 7f2fe5acb2
commit e615d112fb
2 changed files with 22 additions and 6 deletions

View File

@ -211,7 +211,10 @@ impl<T: Copy + Clone> Grid<T> {
}
fn increase_scroll_limit(&mut self, count: usize) {
self.scroll_limit = min(self.scroll_limit + count, self.raw.len() - *self.lines);
self.scroll_limit = min(
self.scroll_limit + count,
self.raw.len().saturating_sub(*self.lines),
);
}
fn decrease_scroll_limit(&mut self, count: usize) {
@ -240,6 +243,13 @@ impl<T: Copy + Clone> Grid<T> {
self.raw.set_visible_lines(new_line_count);
self.lines = new_line_count;
// Fill up the history with empty lines
if self.raw.len() < self.raw.capacity() {
for _ in self.raw.len()..self.raw.capacity() {
self.raw.push(Row::new(self.cols, &template));
}
}
// Add new lines to bottom
self.scroll_up(&(Line(0)..new_line_count), lines_added, template);
@ -263,11 +273,6 @@ impl<T: Copy + Clone> Grid<T> {
///
/// Alacritty takes the same approach.
fn shrink_lines(&mut self, target: index::Line) {
// TODO handle disabled scrollback
// while index::Line(self.raw.len()) != lines {
// self.raw.pop();
// }
let prev = self.lines;
self.selection = None;

View File

@ -48,6 +48,17 @@ impl<T> Storage<T> {
}
pub fn set_visible_lines(&mut self, next: Line) {
// Change capacity to fit scrollback + screen size
if next > self.visible_lines + 1 {
self.inner.reserve_exact((next - (self.visible_lines + 1)).0);
} else if next < self.visible_lines + 1 {
let shrinkage = (self.visible_lines + 1 - next).0;
let new_size = self.inner.capacity() - shrinkage;
self.inner.truncate(new_size);
self.inner.shrink_to_fit();
}
// Update visible lines
self.visible_lines = next - 1;
}