diff --git a/src/tests/e2e/remote_runner.rs b/src/tests/e2e/remote_runner.rs index 2b6d82298b..3ce581556e 100644 --- a/src/tests/e2e/remote_runner.rs +++ b/src/tests/e2e/remote_runner.rs @@ -190,6 +190,7 @@ fn read_from_channel( }))); let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let debug = false; + let ansi_underlines = true; let mut terminal_output = TerminalPane::new( 0, pane_geom, @@ -204,6 +205,7 @@ fn read_from_channel( None, None, debug, + ansi_underlines, ); // 0 is the pane index loop { if !should_keep_running.load(Ordering::SeqCst) { diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index 6cafad7d39..ae64d6c30e 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -370,6 +370,7 @@ pub struct Grid { pub search_results: SearchResult, pub pending_clipboard_update: Option, debug: bool, + ansi_underlines: bool, } #[derive(Clone, Debug)] @@ -458,6 +459,7 @@ impl Grid { character_cell_size: Rc>>, sixel_image_store: Rc>, debug: bool, + ansi_underlines: bool, ) -> Self { let sixel_grid = SixelGrid::new(character_cell_size.clone(), sixel_image_store); // make sure this is initialized as it is used internally @@ -508,6 +510,7 @@ impl Grid { sixel_grid, pending_clipboard_update: None, debug, + ansi_underlines, } } pub fn render_full_viewport(&mut self) { @@ -2108,6 +2111,7 @@ impl Grid { impl Perform for Grid { fn print(&mut self, c: char) { let c = self.cursor.charsets[self.active_charset].map(c); + self.cursor.pending_styles.ansi_underlines = self.ansi_underlines; // apparently, building TerminalCharacter like this without a "new" method // is a little faster diff --git a/zellij-server/src/panes/plugin_pane.rs b/zellij-server/src/panes/plugin_pane.rs index b4e3461e2d..ae1dbd6a8e 100644 --- a/zellij-server/src/panes/plugin_pane.rs +++ b/zellij-server/src/panes/plugin_pane.rs @@ -50,6 +50,7 @@ macro_rules! get_or_create_grid { $self.character_cell_size.clone(), $self.sixel_image_store.clone(), $self.debug, + $self.ansi_underlines, ); grid.hide_cursor(); grid @@ -85,6 +86,7 @@ pub(crate) struct PluginPane { loading_indication: LoadingIndication, requesting_permissions: Option, debug: bool, + ansi_underlines: bool, } impl PluginPane { @@ -103,6 +105,7 @@ impl PluginPane { style: Style, invoked_with: Option, debug: bool, + ansi_underlines: bool, ) -> Self { let loading_indication = LoadingIndication::new(title.clone()).with_colors(style.colors); let initial_loading_message = loading_indication.to_string(); @@ -134,6 +137,7 @@ impl PluginPane { loading_indication, requesting_permissions: None, debug, + ansi_underlines, }; for client_id in currently_connected_clients { plugin.handle_plugin_bytes(client_id, initial_loading_message.as_bytes().to_vec()); diff --git a/zellij-server/src/panes/terminal_character.rs b/zellij-server/src/panes/terminal_character.rs index 22acb6353f..a4e84be55e 100644 --- a/zellij-server/src/panes/terminal_character.rs +++ b/zellij-server/src/panes/terminal_character.rs @@ -32,6 +32,7 @@ pub const RESET_STYLES: CharacterStyles = CharacterStyles { dim: Some(AnsiCode::Reset), italic: Some(AnsiCode::Reset), link_anchor: Some(LinkAnchor::End), + ansi_underlines: false, }; #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -141,11 +142,12 @@ pub struct CharacterStyles { pub dim: Option, pub italic: Option, pub link_anchor: Option, + pub ansi_underlines: bool, } impl CharacterStyles { pub fn new() -> Self { - Self::default() + Default::default() } pub fn foreground(mut self, foreground_code: Option) -> Self { self.foreground = foreground_code; @@ -175,7 +177,6 @@ impl CharacterStyles { self.underline = underline_code; self } - pub fn blink_slow(mut self, slow_blink_code: Option) -> Self { self.slow_blink = slow_blink_code; self @@ -497,20 +498,22 @@ impl Display for CharacterStyles { _ => {}, } } - if let Some(ansi_code) = self.underline_color { - match ansi_code { - AnsiCode::RgbCode((r, g, b)) => { - write!(f, "\u{1b}[58;2;{};{};{}m", r, g, b)?; - }, - AnsiCode::ColorIndex(color_index) => { - write!(f, "\u{1b}[58;5;{}m", color_index)?; - }, - AnsiCode::Reset => { - write!(f, "\u{1b}[59m")?; - }, - _ => {}, - } - }; + if self.ansi_underlines { + if let Some(ansi_code) = self.underline_color { + match ansi_code { + AnsiCode::RgbCode((r, g, b)) => { + write!(f, "\u{1b}[58;2;{};{};{}m", r, g, b)?; + }, + AnsiCode::ColorIndex(color_index) => { + write!(f, "\u{1b}[58;5;{}m", color_index)?; + }, + AnsiCode::Reset => { + write!(f, "\u{1b}[59m")?; + }, + _ => {}, + } + }; + } if let Some(ansi_code) = self.strike { match ansi_code { AnsiCode::On => { @@ -583,23 +586,23 @@ impl Display for CharacterStyles { // because the bold reset also resets underline, and would override it // otherwise if let Some(ansi_code) = self.underline { - match ansi_code { - AnsiCode::Underline => { + match (ansi_code, self.ansi_underlines) { + (AnsiCode::Underline, _) => { write!(f, "\u{1b}[4m")?; }, - AnsiCode::Double => { + (AnsiCode::Double, true) => { write!(f, "\u{1b}[4:2m")?; }, - AnsiCode::Undercurl => { + (AnsiCode::Undercurl, true) => { write!(f, "\u{1b}[4:3m")?; }, - AnsiCode::Underdotted => { + (AnsiCode::Underdotted, true) => { write!(f, "\u{1b}[4:4m")?; }, - AnsiCode::Underdashed => { + (AnsiCode::Underdashed, true) => { write!(f, "\u{1b}[4:5m")?; }, - AnsiCode::Reset => { + (AnsiCode::Reset, _) => { write!(f, "\u{1b}[24m")?; }, _ => {}, diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index d522a400fc..ce72755585 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -114,6 +114,7 @@ pub struct TerminalPane { // held on startup and can possibly be used to display some errors pane_frame_color_override: Option<(PaletteColor, Option)>, invoked_with: Option, + ansi_underlines: bool, } impl Pane for TerminalPane { @@ -768,6 +769,7 @@ impl TerminalPane { initial_pane_title: Option, invoked_with: Option, debug: bool, + ansi_underlines: bool, ) -> TerminalPane { let initial_pane_title = initial_pane_title.unwrap_or_else(|| format!("Pane #{}", pane_index)); @@ -780,6 +782,7 @@ impl TerminalPane { character_cell_size, sixel_image_store, debug, + ansi_underlines, ); TerminalPane { frame: HashMap::new(), @@ -804,6 +807,7 @@ impl TerminalPane { banner: None, pane_frame_color_override: None, invoked_with, + ansi_underlines, } } pub fn get_x(&self) -> usize { diff --git a/zellij-server/src/panes/unit/grid_tests.rs b/zellij-server/src/panes/unit/grid_tests.rs index 3b1864741a..fa11322d06 100644 --- a/zellij-server/src/panes/unit/grid_tests.rs +++ b/zellij-server/src/panes/unit/grid_tests.rs @@ -25,6 +25,7 @@ fn vttest1_0() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -34,6 +35,7 @@ fn vttest1_0() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest1-0"; let content = read_fixture(fixture_name); @@ -49,6 +51,7 @@ fn vttest1_1() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -58,6 +61,7 @@ fn vttest1_1() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest1-1"; let content = read_fixture(fixture_name); @@ -73,6 +77,7 @@ fn vttest1_2() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -82,6 +87,7 @@ fn vttest1_2() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest1-2"; let content = read_fixture(fixture_name); @@ -97,6 +103,7 @@ fn vttest1_3() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -106,6 +113,7 @@ fn vttest1_3() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest1-3"; let content = read_fixture(fixture_name); @@ -121,6 +129,7 @@ fn vttest1_4() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -130,6 +139,7 @@ fn vttest1_4() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest1-4"; let content = read_fixture(fixture_name); @@ -145,6 +155,7 @@ fn vttest1_5() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -154,6 +165,7 @@ fn vttest1_5() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest1-5"; let content = read_fixture(fixture_name); @@ -169,6 +181,7 @@ fn vttest2_0() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -178,6 +191,7 @@ fn vttest2_0() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-0"; let content = read_fixture(fixture_name); @@ -193,6 +207,7 @@ fn vttest2_1() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -202,6 +217,7 @@ fn vttest2_1() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-1"; let content = read_fixture(fixture_name); @@ -217,6 +233,7 @@ fn vttest2_2() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -226,6 +243,7 @@ fn vttest2_2() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-2"; let content = read_fixture(fixture_name); @@ -241,6 +259,7 @@ fn vttest2_3() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -250,6 +269,7 @@ fn vttest2_3() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-3"; let content = read_fixture(fixture_name); @@ -265,6 +285,7 @@ fn vttest2_4() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -274,6 +295,7 @@ fn vttest2_4() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-4"; let content = read_fixture(fixture_name); @@ -289,6 +311,7 @@ fn vttest2_5() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -298,6 +321,7 @@ fn vttest2_5() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-5"; let content = read_fixture(fixture_name); @@ -313,6 +337,7 @@ fn vttest2_6() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -322,6 +347,7 @@ fn vttest2_6() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-6"; let content = read_fixture(fixture_name); @@ -337,6 +363,7 @@ fn vttest2_7() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -346,6 +373,7 @@ fn vttest2_7() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-7"; let content = read_fixture(fixture_name); @@ -361,6 +389,7 @@ fn vttest2_8() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -370,6 +399,7 @@ fn vttest2_8() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-8"; let content = read_fixture(fixture_name); @@ -385,6 +415,7 @@ fn vttest2_9() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -394,6 +425,7 @@ fn vttest2_9() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-9"; let content = read_fixture(fixture_name); @@ -409,6 +441,7 @@ fn vttest2_10() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -418,6 +451,7 @@ fn vttest2_10() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-10"; let content = read_fixture(fixture_name); @@ -433,6 +467,7 @@ fn vttest2_11() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -442,6 +477,7 @@ fn vttest2_11() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-11"; let content = read_fixture(fixture_name); @@ -457,6 +493,7 @@ fn vttest2_12() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -466,6 +503,7 @@ fn vttest2_12() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-12"; let content = read_fixture(fixture_name); @@ -481,6 +519,7 @@ fn vttest2_13() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -490,6 +529,7 @@ fn vttest2_13() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-13"; let content = read_fixture(fixture_name); @@ -505,6 +545,7 @@ fn vttest2_14() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -514,6 +555,7 @@ fn vttest2_14() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest2-14"; let content = read_fixture(fixture_name); @@ -529,6 +571,7 @@ fn vttest3_0() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 41, 110, @@ -538,6 +581,7 @@ fn vttest3_0() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest3-0"; let content = read_fixture(fixture_name); @@ -553,6 +597,7 @@ fn vttest8_0() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -562,6 +607,7 @@ fn vttest8_0() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest8-0"; let content = read_fixture(fixture_name); @@ -577,6 +623,7 @@ fn vttest8_1() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -586,6 +633,7 @@ fn vttest8_1() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest8-1"; let content = read_fixture(fixture_name); @@ -601,6 +649,7 @@ fn vttest8_2() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -610,6 +659,7 @@ fn vttest8_2() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest8-2"; let content = read_fixture(fixture_name); @@ -625,6 +675,7 @@ fn vttest8_3() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -634,6 +685,7 @@ fn vttest8_3() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest8-3"; let content = read_fixture(fixture_name); @@ -649,6 +701,7 @@ fn vttest8_4() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -658,6 +711,7 @@ fn vttest8_4() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest8-4"; let content = read_fixture(fixture_name); @@ -673,6 +727,7 @@ fn vttest8_5() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -682,6 +737,7 @@ fn vttest8_5() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vttest8-5"; let content = read_fixture(fixture_name); @@ -697,6 +753,7 @@ fn csi_b() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -706,6 +763,7 @@ fn csi_b() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "csi-b"; let content = read_fixture(fixture_name); @@ -721,6 +779,7 @@ fn csi_capital_i() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -730,6 +789,7 @@ fn csi_capital_i() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "csi-capital-i"; let content = read_fixture(fixture_name); @@ -745,6 +805,7 @@ fn csi_capital_z() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -754,6 +815,7 @@ fn csi_capital_z() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "csi-capital-z"; let content = read_fixture(fixture_name); @@ -769,6 +831,7 @@ fn terminal_reports() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -778,6 +841,7 @@ fn terminal_reports() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "terminal_reports"; let content = read_fixture(fixture_name); @@ -793,6 +857,7 @@ fn wide_characters() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -802,6 +867,7 @@ fn wide_characters() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters"; let content = read_fixture(fixture_name); @@ -817,6 +883,7 @@ fn wide_characters_line_wrap() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -826,6 +893,7 @@ fn wide_characters_line_wrap() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters_line_wrap"; let content = read_fixture(fixture_name); @@ -841,6 +909,7 @@ fn insert_character_in_line_with_wide_character() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -850,6 +919,7 @@ fn insert_character_in_line_with_wide_character() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters_middle_line_insert"; let content = read_fixture(fixture_name); @@ -865,6 +935,7 @@ fn delete_char_in_middle_of_line_with_widechar() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -874,6 +945,7 @@ fn delete_char_in_middle_of_line_with_widechar() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide-chars-delete-middle"; let content = read_fixture(fixture_name); @@ -889,6 +961,7 @@ fn delete_char_in_middle_of_line_with_multiple_widechars() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -898,6 +971,7 @@ fn delete_char_in_middle_of_line_with_multiple_widechars() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide-chars-delete-middle-after-multi"; let content = read_fixture(fixture_name); @@ -913,6 +987,7 @@ fn fish_wide_characters_override_clock() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -922,6 +997,7 @@ fn fish_wide_characters_override_clock() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "fish_wide_characters_override_clock"; let content = read_fixture(fixture_name); @@ -937,6 +1013,7 @@ fn bash_delete_wide_characters() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -946,6 +1023,7 @@ fn bash_delete_wide_characters() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "bash_delete_wide_characters"; let content = read_fixture(fixture_name); @@ -961,6 +1039,7 @@ fn delete_wide_characters_before_cursor() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -970,6 +1049,7 @@ fn delete_wide_characters_before_cursor() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "delete_wide_characters_before_cursor"; let content = read_fixture(fixture_name); @@ -985,6 +1065,7 @@ fn delete_wide_characters_before_cursor_when_cursor_is_on_wide_character() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -994,6 +1075,7 @@ fn delete_wide_characters_before_cursor_when_cursor_is_on_wide_character() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "delete_wide_characters_before_cursor_when_cursor_is_on_wide_character"; let content = read_fixture(fixture_name); @@ -1009,6 +1091,7 @@ fn delete_wide_character_under_cursor() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -1018,6 +1101,7 @@ fn delete_wide_character_under_cursor() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "delete_wide_character_under_cursor"; let content = read_fixture(fixture_name); @@ -1033,6 +1117,7 @@ fn replace_wide_character_under_cursor() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 104, @@ -1042,6 +1127,7 @@ fn replace_wide_character_under_cursor() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "replace_wide_character_under_cursor"; let content = read_fixture(fixture_name); @@ -1057,6 +1143,7 @@ fn wrap_wide_characters() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 90, @@ -1066,6 +1153,7 @@ fn wrap_wide_characters() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters_full"; let content = read_fixture(fixture_name); @@ -1081,6 +1169,7 @@ fn wrap_wide_characters_on_size_change() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 93, @@ -1090,6 +1179,7 @@ fn wrap_wide_characters_on_size_change() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters_full"; let content = read_fixture(fixture_name); @@ -1106,6 +1196,7 @@ fn unwrap_wide_characters_on_size_change() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 93, @@ -1115,6 +1206,7 @@ fn unwrap_wide_characters_on_size_change() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters_full"; let content = read_fixture(fixture_name); @@ -1132,6 +1224,7 @@ fn wrap_wide_characters_in_the_middle_of_the_line() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 91, @@ -1141,6 +1234,7 @@ fn wrap_wide_characters_in_the_middle_of_the_line() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters_line_middle"; let content = read_fixture(fixture_name); @@ -1156,6 +1250,7 @@ fn wrap_wide_characters_at_the_end_of_the_line() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 90, @@ -1165,6 +1260,7 @@ fn wrap_wide_characters_at_the_end_of_the_line() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "wide_characters_line_end"; let content = read_fixture(fixture_name); @@ -1180,6 +1276,7 @@ fn copy_selected_text_from_viewport() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 27, 125, @@ -1189,6 +1286,7 @@ fn copy_selected_text_from_viewport() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "grid_copy"; let content = read_fixture(fixture_name); @@ -1212,6 +1310,7 @@ fn copy_wrapped_selected_text_from_viewport() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 22, 73, @@ -1221,6 +1320,7 @@ fn copy_wrapped_selected_text_from_viewport() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "grid_copy_wrapped"; let content = read_fixture(fixture_name); @@ -1243,6 +1343,7 @@ fn copy_selected_text_from_lines_above() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 27, 125, @@ -1252,6 +1353,7 @@ fn copy_selected_text_from_lines_above() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "grid_copy"; let content = read_fixture(fixture_name); @@ -1275,6 +1377,7 @@ fn copy_selected_text_from_lines_below() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 27, 125, @@ -1284,6 +1387,7 @@ fn copy_selected_text_from_lines_below() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "grid_copy"; let content = read_fixture(fixture_name); @@ -1315,6 +1419,7 @@ fn run_bandwhich_from_fish_shell() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1324,6 +1429,7 @@ fn run_bandwhich_from_fish_shell() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "fish_and_bandwhich"; let content = read_fixture(fixture_name); @@ -1339,6 +1445,7 @@ fn fish_tab_completion_options() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1348,6 +1455,7 @@ fn fish_tab_completion_options() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "fish_tab_completion_options"; let content = read_fixture(fixture_name); @@ -1369,6 +1477,7 @@ pub fn fish_select_tab_completion_options() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1378,6 +1487,7 @@ pub fn fish_select_tab_completion_options() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "fish_select_tab_completion_options"; let content = read_fixture(fixture_name); @@ -1403,6 +1513,7 @@ pub fn vim_scroll_region_down() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1412,6 +1523,7 @@ pub fn vim_scroll_region_down() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vim_scroll_region_down"; let content = read_fixture(fixture_name); @@ -1434,6 +1546,7 @@ pub fn vim_ctrl_d() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1443,6 +1556,7 @@ pub fn vim_ctrl_d() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vim_ctrl_d"; let content = read_fixture(fixture_name); @@ -1464,6 +1578,7 @@ pub fn vim_ctrl_u() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1473,6 +1588,7 @@ pub fn vim_ctrl_u() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vim_ctrl_u"; let content = read_fixture(fixture_name); @@ -1488,6 +1604,7 @@ pub fn htop() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1497,6 +1614,7 @@ pub fn htop() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "htop"; let content = read_fixture(fixture_name); @@ -1512,6 +1630,7 @@ pub fn htop_scrolling() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1521,6 +1640,7 @@ pub fn htop_scrolling() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "htop_scrolling"; let content = read_fixture(fixture_name); @@ -1536,6 +1656,7 @@ pub fn htop_right_scrolling() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1545,6 +1666,7 @@ pub fn htop_right_scrolling() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "htop_right_scrolling"; let content = read_fixture(fixture_name); @@ -1570,6 +1692,7 @@ pub fn vim_overwrite() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1579,6 +1702,7 @@ pub fn vim_overwrite() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "vim_overwrite"; let content = read_fixture(fixture_name); @@ -1596,6 +1720,7 @@ pub fn clear_scroll_region() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1605,6 +1730,7 @@ pub fn clear_scroll_region() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "clear_scroll_region"; let content = read_fixture(fixture_name); @@ -1620,6 +1746,7 @@ pub fn display_tab_characters_properly() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1629,6 +1756,7 @@ pub fn display_tab_characters_properly() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "tab_characters"; let content = read_fixture(fixture_name); @@ -1644,6 +1772,7 @@ pub fn neovim_insert_mode() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1653,6 +1782,7 @@ pub fn neovim_insert_mode() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "nvim_insert"; let content = read_fixture(fixture_name); @@ -1668,6 +1798,7 @@ pub fn bash_cursor_linewrap() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 116, @@ -1677,6 +1808,7 @@ pub fn bash_cursor_linewrap() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "bash_cursor_linewrap"; let content = read_fixture(fixture_name); @@ -1694,6 +1826,7 @@ pub fn fish_paste_multiline() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 149, @@ -1703,6 +1836,7 @@ pub fn fish_paste_multiline() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "fish_paste_multiline"; let content = read_fixture(fixture_name); @@ -1718,6 +1852,7 @@ pub fn git_log() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 149, @@ -1727,6 +1862,7 @@ pub fn git_log() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "git_log"; let content = read_fixture(fixture_name); @@ -1744,6 +1880,7 @@ pub fn git_diff_scrollup() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 28, 149, @@ -1753,6 +1890,7 @@ pub fn git_diff_scrollup() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "git_diff_scrollup"; let content = read_fixture(fixture_name); @@ -1768,6 +1906,7 @@ pub fn emacs_longbuf() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 60, 284, @@ -1777,6 +1916,7 @@ pub fn emacs_longbuf() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "emacs_longbuf_tutorial"; let content = read_fixture(fixture_name); @@ -1792,6 +1932,7 @@ pub fn top_and_quit() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 56, 235, @@ -1801,6 +1942,7 @@ pub fn top_and_quit() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "top_and_quit"; let content = read_fixture(fixture_name); @@ -1823,6 +1965,7 @@ pub fn exa_plus_omf_theme() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 56, 235, @@ -1832,6 +1975,7 @@ pub fn exa_plus_omf_theme() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "exa_plus_omf_theme"; let content = read_fixture(fixture_name); @@ -1847,6 +1991,7 @@ pub fn scroll_up() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 10, 50, @@ -1856,6 +2001,7 @@ pub fn scroll_up() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scrolling"; let content = read_fixture(fixture_name); @@ -1872,6 +2018,7 @@ pub fn scroll_down() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 10, 50, @@ -1881,6 +2028,7 @@ pub fn scroll_down() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scrolling"; let content = read_fixture(fixture_name); @@ -1898,6 +2046,7 @@ pub fn scroll_up_with_line_wraps() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 10, 25, @@ -1907,6 +2056,7 @@ pub fn scroll_up_with_line_wraps() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scrolling"; let content = read_fixture(fixture_name); @@ -1923,6 +2073,7 @@ pub fn scroll_down_with_line_wraps() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 10, 25, @@ -1932,6 +2083,7 @@ pub fn scroll_down_with_line_wraps() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scrolling"; let content = read_fixture(fixture_name); @@ -1949,6 +2101,7 @@ pub fn scroll_up_decrease_width_and_scroll_down() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 10, 50, @@ -1958,6 +2111,7 @@ pub fn scroll_up_decrease_width_and_scroll_down() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scrolling"; let content = read_fixture(fixture_name); @@ -1980,6 +2134,7 @@ pub fn scroll_up_increase_width_and_scroll_down() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 10, 25, @@ -1989,6 +2144,7 @@ pub fn scroll_up_increase_width_and_scroll_down() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scrolling"; let content = read_fixture(fixture_name); @@ -2011,6 +2167,7 @@ pub fn move_cursor_below_scroll_region() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 34, 114, @@ -2020,6 +2177,7 @@ pub fn move_cursor_below_scroll_region() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "move_cursor_below_scroll_region"; let content = read_fixture(fixture_name); @@ -2035,6 +2193,7 @@ pub fn insert_wide_characters_in_existing_line() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 21, 86, @@ -2044,6 +2203,7 @@ pub fn insert_wide_characters_in_existing_line() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "chinese_characters_line_middle"; let content = read_fixture(fixture_name); @@ -2065,6 +2225,7 @@ pub fn full_screen_scroll_region_and_scroll_up() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 54, 80, @@ -2074,6 +2235,7 @@ pub fn full_screen_scroll_region_and_scroll_up() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scroll_region_full_screen"; let content = read_fixture(fixture_name); @@ -2092,6 +2254,7 @@ pub fn ring_bell() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 134, 64, @@ -2101,6 +2264,7 @@ pub fn ring_bell() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "ring_bell"; let content = read_fixture(fixture_name); @@ -2116,6 +2280,7 @@ pub fn alternate_screen_change_size() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 20, 20, @@ -2125,6 +2290,7 @@ pub fn alternate_screen_change_size() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "alternate_screen_change_size"; let content = read_fixture(fixture_name); @@ -2144,6 +2310,7 @@ pub fn fzf_fullscreen() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2153,6 +2320,7 @@ pub fn fzf_fullscreen() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "fzf_fullscreen"; let content = read_fixture(fixture_name); @@ -2172,6 +2340,7 @@ pub fn replace_multiple_wide_characters_under_cursor() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2181,6 +2350,7 @@ pub fn replace_multiple_wide_characters_under_cursor() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "replace_multiple_wide_characters"; let content = read_fixture(fixture_name); @@ -2200,6 +2370,7 @@ pub fn replace_non_wide_characters_with_wide_characters() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2209,6 +2380,7 @@ pub fn replace_non_wide_characters_with_wide_characters() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "replace_non_wide_characters_with_wide_characters"; let content = read_fixture(fixture_name); @@ -2224,6 +2396,7 @@ pub fn scroll_down_ansi() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2233,6 +2406,7 @@ pub fn scroll_down_ansi() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "scroll_down"; let content = read_fixture(fixture_name); @@ -2248,6 +2422,7 @@ pub fn ansi_capital_t() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2257,6 +2432,7 @@ pub fn ansi_capital_t() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let content = "foo\u{1b}[14Tbar".as_bytes(); for byte in content { @@ -2271,6 +2447,7 @@ pub fn ansi_capital_s() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2280,6 +2457,7 @@ pub fn ansi_capital_s() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); 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 { @@ -2294,6 +2472,7 @@ fn terminal_pixel_size_reports() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -2306,6 +2485,7 @@ fn terminal_pixel_size_reports() { }))), sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "terminal_pixel_size_reports"; let content = read_fixture(fixture_name); @@ -2327,6 +2507,7 @@ fn terminal_pixel_size_reports_in_unsupported_terminals() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -2336,6 +2517,7 @@ fn terminal_pixel_size_reports_in_unsupported_terminals() { Rc::new(RefCell::new(None)), // in an unsupported terminal, we don't have this info sixel_image_store, debug, + ansi_underlines, ); let fixture_name = "terminal_pixel_size_reports"; let content = read_fixture(fixture_name); @@ -2358,6 +2540,7 @@ pub fn ansi_csi_at_sign() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2367,6 +2550,7 @@ pub fn ansi_csi_at_sign() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let content = "foo\u{1b}[2D\u{1b}[2@".as_bytes(); for byte in content { @@ -2385,6 +2569,7 @@ pub fn sixel_images_are_reaped_when_scrolled_off() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2394,6 +2579,7 @@ pub fn sixel_images_are_reaped_when_scrolled_off() { character_cell_size, sixel_image_store.clone(), debug, + ansi_underlines, ); let pane_content = read_fixture("sixel-image-500px.six"); for byte in pane_content { @@ -2421,6 +2607,7 @@ pub fn sixel_images_are_reaped_when_resetting() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 112, @@ -2430,6 +2617,7 @@ pub fn sixel_images_are_reaped_when_resetting() { character_cell_size, sixel_image_store.clone(), debug, + ansi_underlines, ); let pane_content = read_fixture("sixel-image-500px.six"); for byte in pane_content { @@ -2454,6 +2642,7 @@ pub fn sixel_image_in_alternate_buffer() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 30, 112, @@ -2463,6 +2652,7 @@ pub fn sixel_image_in_alternate_buffer() { character_cell_size, sixel_image_store.clone(), debug, + ansi_underlines, ); let move_to_alternate_screen = "\u{1b}[?1049h"; @@ -2498,6 +2688,7 @@ pub fn sixel_with_image_scrolling_decsdm() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 30, 112, @@ -2507,6 +2698,7 @@ pub fn sixel_with_image_scrolling_decsdm() { character_cell_size, sixel_image_store, debug, + ansi_underlines, ); // enter DECSDM @@ -2561,6 +2753,7 @@ pub fn osc_4_background_query() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -2570,6 +2763,7 @@ pub fn osc_4_background_query() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let content = "\u{1b}]10;?\u{1b}\\"; for byte in content.as_bytes() { @@ -2592,6 +2786,7 @@ pub fn osc_4_foreground_query() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -2601,6 +2796,7 @@ pub fn osc_4_foreground_query() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let content = "\u{1b}]11;?\u{1b}\\"; for byte in content.as_bytes() { @@ -2625,6 +2821,7 @@ pub fn osc_4_color_query() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(color_codes)); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -2634,6 +2831,7 @@ pub fn osc_4_color_query() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let content = "\u{1b}]4;222;?\u{1b}\\"; for byte in content.as_bytes() { @@ -2656,6 +2854,7 @@ pub fn xtsmgraphics_color_register_count() { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -2665,6 +2864,7 @@ pub fn xtsmgraphics_color_register_count() { Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let content = "\u{1b}[?1;1;S\u{1b}\\"; for byte in content.as_bytes() { @@ -2691,6 +2891,7 @@ pub fn xtsmgraphics_pixel_graphics_geometry() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 51, 97, @@ -2700,6 +2901,7 @@ pub fn xtsmgraphics_pixel_graphics_geometry() { character_cell_size, sixel_image_store, debug, + ansi_underlines, ); let content = "\u{1b}[?2;1;S\u{1b}\\"; for byte in content.as_bytes() { @@ -2726,6 +2928,7 @@ pub fn cursor_hide_persists_through_alternate_screen() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( 30, 112, @@ -2735,6 +2938,7 @@ pub fn cursor_hide_persists_through_alternate_screen() { character_cell_size, sixel_image_store, debug, + ansi_underlines, ); let hide_cursor = "\u{1b}[?25l"; diff --git a/zellij-server/src/panes/unit/search_in_pane_tests.rs b/zellij-server/src/panes/unit/search_in_pane_tests.rs index 346eb40b18..c2dae3c4c8 100644 --- a/zellij-server/src/panes/unit/search_in_pane_tests.rs +++ b/zellij-server/src/panes/unit/search_in_pane_tests.rs @@ -29,6 +29,7 @@ fn create_pane() -> TerminalPane { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -43,6 +44,7 @@ fn create_pane() -> TerminalPane { None, None, debug, + ansi_underlines, ); // 0 is the pane index let content = read_fixture(); terminal_pane.handle_pty_bytes(content); diff --git a/zellij-server/src/panes/unit/terminal_pane_tests.rs b/zellij-server/src/panes/unit/terminal_pane_tests.rs index 8b0a6c411a..a5dceaa0a6 100644 --- a/zellij-server/src/panes/unit/terminal_pane_tests.rs +++ b/zellij-server/src/panes/unit/terminal_pane_tests.rs @@ -37,6 +37,7 @@ pub fn scrolling_inside_a_pane() { let terminal_emulator_colors = Rc::new(RefCell::new(Palette::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -51,6 +52,7 @@ pub fn scrolling_inside_a_pane() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let mut text_to_fill_pane = String::new(); for i in 0..30 { @@ -81,6 +83,7 @@ pub fn sixel_image_inside_terminal_pane() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -95,6 +98,7 @@ pub fn sixel_image_inside_terminal_pane() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let sixel_image_bytes = "\u{1b}Pq #0;2;0;0;0#1;2;100;100;0#2;2;0;100;0 @@ -125,6 +129,7 @@ pub fn partial_sixel_image_inside_terminal_pane() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -139,6 +144,7 @@ pub fn partial_sixel_image_inside_terminal_pane() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let pane_content = read_fixture("sixel-image-500px.six"); terminal_pane.handle_pty_bytes(pane_content); @@ -163,6 +169,7 @@ pub fn overflowing_sixel_image_inside_terminal_pane() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -177,6 +184,7 @@ pub fn overflowing_sixel_image_inside_terminal_pane() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let pane_content = read_fixture("sixel-image-500px.six"); terminal_pane.handle_pty_bytes(pane_content); @@ -200,6 +208,7 @@ pub fn scrolling_through_a_sixel_image() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -214,6 +223,7 @@ pub fn scrolling_through_a_sixel_image() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let mut text_to_fill_pane = String::new(); for i in 0..30 { @@ -248,6 +258,7 @@ pub fn multiple_sixel_images_in_pane() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -262,6 +273,7 @@ pub fn multiple_sixel_images_in_pane() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let mut text_to_fill_pane = String::new(); for i in 0..5 { @@ -294,6 +306,7 @@ pub fn resizing_pane_with_sixel_images() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -308,6 +321,7 @@ pub fn resizing_pane_with_sixel_images() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let mut text_to_fill_pane = String::new(); for i in 0..5 { @@ -343,6 +357,7 @@ pub fn changing_character_cell_size_with_sixel_images() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -357,6 +372,7 @@ pub fn changing_character_cell_size_with_sixel_images() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let mut text_to_fill_pane = String::new(); for i in 0..5 { @@ -397,6 +413,7 @@ pub fn keep_working_after_corrupted_sixel_image() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -411,6 +428,7 @@ pub fn keep_working_after_corrupted_sixel_image() { None, None, debug, + ansi_underlines, ); // 0 is the pane index let sixel_image_bytes = "\u{1b}PI AM CORRUPTED BWAHAHAq @@ -449,6 +467,7 @@ pub fn pane_with_frame_position_is_on_frame() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -463,6 +482,7 @@ pub fn pane_with_frame_position_is_on_frame() { None, None, debug, + ansi_underlines, ); // 0 is the pane index terminal_pane.set_content_offset(Offset::frame(1)); @@ -537,6 +557,7 @@ pub fn pane_with_bottom_and_right_borders_position_is_on_frame() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -551,6 +572,7 @@ pub fn pane_with_bottom_and_right_borders_position_is_on_frame() { None, None, debug, + ansi_underlines, ); // 0 is the pane index terminal_pane.set_content_offset(Offset::shift(1, 1)); @@ -625,6 +647,7 @@ pub fn frameless_pane_position_is_on_frame() { height: 21, }))); let debug = false; + let ansi_underlines = true; let mut terminal_pane = TerminalPane::new( pid, fake_win_size, @@ -639,6 +662,7 @@ pub fn frameless_pane_position_is_on_frame() { None, None, debug, + ansi_underlines, ); // 0 is the pane index terminal_pane.set_content_offset(Offset::default()); diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 5cf1938562..61cd7d657c 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -533,8 +533,8 @@ pub(crate) struct Screen { copy_options: CopyOptions, debug: bool, session_name: String, - session_infos_on_machine: BTreeMap, // String is the session name, can - // also be this session + session_infos_on_machine: BTreeMap, // String is the session name, can also be this session + ansi_underlines: bool, } impl Screen { @@ -549,6 +549,7 @@ impl Screen { session_is_mirrored: bool, copy_options: CopyOptions, debug: bool, + ansi_underlines: bool, ) -> Self { let session_name = mode_info.session_name.clone().unwrap_or_default(); let session_info = SessionInfo::new(session_name.clone()); @@ -578,6 +579,7 @@ impl Screen { debug, session_name, session_infos_on_machine, + ansi_underlines, } } @@ -1115,6 +1117,7 @@ impl Screen { self.terminal_emulator_color_codes.clone(), swap_layouts, self.debug, + self.ansi_underlines, ); self.tabs.insert(tab_index, tab); Ok(()) @@ -1850,6 +1853,7 @@ pub(crate) fn screen_thread_main( config_options.copy_clipboard.unwrap_or_default(), config_options.copy_on_select.unwrap_or(true), ); + let ansi_underlines = config_options.ansi_underlines.unwrap_or(true); let thread_senders = bus.senders.clone(); let mut screen = Screen::new( @@ -1868,6 +1872,7 @@ pub(crate) fn screen_thread_main( session_is_mirrored, copy_options, debug, + ansi_underlines, ); let mut pending_tab_ids: HashSet = HashSet::new(); diff --git a/zellij-server/src/tab/layout_applier.rs b/zellij-server/src/tab/layout_applier.rs index ed3cdef1a0..56dfcb78f9 100644 --- a/zellij-server/src/tab/layout_applier.rs +++ b/zellij-server/src/tab/layout_applier.rs @@ -41,6 +41,7 @@ pub struct LayoutApplier<'a> { focus_pane_id: &'a mut Option, os_api: Box, debug: bool, + ansi_underlines: bool, } impl<'a> LayoutApplier<'a> { @@ -61,6 +62,7 @@ impl<'a> LayoutApplier<'a> { focus_pane_id: &'a mut Option, os_api: &Box, debug: bool, + ansi_underlines: bool, ) -> Self { let viewport = viewport.clone(); let senders = senders.clone(); @@ -90,6 +92,7 @@ impl<'a> LayoutApplier<'a> { focus_pane_id, os_api, debug, + ansi_underlines, } } pub fn apply_layout( @@ -254,6 +257,7 @@ impl<'a> LayoutApplier<'a> { self.style, layout.run.clone(), self.debug, + self.ansi_underlines, ); new_plugin.set_borderless(layout.borderless); if let Some(exclude_from_sync) = layout.exclude_from_sync { @@ -285,6 +289,7 @@ impl<'a> LayoutApplier<'a> { initial_title, layout.run.clone(), self.debug, + self.ansi_underlines, ); new_pane.set_borderless(layout.borderless); if let Some(exclude_from_sync) = layout.exclude_from_sync { @@ -370,6 +375,7 @@ impl<'a> LayoutApplier<'a> { self.style, floating_pane_layout.run.clone(), self.debug, + self.ansi_underlines, ); new_pane.set_borderless(false); new_pane.set_content_offset(Offset::frame(1)); @@ -405,6 +411,7 @@ impl<'a> LayoutApplier<'a> { initial_title, floating_pane_layout.run.clone(), self.debug, + self.ansi_underlines, ); new_pane.set_borderless(false); new_pane.set_content_offset(Offset::frame(1)); diff --git a/zellij-server/src/tab/mod.rs b/zellij-server/src/tab/mod.rs index 9483a94bf5..af5308c014 100644 --- a/zellij-server/src/tab/mod.rs +++ b/zellij-server/src/tab/mod.rs @@ -183,6 +183,7 @@ pub(crate) struct Tab { // pending and need to be re-applied swap_layouts: SwapLayouts, debug: bool, + ansi_underlines: bool, } #[derive(Clone, Debug, Default, Serialize, Deserialize)] @@ -525,6 +526,7 @@ impl Tab { terminal_emulator_color_codes: Rc>>, swap_layouts: (Vec, Vec), debug: bool, + ansi_underlines: bool, ) -> Self { let name = if name.is_empty() { format!("Tab #{}", index + 1) @@ -612,6 +614,7 @@ impl Tab { pending_instructions: vec![], swap_layouts, debug, + ansi_underlines, } } @@ -643,6 +646,7 @@ impl Tab { &mut self.focus_pane_id, &self.os_api, self.debug, + self.ansi_underlines, ) .apply_layout( layout, @@ -703,6 +707,7 @@ impl Tab { &mut self.focus_pane_id, &self.os_api, self.debug, + self.ansi_underlines, ) .apply_floating_panes_layout_to_existing_panes( &layout_candidate, @@ -757,6 +762,7 @@ impl Tab { &mut self.focus_pane_id, &self.os_api, self.debug, + self.ansi_underlines, ) .apply_tiled_panes_layout_to_existing_panes( &layout_candidate, @@ -1043,6 +1049,7 @@ impl Tab { initial_pane_title, None, self.debug, + self.ansi_underlines, )) as Box }, PaneId::Plugin(plugin_pid) => { @@ -1065,6 +1072,7 @@ impl Tab { self.style, run_plugin, self.debug, + self.ansi_underlines, )) as Box }, }; @@ -1097,6 +1105,7 @@ impl Tab { None, None, self.debug, + self.ansi_underlines, ); new_pane.update_name("EDITING SCROLLBACK"); // we do this here and not in the // constructor so it won't be overrided @@ -1173,6 +1182,7 @@ impl Tab { initial_pane_title, None, self.debug, + self.ansi_underlines, ); self.tiled_panes .split_pane_horizontally(pid, Box::new(new_terminal), client_id); @@ -1230,6 +1240,7 @@ impl Tab { initial_pane_title, None, self.debug, + self.ansi_underlines, ); self.tiled_panes .split_pane_vertically(pid, Box::new(new_terminal), client_id); diff --git a/zellij-server/src/tab/unit/tab_integration_tests.rs b/zellij-server/src/tab/unit/tab_integration_tests.rs index 56dff4d72b..c49fa5fe5a 100644 --- a/zellij-server/src/tab/unit/tab_integration_tests.rs +++ b/zellij-server/src/tab/unit/tab_integration_tests.rs @@ -224,6 +224,7 @@ fn create_new_tab(size: Size, default_mode: ModeInfo) -> Tab { let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -246,6 +247,7 @@ fn create_new_tab(size: Size, default_mode: ModeInfo) -> Tab { terminal_emulator_color_codes, (vec![], vec![]), debug, + ansi_underlines, ); tab.apply_layout( TiledPaneLayout::default(), @@ -296,6 +298,7 @@ fn create_new_tab_with_swap_layouts( let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -318,6 +321,7 @@ fn create_new_tab_with_swap_layouts( terminal_emulator_color_codes, swap_layouts, debug, + ansi_underlines, ); let ( base_layout, @@ -370,6 +374,7 @@ fn create_new_tab_with_os_api( let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -392,6 +397,7 @@ fn create_new_tab_with_os_api( terminal_emulator_color_codes, (vec![], vec![]), // swap layouts debug, + ansi_underlines, ); tab.apply_layout( TiledPaneLayout::default(), @@ -430,6 +436,7 @@ fn create_new_tab_with_layout(size: Size, default_mode: ModeInfo, layout: &str) let layout = Layout::from_str(layout, "layout_file_name".into(), None, None).unwrap(); let (tab_layout, floating_panes_layout) = layout.new_tab(); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -452,6 +459,7 @@ fn create_new_tab_with_layout(size: Size, default_mode: ModeInfo, layout: &str) terminal_emulator_color_codes, (vec![], vec![]), // swap layouts debug, + ansi_underlines, ); let pane_ids = tab_layout .extract_run_instructions() @@ -504,6 +512,7 @@ fn create_new_tab_with_mock_pty_writer( let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -526,6 +535,7 @@ fn create_new_tab_with_mock_pty_writer( terminal_emulator_color_codes, (vec![], vec![]), // swap layouts debug, + ansi_underlines, ); tab.apply_layout( TiledPaneLayout::default(), @@ -569,6 +579,7 @@ fn create_new_tab_with_sixel_support( let copy_options = CopyOptions::default(); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -591,6 +602,7 @@ fn create_new_tab_with_sixel_support( terminal_emulator_color_codes, (vec![], vec![]), // swap layouts debug, + ansi_underlines, ); tab.apply_layout( TiledPaneLayout::default(), @@ -627,6 +639,7 @@ fn take_snapshot(ansi_instructions: &str, rows: usize, columns: usize, palette: height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( rows, columns, @@ -636,6 +649,7 @@ fn take_snapshot(ansi_instructions: &str, rows: usize, columns: usize, palette: character_cell_size, sixel_image_store, debug, + ansi_underlines, ); let mut vte_parser = vte::Parser::new(); for &byte in ansi_instructions.as_bytes() { @@ -657,6 +671,7 @@ fn take_snapshot_with_sixel( height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( rows, columns, @@ -666,6 +681,7 @@ fn take_snapshot_with_sixel( character_cell_size, sixel_image_store, debug, + ansi_underlines, ); let mut vte_parser = vte::Parser::new(); for &byte in ansi_instructions.as_bytes() { @@ -684,6 +700,7 @@ fn take_snapshot_and_cursor_position( let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( rows, columns, @@ -693,6 +710,7 @@ fn take_snapshot_and_cursor_position( Rc::new(RefCell::new(None)), sixel_image_store, debug, + ansi_underlines, ); let mut vte_parser = vte::Parser::new(); for &byte in ansi_instructions.as_bytes() { diff --git a/zellij-server/src/tab/unit/tab_tests.rs b/zellij-server/src/tab/unit/tab_tests.rs index 195dbb8831..8bcde32a19 100644 --- a/zellij-server/src/tab/unit/tab_tests.rs +++ b/zellij-server/src/tab/unit/tab_tests.rs @@ -165,6 +165,7 @@ fn create_new_tab(size: Size) -> Tab { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -187,6 +188,7 @@ fn create_new_tab(size: Size) -> Tab { terminal_emulator_color_codes, (vec![], vec![]), // swap layouts debug, + ansi_underlines, ); tab.apply_layout( TiledPaneLayout::default(), @@ -222,6 +224,7 @@ fn create_new_tab_with_layout(size: Size, layout: TiledPaneLayout) -> Tab { let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -244,6 +247,7 @@ fn create_new_tab_with_layout(size: Size, layout: TiledPaneLayout) -> Tab { terminal_emulator_color_codes, (vec![], vec![]), // swap layouts debug, + ansi_underlines, ); let mut new_terminal_ids = vec![]; for i in 0..layout.extract_run_instructions().len() { @@ -285,6 +289,7 @@ fn create_new_tab_with_cell_size( let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); let debug = false; + let ansi_underlines = true; let mut tab = Tab::new( index, position, @@ -307,6 +312,7 @@ fn create_new_tab_with_cell_size( terminal_emulator_color_codes, (vec![], vec![]), // swap layouts debug, + ansi_underlines, ); tab.apply_layout( TiledPaneLayout::default(), diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs index beaa19cda5..fbc33e1515 100644 --- a/zellij-server/src/unit/screen_tests.rs +++ b/zellij-server/src/unit/screen_tests.rs @@ -67,6 +67,7 @@ fn take_snapshots_and_cursor_coordinates_from_render_events<'a>( height: 21, }))); let debug = false; + let ansi_underlines = true; let mut grid = Grid::new( screen_size.rows, screen_size.cols, @@ -76,6 +77,7 @@ fn take_snapshots_and_cursor_coordinates_from_render_events<'a>( character_cell_size, sixel_image_store, debug, + ansi_underlines, ); let snapshots: Vec<(Option<(usize, usize)>, String)> = all_events .filter_map(|server_instruction| { @@ -235,6 +237,7 @@ fn create_new_screen(size: Size) -> Screen { let copy_options = CopyOptions::default(); let debug = false; + let ansi_underlines = true; let screen = Screen::new( bus, &client_attributes, @@ -245,6 +248,7 @@ fn create_new_screen(size: Size) -> Screen { session_is_mirrored, copy_options, debug, + ansi_underlines, ); screen } diff --git a/zellij-utils/src/input/options.rs b/zellij-utils/src/input/options.rs index 68ef49e0f2..cd001b688c 100644 --- a/zellij-utils/src/input/options.rs +++ b/zellij-utils/src/input/options.rs @@ -124,6 +124,11 @@ pub struct Options { #[clap(long, value_parser)] #[serde(default)] pub auto_layout: Option, + + /// Whether to use ANSI styled underlines + #[clap(long, value_parser)] + #[serde(default)] + pub ansi_underlines: Option, } #[derive(ArgEnum, Deserialize, Serialize, Debug, Clone, Copy, PartialEq)] @@ -187,6 +192,7 @@ impl Options { let attach_to_session = other .attach_to_session .or_else(|| self.attach_to_session.clone()); + let ansi_underlines = other.ansi_underlines.or(self.ansi_underlines); Options { simplified_ui, @@ -209,6 +215,7 @@ impl Options { session_name, attach_to_session, auto_layout, + ansi_underlines, } } @@ -252,6 +259,7 @@ impl Options { let attach_to_session = other .attach_to_session .or_else(|| self.attach_to_session.clone()); + let ansi_underlines = other.ansi_underlines.or(self.ansi_underlines); Options { simplified_ui, @@ -274,6 +282,7 @@ impl Options { session_name, attach_to_session, auto_layout, + ansi_underlines, } } diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs index a7573af55a..12d3ba1aa6 100644 --- a/zellij-utils/src/kdl/mod.rs +++ b/zellij-utils/src/kdl/mod.rs @@ -1414,6 +1414,9 @@ impl Options { let attach_to_session = kdl_property_first_arg_as_bool_or_error!(kdl_options, "attach_to_session") .map(|(v, _)| v); + let ansi_underlines = + kdl_property_first_arg_as_bool_or_error!(kdl_options, "ansi_underlines") + .map(|(v, _)| v); Ok(Options { simplified_ui, theme, @@ -1435,6 +1438,7 @@ impl Options { session_name, attach_to_session, auto_layout, + ansi_underlines, }) } }