From cd99d3a5470273fe7c62592a4dfadb6a44d09f32 Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Thu, 14 Apr 2022 11:52:37 +0200 Subject: [PATCH] fix(compatibility): various ansi fixes (#1324) * fix(compatibility): rotate scroll region up properly * fix(compatibility): rotate scroll region down properly * style(fmt): rustfmt --- zellij-server/src/panes/grid.rs | 19 +++++-- zellij-server/src/panes/unit/grid_tests.rs | 34 +++++++++++ ...nes__grid__grid_tests__ansi_capital_s.snap | 57 +++++++++++++++++++ ...nes__grid__grid_tests__ansi_capital_t.snap | 57 +++++++++++++++++++ 4 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_s.snap create mode 100644 zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_t.snap diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index 320308e2..b74966f3 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -822,12 +822,17 @@ impl Grid { .scroll_region .or(Some((0, self.height.saturating_sub(1)))) { + self.pad_lines_until(scroll_region_bottom, EMPTY_TERMINAL_CHARACTER); for _ in 0..count { if self.cursor.y >= scroll_region_top && self.cursor.y <= scroll_region_bottom { - self.pad_lines_until(scroll_region_bottom, EMPTY_TERMINAL_CHARACTER); if self.viewport.get(scroll_region_bottom).is_some() { self.viewport.remove(scroll_region_bottom); } + let mut pad_character = EMPTY_TERMINAL_CHARACTER; + pad_character.styles = self.cursor.pending_styles; + let columns = VecDeque::from(vec![pad_character; self.width]); + self.viewport + .insert(scroll_region_top, Row::from_columns(columns).canonical()); } } self.output_buffer.update_all_lines(); // TODO: only update scroll region lines @@ -838,12 +843,14 @@ impl Grid { .scroll_region .or(Some((0, self.height.saturating_sub(1)))) { + self.pad_lines_until(scroll_region_bottom, EMPTY_TERMINAL_CHARACTER); + let mut pad_character = EMPTY_TERMINAL_CHARACTER; + pad_character.styles = self.cursor.pending_styles; for _ in 0..count { - if self.cursor.y >= scroll_region_top && self.cursor.y <= scroll_region_bottom { - self.pad_lines_until(scroll_region_top, EMPTY_TERMINAL_CHARACTER); - self.viewport.remove(scroll_region_top); - self.pad_lines_until(scroll_region_bottom, EMPTY_TERMINAL_CHARACTER); - } + self.viewport.remove(scroll_region_top); + let columns = VecDeque::from(vec![pad_character; self.width]); + self.viewport + .insert(scroll_region_bottom, Row::from_columns(columns).canonical()); } self.output_buffer.update_all_lines(); // TODO: only update scroll region lines } diff --git a/zellij-server/src/panes/unit/grid_tests.rs b/zellij-server/src/panes/unit/grid_tests.rs index 2790c585..b0e00f9a 100644 --- a/zellij-server/src/panes/unit/grid_tests.rs +++ b/zellij-server/src/panes/unit/grid_tests.rs @@ -1707,6 +1707,40 @@ pub fn scroll_down_ansi() { assert_snapshot!(format!("{:?}", grid)); } +#[test] +pub fn ansi_capital_t() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new( + 51, + 112, + Palette::default(), + Rc::new(RefCell::new(LinkHandler::new())), + Rc::new(RefCell::new(None)), + ); + let content = "foo\u{1b}[14Tbar".as_bytes(); + for byte in content { + vte_parser.advance(&mut grid, *byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + +#[test] +pub fn ansi_capital_s() { + let mut vte_parser = vte::Parser::new(); + let mut grid = Grid::new( + 51, + 112, + Palette::default(), + Rc::new(RefCell::new(LinkHandler::new())), + Rc::new(RefCell::new(None)), + ); + let content = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfoo\u{1b}[14Sbar".as_bytes(); + for byte in content { + vte_parser.advance(&mut grid, *byte); + } + assert_snapshot!(format!("{:?}", grid)); +} + #[test] fn terminal_pixel_size_reports() { let mut vte_parser = vte::Parser::new(); diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_s.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_s.snap new file mode 100644 index 00000000..418f64bf --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_s.snap @@ -0,0 +1,57 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +assertion_line: 1741 +expression: "format!(\"{:?}\", grid)" +--- +00 (C): +01 (C): +02 (C): +03 (C): +04 (C): +05 (C): +06 (C): foo +07 (C): +08 (C): +09 (C): +10 (C): +11 (C): +12 (C): +13 (C): +14 (C): +15 (C): +16 (C): +17 (C): +18 (C): +19 (C): +20 (C): bar +21 (C): +22 (C): +23 (C): +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): +41 (C): +42 (C): +43 (C): +44 (C): +45 (C): +46 (C): +47 (C): +48 (C): +49 (C): +50 (C): + diff --git a/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_t.snap b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_t.snap new file mode 100644 index 00000000..125d3634 --- /dev/null +++ b/zellij-server/src/panes/unit/snapshots/zellij_server__panes__grid__grid_tests__ansi_capital_t.snap @@ -0,0 +1,57 @@ +--- +source: zellij-server/src/panes/./unit/grid_tests.rs +assertion_line: 1724 +expression: "format!(\"{:?}\", grid)" +--- +00 (C): bar +01 (C): +02 (C): +03 (C): +04 (C): +05 (C): +06 (C): +07 (C): +08 (C): +09 (C): +10 (C): +11 (C): +12 (C): +13 (C): +14 (C): foo +15 (C): +16 (C): +17 (C): +18 (C): +19 (C): +20 (C): +21 (C): +22 (C): +23 (C): +24 (C): +25 (C): +26 (C): +27 (C): +28 (C): +29 (C): +30 (C): +31 (C): +32 (C): +33 (C): +34 (C): +35 (C): +36 (C): +37 (C): +38 (C): +39 (C): +40 (C): +41 (C): +42 (C): +43 (C): +44 (C): +45 (C): +46 (C): +47 (C): +48 (C): +49 (C): +50 (C): +