From 52977a761f37041e8abd70989cd7b84af1fb9135 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Wed, 22 Dec 2021 14:34:28 +0100 Subject: [PATCH] fix(compatibility): handle inserting characters after wide character (#964) * fix(compatibility): handle inserting characters in the middle of a line after a wide character * style(fmt): make rustfmt happy --- Cargo.lock | 12 ++++++------ .../fixtures/wide_characters_middle_line_insert | 1 + zellij-server/src/panes/grid.rs | 9 ++++++--- zellij-server/src/panes/unit/grid_tests.rs | 12 ++++++++++++ ...insert_character_in_line_with_wide_character.snap | 7 +++++++ 5 files changed, 32 insertions(+), 9 deletions(-) create mode 100755 src/tests/fixtures/wide_characters_middle_line_insert create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__insert_character_in_line_with_wide_character.snap diff --git a/Cargo.lock b/Cargo.lock index 35385cfb..f909d695 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2879,7 +2879,7 @@ dependencies = [ [[package]] name = "zellij" -version = "0.23.0" +version = "0.24.0" dependencies = [ "anyhow", "dialoguer", @@ -2896,7 +2896,7 @@ dependencies = [ [[package]] name = "zellij-client" -version = "0.23.0" +version = "0.24.0" dependencies = [ "insta", "log", @@ -2909,7 +2909,7 @@ dependencies = [ [[package]] name = "zellij-server" -version = "0.23.0" +version = "0.24.0" dependencies = [ "ansi_term 0.12.1", "async-trait", @@ -2935,7 +2935,7 @@ dependencies = [ [[package]] name = "zellij-tile" -version = "0.23.0" +version = "0.24.0" dependencies = [ "serde", "serde_json", @@ -2945,14 +2945,14 @@ dependencies = [ [[package]] name = "zellij-tile-utils" -version = "0.23.0" +version = "0.24.0" dependencies = [ "ansi_term 0.12.1", ] [[package]] name = "zellij-utils" -version = "0.23.0" +version = "0.24.0" dependencies = [ "anyhow", "async-std", diff --git a/src/tests/fixtures/wide_characters_middle_line_insert b/src/tests/fixtures/wide_characters_middle_line_insert new file mode 100755 index 00000000..89fcb2a3 --- /dev/null +++ b/src/tests/fixtures/wide_characters_middle_line_insert @@ -0,0 +1 @@ +[?2004h[aram@green zellij]$ [aram@green zellij]$ 🏠🏠 abcdabceabcfabc abc[1@x \ No newline at end of file diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index c800f593..4bda27e0 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -2249,14 +2249,17 @@ impl Row { } } pub fn insert_character_at(&mut self, terminal_character: TerminalCharacter, x: usize) { - match self.columns.len().cmp(&x) { + let width_offset = self.excess_width_until(x); + let insert_position = x.saturating_sub(width_offset); + match self.columns.len().cmp(&insert_position) { Ordering::Equal => self.columns.push_back(terminal_character), Ordering::Less => { - self.columns.resize(x, EMPTY_TERMINAL_CHARACTER); + self.columns + .resize(insert_position, EMPTY_TERMINAL_CHARACTER); self.columns.push_back(terminal_character); } Ordering::Greater => { - self.columns.insert(x, terminal_character); + self.columns.insert(insert_position, terminal_character); } } } diff --git a/zellij-server/src/panes/unit/grid_tests.rs b/zellij-server/src/panes/unit/grid_tests.rs index d2100604..3fd0f958 100644 --- a/zellij-server/src/panes/unit/grid_tests.rs +++ b/zellij-server/src/panes/unit/grid_tests.rs @@ -420,6 +420,18 @@ fn wide_characters_line_wrap() { assert_snapshot!(format!("{:?}", grid)); } +#[test] +fn insert_character_in_line_with_wide_character() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new(21, 104, Palette::default()); + let fixture_name = "wide_characters_middle_line_insert"; + let content = read_fixture(fixture_name); + for byte in content { + vte_parser.advance(&mut grid, byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + #[test] fn fish_wide_characters_override_clock() { let mut vte_parser = vte::Parser::new(); diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__insert_character_in_line_with_wide_character.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__insert_character_in_line_with_wide_character.snap new file mode 100644 index 00000000..e278348c --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__insert_character_in_line_with_wide_character.snap @@ -0,0 +1,7 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +expression: "format!(\"{:?}\", grid)" + +--- +00 (C): [aram@green zellij]$ 🏠 xdef abc +