aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2021-01-14 12:48:36 +0100
committerGitHub <noreply@github.com>2021-01-14 12:48:36 +0100
commite6a7ed31f67a9c2170b5f4a0a37ae6089b0daa4b (patch)
treeb9298c89704450515db104adbf87b7edc4de47c7 /src
parentfeat(ui): added a help / status bar for keybindings and modes (diff)
downloadsl0ppij-e6a7ed31f67a9c2170b5f4a0a37ae6089b0daa4b.tar.gz
sl0ppij-e6a7ed31f67a9c2170b5f4a0a37ae6089b0daa4b.tar.xz
sl0ppij-e6a7ed31f67a9c2170b5f4a0a37ae6089b0daa4b.zip
fix(compatibility): clear characters should preserve current styling (#143)
* fix(compatibility): clear characters should preserve current styling * style(fmt): rustfmt
Diffstat (limited to 'src')
-rw-r--r--src/panes/grid.rs29
-rw-r--r--src/panes/terminal_pane.rs7
2 files changed, 24 insertions, 12 deletions
diff --git a/src/panes/grid.rs b/src/panes/grid.rs
index e00b6c73..3d0f220b 100644
--- a/src/panes/grid.rs
+++ b/src/panes/grid.rs
@@ -521,19 +521,27 @@ impl Grid {
let row = self.viewport.get_mut(self.cursor.y).unwrap();
row.replace_beginning_with(line_part);
}
- pub fn clear_all_after_cursor(&mut self) {
- self.viewport
- .get_mut(self.cursor.y)
- .unwrap()
- .truncate(self.cursor.x);
- self.viewport.truncate(self.cursor.y + 1);
+ pub fn clear_all_after_cursor(&mut self, replace_with: TerminalCharacter) {
+ let cursor_row = self.viewport.get_mut(self.cursor.y).unwrap();
+ cursor_row.truncate(self.cursor.x);
+ let mut replace_with_columns_in_cursor_row = vec![replace_with; self.width - self.cursor.x];
+ cursor_row.append(&mut replace_with_columns_in_cursor_row);
+
+ let replace_with_columns = vec![replace_with; self.width];
+ self.replace_characters_in_line_after_cursor(replace_with);
+ for row in self.viewport.iter_mut().skip(self.cursor.y + 1) {
+ row.replace_columns(replace_with_columns.clone());
+ }
}
pub fn clear_cursor_line(&mut self) {
self.viewport.get_mut(self.cursor.y).unwrap().truncate(0);
}
- pub fn clear_all(&mut self) {
- self.viewport.clear();
- self.viewport.push(Row::new().canonical());
+ pub fn clear_all(&mut self, replace_with: TerminalCharacter) {
+ let replace_with_columns = vec![replace_with; self.width];
+ self.replace_characters_in_line_after_cursor(replace_with);
+ for row in self.viewport.iter_mut() {
+ row.replace_columns(replace_with_columns.clone());
+ }
}
fn pad_current_line_until(&mut self, position: usize) {
let current_row = self.viewport.get_mut(self.cursor.y).unwrap();
@@ -746,6 +754,9 @@ impl Row {
self.columns.push(terminal_character);
self.columns.swap_remove(x);
}
+ pub fn replace_columns(&mut self, columns: Vec<TerminalCharacter>) {
+ self.columns = columns;
+ }
pub fn push(&mut self, terminal_character: TerminalCharacter) {
self.columns.push(terminal_character);
}
diff --git a/src/panes/terminal_pane.rs b/src/panes/terminal_pane.rs
index b9369fea..3ad60050 100644
--- a/src/panes/terminal_pane.rs
+++ b/src/panes/terminal_pane.rs
@@ -443,10 +443,12 @@ impl vte::Perform for TerminalPane {
}
} else if c == 'J' {
// clear all (0 => below, 1 => above, 2 => all, 3 => saved)
+ let mut char_to_replace = EMPTY_TERMINAL_CHARACTER;
+ char_to_replace.styles = self.pending_styles;
if params[0] == 0 {
- self.grid.clear_all_after_cursor();
+ self.grid.clear_all_after_cursor(char_to_replace);
} else if params[0] == 2 {
- self.grid.clear_all();
+ self.grid.clear_all(char_to_replace);
}
// TODO: implement 1
} else if c == 'H' {
@@ -492,7 +494,6 @@ impl vte::Perform for TerminalPane {
Some(&1049) => {
if let Some(alternative_grid) = self.alternative_grid.as_mut() {
std::mem::swap(&mut self.grid, alternative_grid);
- // self.grid = alternative_grid;
}
self.alternative_grid = None;
}