diff options
| author | Karl Bunch <karlbunch@users.noreply.github.com> | 2026-03-04 08:26:26 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-04 14:26:26 +0100 |
| commit | f77cdec298576164f34baf0456e4b986bde269e6 (patch) | |
| tree | af9fb93cfc6edf465378952c0aff38d48820e142 | |
| parent | docs(changelog): native Windows support (!!) (diff) | |
| download | sl0ppij-f77cdec298576164f34baf0456e4b986bde269e6.tar.gz sl0ppij-f77cdec298576164f34baf0456e4b986bde269e6.tar.xz sl0ppij-f77cdec298576164f34baf0456e4b986bde269e6.zip | |
feat: add per-pane default foreground/background color support (#4737)
* feat: add per-pane default foreground/background color support
Add per-pane default foreground and background colors, configurable
through four surfaces:
- OSC 10/11 escape sequences (set/query) and OSC 110/111 (reset)
- CLI action: zellij action set-pane-color --pane-id <id> --fg/--bg
- Layout config: default_fg/default_bg properties on pane nodes
- Plugin API: set_pane_color() SDK function and PaneInfo read-side
Colors are applied at render time as a fallback when cells have no
explicit foreground/background, without mutating stored grid data.
Closes #4712
* refactor: address review feedback for pane color support
- Extract adjust_styles_for_custom_bg_fg in output/mod.rs
- Move color parsing (xparse_color) from tab into Grid
- Move color serialization (ansi_code_to_color_string) into Grid
- Pane trait now uses Option<String> for color getters/setters
- Add colors to session serialization (dump-layout)
- Add default_fg/default_bg to protobuf IPC schema to fix
layout-in-session color loss
- Update example layout with tab-bar and status-bar
* fix stack overflow and ordering
* rustfmt
* update e2e snapshots
---------
Co-authored-by: Karl Bunch <karl@karlbunch.com>
Co-authored-by: Aram Drevekenin <aram@poor.dev>
84 files changed, 1825 insertions, 163 deletions
diff --git a/docs/MANPAGE.md b/docs/MANPAGE.md index 50c37d80..404f4fff 100644 --- a/docs/MANPAGE.md +++ b/docs/MANPAGE.md @@ -88,6 +88,8 @@ Each node has following fields: * __plugin: /path/to/plugin.wasm__ - optional path to a compiled Zellij plugin. If indicated loads a plugin into the created space. For more information see PLUGINS section. +* __default_fg: \<color\>__ - set the default foreground color for a pane (e.g. `"#00e000"`). +* __default_bg: \<color\>__ - set the default background color for a pane (e.g. `"#001a3a"`). KEYBINDINGS =========== @@ -176,6 +178,7 @@ ACTIONS on the current tab and normal mode. * __UndoRenameTab__ - undoes the changed tab name and reverts to the previous name. * __UndoRenamePane__ - undoes the changed pane name and reverts to the previous name. +* __SetPaneColor__ - sets the default foreground and/or background color of a pane. KEYS diff --git a/example/layouts/pane_colors_layout.kdl b/example/layouts/pane_colors_layout.kdl new file mode 100644 index 00000000..ad5b3705 --- /dev/null +++ b/example/layouts/pane_colors_layout.kdl @@ -0,0 +1,13 @@ +layout { + pane size=1 borderless=true { + plugin location="tab-bar" + } + pane split_direction="Vertical" { + pane name="dark-blue-bg" default_bg="#001a3a" + pane name="green-on-black" default_fg="#00e000" default_bg="#0a0a0a" + } + pane name="default-colors" + pane size=1 borderless=true { + plugin location="status-bar" + } +} diff --git a/src/main.rs b/src/main.rs index 581fff52..1a0db7e1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,8 +21,8 @@ fn main() { { let config = Config::try_from(&opts).ok(); - if let Some(Command::Sessions(Sessions::Action(cli_action))) = opts.command { - commands::send_action_to_session(cli_action, opts.session, config); + if let Some(Command::Action(cli_action)) = opts.command { + commands::send_action_to_session(*cli_action, opts.session, config); std::process::exit(0); } if let Some(Command::Sessions(Sessions::Run { diff --git a/xtask/src/build.rs b/xtask/src/build.rs index c5c54fca..e8baee09 100644 --- a/xtask/src/build.rs +++ b/xtask/src/build.rs @@ -77,6 +77,7 @@ pub fn build(sh: &Shell, flags: flags::Build) -> anyhow::Result<()> { } } } + proto_files.sort(); if needs_regeneration { prost .compile_protos(&proto_files, &[protobuf_source_dir]) @@ -122,6 +123,7 @@ pub fn build(sh: &Shell, flags: flags::Build) -> anyhow::Result<()> { } } } + proto_files.sort(); if needs_regeneration { prost .compile_protos(&proto_files, &[client_server_contract_dir]) @@ -166,6 +168,7 @@ pub fn build(sh: &Shell, flags: flags::Build) -> anyhow::Result<()> { } } } + proto_files.sort(); if needs_regeneration { prost .compile_protos(&proto_files, &[web_server_contract_dir]) diff --git a/zellij-server/src/output/mod.rs b/zellij-server/src/output/mod.rs index 6d9c2185..9297be11 100644 --- a/zellij-server/src/output/mod.rs +++ b/zellij-server/src/output/mod.rs @@ -61,6 +61,27 @@ fn adjust_styles_for_possible_selection( .unwrap_or(character_styles) } +fn adjust_styles_for_custom_bg_fg( + character_styles: CharacterStyles, + pane_default_fg: Option<AnsiCode>, + pane_default_bg: Option<AnsiCode>, +) -> CharacterStyles { + let mut character_styles = character_styles; + if character_styles.foreground.is_none() || character_styles.foreground == Some(AnsiCode::Reset) + { + if let Some(fg) = pane_default_fg { + character_styles.foreground = Some(fg); + } + } + if character_styles.background.is_none() || character_styles.background == Some(AnsiCode::Reset) + { + if let Some(bg) = pane_default_bg { + character_styles.background = Some(bg); + } + } + character_styles +} + fn write_changed_styles( character_styles: &mut CharacterStyles, current_character_styles: CharacterStyles, @@ -113,6 +134,8 @@ fn serialize_chunks_with_newlines( } let chunk_changed_colors = character_chunk.changed_colors(); + let pane_default_fg = character_chunk.pane_default_fg; + let pane_default_bg = character_chunk.pane_default_bg; let mut character_styles = DEFAULT_STYLES.enable_styled_underlines(styled_underlines); vte_output.push_str("\n\r"); let mut chunk_width = character_chunk.x; @@ -124,11 +147,15 @@ fn serialize_chunks_with_newlines( } } - let current_character_styles = adjust_styles_for_possible_selection( - character_chunk.selection_and_colors(), - *t_character.styles, - character_chunk.y, - chunk_width, + let current_character_styles = adjust_styles_for_custom_bg_fg( + adjust_styles_for_possible_selection( + character_chunk.selection_and_colors(), + *t_character.styles, + character_chunk.y, + chunk_width, + ), + pane_default_fg, + pane_default_bg, ); write_changed_styles( &mut character_styles, @@ -171,6 +198,8 @@ fn serialize_chunks( } let chunk_changed_colors = character_chunk.changed_colors(); + let pane_default_fg = character_chunk.pane_default_fg; + let pane_default_bg = character_chunk.pane_default_bg; let mut character_styles = DEFAULT_STYLES.enable_styled_underlines(styled_underlines); vte_goto_instruction(character_chunk.x, character_chunk.y, &mut vte_output) .with_context(err_context)?; @@ -183,11 +212,15 @@ fn serialize_chunks( } } - let current_character_styles = adjust_styles_for_possible_selection( - character_chunk.selection_and_colors(), - *t_character.styles, - character_chunk.y, - chunk_width, + let current_character_styles = adjust_styles_for_custom_bg_fg( + adjust_styles_for_possible_selection( + character_chunk.selection_and_colors(), + *t_character.styles, + character_chunk.y, + chunk_width, + ), + pane_default_fg, + pane_default_bg, ); write_changed_styles( &mut character_styles, @@ -745,6 +778,9 @@ impl FloatingPanesStack { let right_chunk_x = pane_right_edge + 1; let mut left_chunk = CharacterChunk::new(left_chunk_characters, left_chunk_x, c_chunk.y); + left_chunk.pane_default_fg = c_chunk.pane_default_fg; + left_chunk.pane_default_bg = c_chunk.pane_default_bg; + left_chunk.changed_colors = c_chunk.changed_colors; if !c_chunk.selection_and_colors.is_empty() { left_chunk.selection_and_colors = c_chunk.selection_and_colors.clone(); } @@ -947,6 +983,8 @@ pub struct CharacterChunk { pub y: usize, pub changed_colors: Option<[Option<AnsiCode>; 256]>, selection_and_colors: Vec<(Selection, AnsiCode, Option<AnsiCode>)>, // Selection, background color, optional foreground color + pub pane_default_fg: Option<AnsiCode>, + pub pane_default_bg: Option<AnsiCode>, } #[derive(Debug, Clone, Copy, Default)] @@ -990,6 +1028,10 @@ impl CharacterChunk { pub fn add_changed_colors(&mut self, changed_colors: Option<[Option<AnsiCode>; 256]>) { self.changed_colors = changed_colors; } + pub fn add_pane_defaults(&mut self, fg: Option<AnsiCode>, bg: Option<AnsiCode>) { + self.pane_default_fg = fg; + self.pane_default_bg = bg; + } pub fn changed_colors(&self) -> Option<[Option<AnsiCode>; 256]> { self.changed_colors } diff --git a/zellij-server/src/output/unit/output_tests.rs b/zellij-server/src/output/unit/output_tests.rs index bb0bb664..2328376c 100644 --- a/zellij-server/src/output/unit/output_tests.rs +++ b/zellij-server/src/output/unit/output_tests.rs @@ -1,5 +1,6 @@ use super::super::{CharacterChunk, FloatingPanesStack, Output, OutputBuffer, SixelImageChunk}; use crate::panes::sixel::SixelImageStore; +use crate::panes::terminal_character::AnsiCode; use crate::panes::{LinkHandler, Row, TerminalCharacter}; use crate::ClientId; use std::cell::RefCell; @@ -1033,3 +1034,80 @@ fn test_output_buffer_changed_chunks_in_viewport_partial() { assert_eq!(chunks[1].y, 5, "Second chunk should be at line 5"); assert_eq!(chunks[2].y, 7, "Third chunk should be at line 7"); } + +#[test] +fn test_pane_defaults_preserved_when_middle_covered() { + let pane_geom = create_pane_geom(5, 5, 3, 1); + let stack = FloatingPanesStack { + layers: vec![pane_geom], + }; + + let pane_bg = Some(AnsiCode::RgbCode((0, 26, 58))); + let pane_fg = Some(AnsiCode::RgbCode((0, 224, 0))); + + let mut chunk = create_character_chunk_from_str("0123456789", 0, 5); + chunk.pane_default_bg = pane_bg; + chunk.pane_default_fg = pane_fg; + + let visible = stack + .visible_character_chunks(vec![chunk], Some(0)) + .unwrap(); + + assert_eq!(visible.len(), 2, "Middle split should produce two chunks"); + for (i, chunk) in visible.iter().enumerate() { + assert_eq!( + chunk.pane_default_bg, pane_bg, + "Chunk {i} should preserve pane_default_bg" + ); + assert_eq!( + chunk.pane_default_fg, pane_fg, + "Chunk {i} should preserve pane_default_fg" + ); + } +} + +#[test] +fn test_pane_defaults_preserved_when_left_covered() { + let pane_geom = create_pane_geom(0, 5, 5, 1); + let stack = FloatingPanesStack { + layers: vec![pane_geom], + }; + + let pane_bg = Some(AnsiCode::RgbCode((0, 26, 58))); + + let mut chunk = create_character_chunk_from_str("0123456789", 0, 5); + chunk.pane_default_bg = pane_bg; + + let visible = stack + .visible_character_chunks(vec![chunk], Some(0)) + .unwrap(); + + assert_eq!(visible.len(), 1, "Left-covered should produce one chunk"); + assert_eq!( + visible[0].pane_default_bg, pane_bg, + "Remaining chunk should preserve pane_default_bg" + ); +} + +#[test] +fn test_pane_defaults_preserved_when_right_covered() { + let pane_geom = create_pane_geom(5, 5, 10, 1); + let stack = FloatingPanesStack { + layers: vec![pane_geom], + }; + + let pane_bg = Some(AnsiCode::RgbCode((0, 26, 58))); + + let mut chunk = create_character_chunk_from_str("0123456789", 0, 5); + chunk.pane_default_bg = pane_bg; + + let visible = stack + .visible_character_chunks(vec![chunk], Some(0)) + .unwrap(); + + assert_eq!(visible.len(), 1, "Right-covered should produce one chunk"); + assert_eq!( + visible[0].pane_default_bg, pane_bg, + "Remaining chunk should preserve pane_default_bg" + ); +} diff --git a/zellij-server/src/panes/grid.rs b/zellij-server/src/panes/grid.rs index 092e5689..c7eee368 100644 --- a/zellij-server/src/panes/grid.rs +++ b/zellij-server/src/panes/grid.rs @@ -404,6 +404,31 @@ pub struct Grid { // disabled by user config? click: Click, hyperlink_tracker: HyperlinkTracker, + pub pane_default_fg: Option<AnsiCode>, + pub pane_default_bg: Option<AnsiCode>, +} + +impl Grid { + pub fn set_pane_default_colors(&mut self, fg: Option<String>, bg: Option<String>) { + self.pane_default_fg = fg.as_ref().and_then(|s| xparse_color(s.as_bytes())); + self.pane_default_bg = bg.as_ref().and_then(|s| xparse_color(s.as_bytes())); + self.output_buffer.update_all_lines(); + } + pub fn get_pane_default_color_strings(&self) -> (Option<String>, Option<String>) { + ( + self.pane_default_fg.and_then(ansi_code_to_color_string), + self.pane_default_bg.and_then(ansi_code_to_color_string), + ) + } +} + +fn ansi_code_to_color_string(code: AnsiCode) -> Option<String> { + match code { + AnsiCode::RgbCode((r, g, b)) => Some(format!("#{:02x}{:02x}{:02x}", r, g, b)), + AnsiCode::ColorIndex(idx) => Some(format!("{}", idx)), + AnsiCode::NamedColor(named) => Some(format!("{:?}", named).to_lowercase()), + _ => None, + } } const CLICK_TIME_THRESHOLD: u128 = 400; // Doherty Threshold @@ -594,6 +619,8 @@ impl Grid { explicitly_disable_kitty_keyboard_protocol, click: Click::default(), hyperlink_tracker: HyperlinkTracker::new(), + pane_default_fg: None, + pane_default_bg: None, } } pub fn render_full_viewport(&mut self) { @@ -1174,6 +1201,7 @@ impl Grid { let (mut character_chunks, sixel_image_chunks) = self.read_changes(content_x, content_y); for character_chunk in character_chunks.iter_mut() { character_chunk.add_changed_colors(self.changed_colors); + character_chunk.add_pane_defaults(self.pane_default_fg, self.pane_default_bg); if self .selection .contains_row(character_chunk.y.saturating_sub(content_y)) @@ -1814,6 +1842,8 @@ impl Grid { self.cursor_is_hidden = false; self.supports_kitty_keyboard_protocol = false; self.set_scroll_region_to_viewport_size(); + self.pane_default_fg = None; + self.pane_default_bg = None; if let Some(images_to_reap) = self.sixel_grid.clear() { self.sixel_grid.reap_images(images_to_reap); } @@ -2702,34 +2732,44 @@ impl Perform for Grid { if params.len() >= 2 { if let Some(mut dynamic_code) = parse_number(params[0]) { for param in ¶ms[1..] { - // currently only getting the color sequence is supported, - // setting still isn't if param == b"?" { - let saved_terminal_color = if dynamic_code == 10 { - Some(self.terminal_emulator_colors.borrow().fg) + // Query: respond with pane default if set, else terminal default + let color_rgb = if dynamic_code == 10 { + match self.pane_default_fg { + Some(AnsiCode::RgbCode((r, g, b))) => Some((r, g, b)), + _ => match self.terminal_emulator_colors.borrow().fg { + PaletteColor::Rgb((r, g, b)) => Some((r, g, b)), + _ => None, + }, + } } else if dynamic_code == 11 { - Some(self.terminal_emulator_colors.borrow().bg) + match self.pane_default_bg { + Some(AnsiCode::RgbCode((r, g, b))) => Some((r, g, b)), + _ => match self.terminal_emulator_colors.borrow().bg { + PaletteColor::Rgb((r, g, b)) => Some((r, g, b)), + _ => None, + }, + } } else { None }; - let color_response_message = match saved_terminal_color { - Some(PaletteColor::Rgb((r, g, b))) => { - format!( - "\u{1b}]{};rgb:{1:02x}{1:02x}/{2:02x}{2:02x}/{3:02x}{3:02x}{4}", - // dynamic_code, color.r, color.g, color.b, terminator - dynamic_code, r, g, b, terminator - ) - }, - _ => { - format!( - "\u{1b}]{};rgb:{1:02x}{1:02x}/{2:02x}{2:02x}/{3:02x}{3:02x}{4}", - // dynamic_code, color.r, color.g, color.b, terminator - dynamic_code, 0, 0, 0, terminator - ) - }, - }; + let (r, g, b) = color_rgb.unwrap_or((0, 0, 0)); + let color_response_message = format!( + "\u{1b}]{};rgb:{1:02x}{1:02x}/{2:02x}{2:02x}/{3:02x}{3:02x}{4}", + dynamic_code, r, g, b, terminator + ); self.pending_messages_to_pty .push(color_response_message.as_bytes().to_vec()); + } else { + // Set: parse color and store as pane default + if let Some(color) = xparse_color(param) { + if dynamic_code == 10 { + self.pane_default_fg = Some(color); + } else if dynamic_code == 11 { + self.pane_default_bg = Some(color); + } + self.output_buffer.update_all_lines(); + } } dynamic_code += 1; } @@ -2813,12 +2853,14 @@ impl Perform for Grid { // Reset foreground color. b"110" => { - // TBD - reset foreground color - currently unimplemented + self.pane_default_fg = None; + self.output_buffer.update_all_lines(); }, // Reset background color. b"111" => { - // TBD - reset background color - currently unimplemented + self.pane_default_bg = None; + self.output_buffer.update_all_lines(); }, // Reset text cursor color. diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index db32a88a..a3f73a72 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -317,6 +317,13 @@ impl Pane for TerminalPane { fn set_selectable(&mut self, selectable: bool) { self.selectable = selectable; } + fn set_pane_default_colors(&mut self, fg: Option<String>, bg: Option<String>) { + self.grid.set_pane_default_colors(fg, bg); + self.set_should_render(true); + } + fn get_pane_default_colors(&self) -> (Option<String>, Option<String>) { + self.grid.get_pane_default_color_strings() + } fn render( &mut self, _client_id: Option<ClientId>, diff --git a/zellij-server/src/panes/unit/grid_tests.rs b/zellij-server/src/panes/unit/grid_tests.rs index 310c3dc4..e942caa8 100644 --- a/zellij-server/src/panes/unit/grid_tests.rs +++ b/zellij-server/src/panes/unit/grid_tests.rs @@ -4362,3 +4362,197 @@ fn single_click_drag_selection_preserved_after_scroll() { assert_eq!(grid.selection.start.column, start_before.column); assert_eq!(grid.selection.end.column, end_before.column); } + +#[test] +fn osc_11_set_and_query_pane_default_bg() { + use crate::panes::terminal_character::AnsiCode; + + let mut vte_parser = vte::Parser::new(); + let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); + let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); + let mut grid = Grid::new( + 10, + 20, + Rc::new(RefCell::new(Palette::default())), + terminal_emulator_color_codes, + Rc::new(RefCell::new(LinkHandler::new())), + Rc::new(RefCell::new(None)), + sixel_image_store, + Style::default(), + false, + true, + true, + true, + false, + ); + + // Set background via OSC 11 + let set_bg = b"\x1b]11;#001a3a\x07"; + for byte in set_bg.iter() { + vte_parser.advance(&mut grid, *byte); + } + + assert_eq!(grid.pane_default_bg, Some(AnsiCode::RgbCode((0, 26, 58)))); + + // Query background via OSC 11 + let query_bg = b"\x1b]11;?\x07"; + for byte in query_bg.iter() { + vte_parser.advance(&mut grid, *byte); + } + + assert_eq!(grid.pending_messages_to_pty.len(), 1); + let response = String::from_utf8(grid.pending_messages_to_pty[0].clone()).unwrap(); + assert!( + response.contains("11;rgb:0000/1a1a/3a3a"), + "Response was: {}", + response + ); +} + +#[test] +fn osc_10_set_and_query_pane_default_fg() { + use crate::panes::terminal_character::AnsiCode; + + let mut vte_parser = vte::Parser::new(); + let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); + let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); + let mut grid = Grid::new( + 10, + 20, + Rc::new(RefCell::new(Palette::default())), + terminal_emulator_color_codes, + Rc::new(RefCell::new(LinkHandler::new())), + Rc::new(RefCell::new(None)), + sixel_image_store, + Style::default(), + false, + true, + true, + true, + false, + ); + + // Set foreground via OSC 10 + let set_fg = b"\x1b]10;#00e000\x07"; + for byte in set_fg.iter() { + vte_parser.advance(&mut grid, *byte); + } + + assert_eq!(grid.pane_default_fg, Some(AnsiCode::RgbCode((0, 224, 0)))); + + // Query foreground via OSC 10 + let query_fg = b"\x1b]10;?\x07"; + for byte in query_fg.iter() { + vte_parser.advance(&mut grid, *byte); + } + + assert_eq!(grid.pending_messages_to_pty.len(), 1); + let response = String::from_utf8(grid.pending_messages_to_pty[0].clone()).unwrap(); + assert!( + response.contains("10;rgb:0000/e0e0/0000"), + "Response was: {}", + response + ); +} + +#[test] +fn osc_110_111_reset_pane_default_colors() { + use crate::panes::terminal_character::AnsiCode; + + let mut vte_parser = vte::Parser::new(); + let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); + let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); + let mut grid = Grid::new( + 10, + 20, + Rc::new(RefCell::new(Palette::default())), + terminal_emulator_color_codes, + Rc::new(RefCell::new(LinkHandler::new())), + Rc::new(RefCell::new(None)), + sixel_image_store, + Style::default(), + false, + true, + true, + true, + false, + ); + + // Set both fg and bg + let set_fg = b"\x1b]10;#00e000\x07"; + for byte in set_fg.iter() { + vte_parser.advance(&mut grid, *byte); + } + let set_bg = b"\x1b]11;#001a3a\x07"; + for byte in set_bg.iter() { + vte_parser.advance(&mut grid, *byte); + } + + assert_eq!(grid.pane_default_fg, Some(AnsiCode::RgbCode((0, 224, 0)))); + assert_eq!(grid.pane_default_bg, Some(AnsiCode::RgbCode((0, 26, 58)))); + + // Reset foreground via OSC 110 + let reset_fg = b"\x1b]110\x07"; + for byte in reset_fg.iter() { + vte_parser.advance(&mut grid, *byte); + } + assert_eq!(grid.pane_default_fg, None); + assert_eq!(grid.pane_default_bg, Some(AnsiCode::RgbCode((0, 26, 58)))); + + // Reset background via OSC 111 + let reset_bg = b"\x1b]111\x07"; + for byte in reset_bg.iter() { + vte_parser.advance(&mut grid, *byte); + } + assert_eq!(grid.pane_default_fg, None); + assert_eq!(grid.pane_default_bg, None); +} + +#[test] +fn osc_11_set_bg_produces_ansi_in_render_output() { + use crate::panes::terminal_character::AnsiCode; + + let mut vte_parser = vte::Parser::new(); + let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default())); + let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new())); + let mut grid = Grid::new( + 5, + 10, + Rc::new(RefCell::new(Palette::default())), + terminal_emulator_color_codes, + Rc::new(RefCell::new(LinkHandler::new())), + Rc::new(RefCell::new(None)), + sixel_image_store, + Style::default(), + false, + true, + true, + true, + false, + ); + + // Set background via OSC 11 + let set_bg = b"\x1b]11;#001a3a\x07"; + for byte in set_bg.iter() { + vte_parser.advance(&mut grid, *byte); + } + + assert_eq!(grid.pane_default_bg, Some(AnsiCode::RgbCode((0, 26, 58)))); + + // Render the grid and check that the pane defaults are stamped on chunks + let style = Style::default(); + let render_result = grid.render(0, 0, &style).unwrap(); + assert!(render_result.is_some(), "Expected render output"); + + let (chunks, _, _) = render_result.unwrap(); + assert!(!chunks.is_empty(), "Expected at least one character chunk"); + + // All chunks should carry the pane default bg + for chunk in &chunks { + assert_eq!( + chunk.pane_default_bg, + Some(AnsiCode::RgbCode((0, 26, 58))), + "Chunk should carry pane default background" + ); + } +} diff --git a/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command-2.snap b/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command-2.snap index 9811bdc4..8a11021c 100644 --- a/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command-2.snap +++ b/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command-2.snap @@ -26,6 +26,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -42,6 +44,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -55,6 +59,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ), [], diff --git a/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command.snap b/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command.snap index 4e5fe5d2..4e5076b1 100644 --- a/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command.snap +++ b/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__new_tabs_with_layout_plugin_command.snap @@ -26,6 +26,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -42,6 +44,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -55,6 +59,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ), [], diff --git a/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__override_layout_plugin_command.snap b/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__override_layout_plugin_command.snap index 21dc6fda..0320d754 100644 --- a/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__override_layout_plugin_command.snap +++ b/zellij-server/src/plugins/unit/snapshots/zellij_server__plugins__plugin_tests__override_layout_plugin_command.snap @@ -29,6 +29,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -66,6 +68,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -79,6 +83,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, floating_layouts: [], swap_tiled_layouts: Some( @@ -114,6 +120,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -132,6 +140,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -145,6 +155,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -158,6 +170,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -195,6 +209,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -208,6 +224,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, MaxPanes( 7, @@ -240,6 +258,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -260,6 +280,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -276,6 +298,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -292,6 +316,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -308,6 +334,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -321,6 +349,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -334,6 +364,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -347,6 +379,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -384,6 +418,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -397,6 +433,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, MaxPanes( 11, @@ -429,6 +467,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -449,6 +489,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -465,6 +507,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -481,6 +525,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -497,6 +543,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -510,6 +558,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -530,6 +580,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -546,6 +598,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -562,6 +616,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -578,6 +634,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -591,6 +649,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -604,6 +664,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -617,6 +679,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -654,6 +718,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -667,6 +733,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, }, Some( @@ -700,6 +768,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -716,6 +786,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -729,6 +801,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -766,6 +840,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -779,6 +855,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, MaxPanes( 7, @@ -811,6 +889,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -831,6 +911,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -847,6 +929,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -863,6 +947,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -879,6 +965,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -892,6 +980,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -905,6 +995,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -918,6 +1010,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -955,6 +1049,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -968,6 +1064,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, MaxPanes( 11, @@ -1000,6 +1098,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -1020,6 +1120,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1036,6 +1138,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1052,6 +1156,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1068,6 +1174,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1081,6 +1189,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -1101,6 +1211,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1117,6 +1229,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1133,6 +1247,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1149,6 +1265,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1162,6 +1280,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1175,6 +1295,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1188,6 +1310,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1225,6 +1349,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1238,6 +1364,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, }, Some( @@ -1275,6 +1403,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1293,6 +1423,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1306,6 +1438,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1319,6 +1453,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -1356,6 +1492,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -1369,6 +1507,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, }, Some( @@ -1421,6 +1561,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1451,6 +1593,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1481,6 +1625,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1511,6 +1657,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1541,6 +1689,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1571,6 +1721,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1601,6 +1753,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1631,6 +1785,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1661,6 +1817,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1691,6 +1849,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, ], }, @@ -1724,6 +1884,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, ], MaxPanes( @@ -1754,6 +1916,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1780,6 +1944,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, ], MaxPanes( @@ -1810,6 +1976,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1836,6 +2004,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1862,6 +2032,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, ], MaxPanes( @@ -1896,6 +2068,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1926,6 +2100,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1956,6 +2132,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -1986,6 +2164,8 @@ Some( already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, ], }, diff --git a/zellij-server/src/plugins/zellij_exports.rs b/zellij-server/src/plugins/zellij_exports.rs index 57cd2a44..dd323977 100644 --- a/zellij-server/src/plugins/zellij_exports.rs +++ b/zellij-server/src/plugins/zellij_exports.rs @@ -596,6 +596,9 @@ fn host_run_plugin_command(mut caller: Caller<'_, PluginEnv>) { PluginCommand::SetPaneBorderless(pane_id, borderless) => { set_pane_borderless(env, pane_id.into(), borderless) }, + PluginCommand::SetPaneColor(pane_id, fg, bg) => { + set_pane_color(env, pane_id.into(), fg, bg) + }, PluginCommand::OpenFileNearPlugin(file_to_open, context) => { open_file_near_plugin(env, file_to_open, context) }, @@ -3602,6 +3605,12 @@ fn set_pane_borderless(env: &PluginEnv, pane_id: PaneId, borderless: bool) { )); } +fn set_pane_color(env: &PluginEnv, pane_id: PaneId, fg: Option<String>, bg: Option<String>) { + let _ = env + .senders + .send_to_screen(ScreenInstruction::SetPaneColor(pane_id, fg, bg, None)); +} + fn scan_host_folder(env: &PluginEnv, folder_to_scan: PathBuf) { if !folder_to_scan.starts_with("/host") { log::error!( @@ -5061,6 +5070,7 @@ fn check_command_permission( | PluginCommand::ChangeFloatingPanesCoordinates(..) | PluginCommand::TogglePaneBorderless(..) | PluginCommand::SetPaneBorderless(..) + | PluginCommand::SetPaneColor(..) | PluginCommand::GroupAndUngroupPanes(..) | PluginCommand::HighlightAndUnhighlightPanes(..) | PluginCommand::CloseMultiplePanes(..) diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs index a57873a3..5a5c5c15 100644 --- a/zellij-server/src/route.rs +++ b/zellij-server/src/route.rs @@ -277,6 +277,16 @@ pub(crate) fn route_action( )) .with_context(err_context)?; }, + Action::SetPaneColor { pane_id, fg, bg } => { + senders + .send_to_screen(ScreenInstruction::SetPaneColor( + pane_id.into(), + fg, + bg, + Some(NotificationEnd::new(completion_tx)), + )) + .with_context(err_context)?; + }, Action::SwitchToMode { input_mode } => { let attrs = &client_attributes; senders diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 9d2d258a..6a18042d 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -600,6 +600,12 @@ pub enum ScreenInstruction { ResizePaneWithId(ResizeStrategy, PaneId), EditScrollbackForPaneWithId(PaneId, Option<NotificationEnd>), WriteToPaneId(Vec<u8>, PaneId, Option<NotificationEnd>), + SetPaneColor( + PaneId, + Option<String>, + Option<String>, + Option<NotificationEnd>, + ), WriteKeyToPaneId( Option<KeyWithModifier>, Vec<u8>, @@ -865,6 +871,7 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenContext::EditScrollbackForPaneWithId }, ScreenInstruction::WriteToPaneId(..) => ScreenContext::WriteToPaneId, + ScreenInstruction::SetPaneColor(..) => ScreenContext::SetPaneColor, ScreenInstruction::WriteKeyToPaneId(..) => ScreenContext::WriteKeyToPaneId, ScreenInstruction::CopyTextToClipboard(..) => ScreenContext::CopyTextToClipboard, ScreenInstruction::MovePaneWithPaneId(..) => ScreenContext::MovePaneWithPaneId, @@ -3939,6 +3946,7 @@ impl Screen { p_id.and_then(|p_id| if p_id == pane_id { Some(*c_id) } else { None }) }) .collect(); + let (default_fg, default_bg) = p.get_pane_default_colors(); PaneLayoutMetadata::new( pane_id, p.position_and_size(), @@ -3952,6 +3960,8 @@ impl Screen { None }, focused_clients, + default_fg, + default_bg, ) }) .collect(); @@ -3977,6 +3987,7 @@ impl Screen { p_id.and_then(|p_id| if p_id == pane_id { Some(*c_id) } else { None }) }) .collect(); + let (default_fg, default_bg) = p.get_pane_default_colors(); PaneLayoutMetadata::new( pane_id, p.position_and_size(), @@ -3990,6 +4001,8 @@ impl Screen { None }, focused_clients, + default_fg, + default_bg, ) }) .collect(); @@ -7127,6 +7140,16 @@ pub(crate) fn screen_thread_main( } screen.render(None)?; }, + ScreenInstruction::SetPaneColor(pane_id, fg, bg, _completion) => { + let all_tabs = screen.get_tabs_mut(); + for tab in all_tabs.values_mut() { + if tab.has_pane_with_pid(&pane_id) { + tab.set_pane_color(pane_id, fg, bg).non_fatal(); + break; + } + } + screen.render(None)?; + }, ScreenInstruction::WriteKeyToPaneId( key_with_modifier, bytes, diff --git a/zellij-server/src/session_layout_metadata.rs b/zellij-server/src/session_layout_metadata.rs index afa76526..3ea8b28e 100644 --- a/zellij-server/src/session_layout_metadata.rs +++ b/zellij-server/src/session_layout_metadata.rs @@ -533,6 +533,8 @@ impl Into<PaneLayoutManifest> for PaneLayoutMetadata { title: self.title, is_focused: self.is_focused, pane_contents: self.pane_contents, + default_fg: self.default_fg, + default_bg: self.default_bg, } } } @@ -557,6 +559,8 @@ pub struct PaneLayoutMetadata { is_focused: bool, pane_contents: Option<String>, focused_clients: Vec<ClientId>, + default_fg: Option<String>, + default_bg: Option<String>, } impl PaneLayoutMetadata { @@ -569,6 +573,8 @@ impl PaneLayoutMetadata { is_focused: bool, pane_contents: Option<String>, focused_clients: Vec<ClientId>, + default_fg: Option<String>, + default_bg: Option<String>, ) -> Self { PaneLayoutMetadata { id, @@ -580,6 +586,8 @@ impl PaneLayoutMetadata { is_focused, pane_contents, focused_clients, + default_fg, + default_bg, } } fn to_pane_metadata(&self) -> PaneMetadata { @@ -693,6 +701,8 @@ mod tests { false, None, vec![], + None, + None, ) } @@ -710,6 +720,8 @@ mod tests { false, None, vec![], + None, + None, ) } diff --git a/zellij-server/src/tab/layout_applier.rs b/zellij-server/src/tab/layout_applier.rs index 16fecdbb..46db9bc5 100644 --- a/zellij-server/src/tab/layout_applier.rs +++ b/zellij-server/src/tab/layout_applier.rs @@ -653,6 +653,12 @@ impl<'a> LayoutApplier<'a> { } else { new_pane.set_borderless(false); } + if floating_pane_layout.default_fg.is_some() || floating_pane_layout.default_bg.is_some() { + new_pane.set_pane_default_colors( + floating_pane_layout.default_fg.clone(), + floating_pane_layout.default_bg.clone(), + ); + } if let Some(held_command) = hold_for_command { new_pane.hold(None, true, held_command.clone()); } @@ -722,6 +728,9 @@ impl<'a> LayoutApplier<'a> { if let Some(exclude_from_sync) = layout.exclude_from_sync { new_pane.set_exclude_from_sync(exclude_from_sync); } + if layout.default_fg.is_some() || layout.default_bg.is_some() { + new_pane.set_pane_default_colors(layout.default_fg.clone(), layout.default_bg.clone()); + } if let Some(held_command) = hold_for_command { new_pane.hold(None, true, held_command.clone()); } diff --git a/zellij-server/src/tab/mod.rs b/zellij-server/src/tab/mod.rs index 2fa9996f..49b232a3 100644 --- a/zellij-server/src/tab/mod.rs +++ b/zellij-server/src/tab/mod.rs @@ -323,6 +323,10 @@ pub trait Pane { fn get_selected_text(&self, _client_id: ClientId) -> Option<String> { None } + fn set_pane_default_colors(&mut self, _fg: Option<String>, _bg: Option<String>) {} + fn get_pane_default_colors(&self) -> (Option<String>, Option<String>) { + (None, None) + } fn right_boundary_x_coords(&self) -> usize { self.x() + self.cols() @@ -2540,6 +2544,22 @@ impl Tab { .values() .any(|s_p| s_p.1.pid() == PaneId::Plugin(plugin_id)) } + pub fn set_pane_color( + &mut self, + pane_id: PaneId, + fg: Option<String>, + bg: Option<String>, + ) -> Result<()> { + let pane = self + .floating_panes + .get_mut(&pane_id) + .or_else(|| self.tiled_panes.get_pane_mut(pane_id)) + .or_else(|| self.suppressed_panes.get_mut(&pane_id).map(|p| &mut p.1)); + if let Some(pane) = pane { + pane.set_pane_default_colors(fg, bg); + } + Ok(()) + } pub fn has_pane_with_pid(&self, pid: &PaneId) -> bool { self.tiled_panes.panes_contain(pid) || self.floating_panes.panes_contain(pid) @@ -5597,6 +5617,10 @@ pub fn pane_info_for_pane( .collect(); pane_info.index_in_pane_group = index_in_pane_group; + let (default_fg, default_bg) = pane.get_pane_default_colors(); + pane_info.default_fg = default_fg; + pane_info.default_bg = default_bg; + match pane_id { PaneId::Terminal(terminal_id) => { pane_info.id = *terminal_id; diff --git a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_default_params.snap b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_default_params.snap index a734c788..aa0e3596 100644 --- a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_default_params.snap +++ b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_default_params.snap @@ -1,5 +1,6 @@ --- source: zellij-server/src/./unit/screen_tests.rs +assertion_line: 3515 expression: "format!(\"{:#?}\", new_tab_action)" --- Some( @@ -26,6 +27,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -42,6 +45,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -55,6 +60,8 @@ Some( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ), [], diff --git a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap index b3be2b93..cd39bac6 100644 --- a/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap +++ b/zellij-server/src/unit/snapshots/zellij_server__screen__screen_tests__send_cli_new_tab_action_with_name_and_layout.snap @@ -1,5 +1,6 @@ --- source: zellij-server/src/./unit/screen_tests.rs +assertion_line: 3568 expression: "format!(\"{:#?}\", new_tab_instruction)" --- NewTab( @@ -29,6 +30,8 @@ NewTab( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -49,6 +52,8 @@ NewTab( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -69,6 +74,8 @@ NewTab( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -86,6 +93,8 @@ NewTab( run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ), [], diff --git a/zellij-tile/src/shim.rs b/zellij-tile/src/shim.rs index 023aae31..2837d08e 100644 --- a/zellij-tile/src/shim.rs +++ b/zellij-tile/src/shim.rs @@ -2392,6 +2392,19 @@ pub fn set_pane_borderless(pane_id: PaneId, borderless: bool) { unsafe { host_run_plugin_command() }; } +/// Set the default foreground and/or background color of a pane +/// +/// # Arguments +/// * `pane_id` - The ID of the pane (PaneId::Terminal or PaneId::Plugin) +/// * `fg` - Optional foreground color string (e.g. "#00e000"), None to leave unchanged +/// * `bg` - Optional background color string (e.g. "#001a3a"), None to leave unchanged +pub fn set_pane_color(pane_id: PaneId, fg: Option<String>, bg: Option<String>) { + let plugin_command = PluginCommand::SetPaneColor(pane_id, fg, bg); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + pub fn start_web_server() { let plugin_command = PluginCommand::StartWebServer; let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); diff --git a/zellij-utils/assets/prost/api.event.rs b/zellij-utils/assets/prost/api.event.rs index 3bab18af..04ccac58 100644 --- a/zellij-utils/assets/prost/api.event.rs +++ b/zellij-utils/assets/prost/api.event.rs @@ -543,6 +543,10 @@ pub struct PaneInfo { pub is_selectable: bool, #[prost(message, repeated, tag="23")] pub index_in_pane_group: ::prost::alloc::vec::Vec<IndexInPaneGroup>, + #[prost(string, optional, tag="24")] + pub default_fg: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag="25")] + pub default_bg: ::core::option::Option<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/zellij-utils/assets/prost/api.plugin_command.rs b/zellij-utils/assets/prost/api.plugin_command.rs index d89da18b..887e2e30 100644 --- a/zellij-utils/assets/prost/api.plugin_command.rs +++ b/zellij-utils/assets/prost/api.plugin_command.rs @@ -3,7 +3,7 @@ pub struct PluginCommand { #[prost(enumeration="CommandName", tag="1")] pub name: i32, - #[prost(oneof="plugin_command::Payload", tags="2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156")] + #[prost(oneof="plugin_command::Payload", tags="2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157")] pub payload: ::core::option::Option<plugin_command::Payload>, } /// Nested message and enum types in `PluginCommand`. @@ -295,6 +295,8 @@ pub mod plugin_command { HideFloatingPanesPayload(super::HideFloatingPanesPayload), #[prost(message, tag="156")] ShowFloatingPanesPayload(super::ShowFloatingPanesPayload), + #[prost(message, tag="157")] + SetPaneColorPayload(super::SetPaneColorPayload), } } #[allow(clippy::derive_partial_eq_without_eq)] @@ -1768,6 +1770,16 @@ pub mod hide_floating_panes_response { Error(::prost::alloc::string::String), } } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SetPaneColorPayload { + #[prost(message, optional, tag="1")] + pub pane_id: ::core::option::Option<PaneId>, + #[prost(string, optional, tag="2")] + pub fg: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag="3")] + pub bg: ::core::option::Option<::prost::alloc::string::String>, +} #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum CommandName { @@ -1956,6 +1968,7 @@ pub enum CommandName { OpenEditPaneInPlaceOfPaneId = 203, HideFloatingPanes = 204, ShowFloatingPanes = 205, + SetPaneColor = 206, } impl CommandName { /// String value of the enum field names used in the ProtoBuf definition. @@ -2149,6 +2162,7 @@ impl CommandName { CommandName::OpenEditPaneInPlaceOfPaneId => "OpenEditPaneInPlaceOfPaneId", CommandName::HideFloatingPanes => "HideFloatingPanes", CommandName::ShowFloatingPanes => "ShowFloatingPanes", + CommandName::SetPaneColor => "SetPaneColor", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -2339,6 +2353,7 @@ impl CommandName { "OpenEditPaneInPlaceOfPaneId" => Some(Self::OpenEditPaneInPlaceOfPaneId), "HideFloatingPanes" => Some(Self::HideFloatingPanes), "ShowFloatingPanes" => Some(Self::ShowFloatingPanes), + "SetPaneColor" => Some(Self::SetPaneColor), _ => None, } } diff --git a/zellij-utils/assets/prost_ipc/client_server_contract.rs b/zellij-utils/assets/prost_ipc/client_server_contract.rs index 79a8b6b3..f2bc91c9 100644 --- a/zellij-utils/assets/prost_ipc/client_server_contract.rs +++ b/zellij-utils/assets/prost_ipc/client_server_contract.rs @@ -119,7 +119,7 @@ pub struct RgbColor { #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Action { - #[prost(oneof="action::ActionType", tags="1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107")] + #[prost(oneof="action::ActionType", tags="1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108")] pub action_type: ::core::option::Option<action::ActionType>, } /// Nested message and enum types in `Action`. @@ -341,6 +341,8 @@ pub mod action { ShowFloatingPanes(super::ShowFloatingPanesAction), #[prost(message, tag="107")] HideFloatingPanes(super::HideFloatingPanesAction), + #[prost(message, tag="108")] + SetPaneColor(super::SetPaneColorAction), } } // Action message definitions (all 92 variants) @@ -1127,6 +1129,16 @@ pub struct SetPaneBorderlessAction { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct SetPaneColorAction { + #[prost(message, optional, tag="1")] + pub pane_id: ::core::option::Option<PaneId>, + #[prost(string, optional, tag="2")] + pub fg: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag="3")] + pub bg: ::core::option::Option<::prost::alloc::string::String>, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct Position { /// Changed from uint32 to int32 to support negative line numbers #[prost(int32, tag="1")] @@ -1409,9 +1421,13 @@ pub struct TiledPaneLayout { pub is_expanded_in_stack: bool, #[prost(bool, tag="12")] pub hide_floating_panes: bool, - /// NOTE: run_instructions_to_ignore is not represented here because it's a field used only inside the server itself and not part of the server/client contract #[prost(string, optional, tag="13")] pub pane_initial_contents: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag="14")] + pub default_fg: ::core::option::Option<::prost::alloc::string::String>, + /// NOTE: run_instructions_to_ignore is not represented here because it's a field used only inside the server itself and not part of the server/client contract + #[prost(string, optional, tag="15")] + pub default_bg: ::core::option::Option<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -1440,6 +1456,10 @@ pub struct FloatingPaneLayout { pub logical_position: ::core::option::Option<u32>, #[prost(bool, optional, tag="12")] pub borderless: ::core::option::Option<bool>, + #[prost(string, optional, tag="13")] + pub default_fg: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag="14")] + pub default_bg: ::core::option::Option<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -2562,122 +2582,6 @@ impl WebSharing { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct ServerToClientMsg { - #[prost(oneof="server_to_client_msg::Message", tags="1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13")] - pub message: ::core::option::Option<server_to_client_msg::Message>, -} -/// Nested message and enum types in `ServerToClientMsg`. -pub mod server_to_client_msg { - #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Message { - #[prost(message, tag="1")] - Render(super::RenderMsg), - #[prost(message, tag="2")] - UnblockInputThread(super::UnblockInputThreadMsg), - #[prost(message, tag="3")] - Exit(super::ExitMsg), - #[prost(message, tag="4")] - Connected(super::ConnectedMsg), - #[prost(message, tag="5")] - Log(super::LogMsg), - #[prost(message, tag="6")] - LogError(super::LogErrorMsg), - #[prost(message, tag="7")] - SwitchSession(super::SwitchSessionMsg), - #[prost(message, tag="8")] - UnblockCliPipeInput(super::UnblockCliPipeInputMsg), - #[prost(message, tag="9")] - CliPipeOutput(super::CliPipeOutputMsg), - #[prost(message, tag="10")] - QueryTerminalSize(super::QueryTerminalSizeMsg), - #[prost(message, tag="11")] - StartWebServer(super::StartWebServerMsg), - #[prost(message, tag="12")] - RenamedSession(super::RenamedSessionMsg), - #[prost(message, tag="13")] - ConfigFileUpdated(super::ConfigFileUpdatedMsg), - } -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct RenderMsg { - #[prost(string, tag="1")] - pub content: ::prost::alloc::string::String, -} -/// Empty message -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct UnblockInputThreadMsg { -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ExitMsg { - #[prost(enumeration="ExitReason", tag="1")] - pub exit_reason: i32, - #[prost(string, optional, tag="2")] - pub payload: ::core::option::Option<::prost::alloc::string::String>, -} -/// Empty message -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConnectedMsg { -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct LogMsg { - #[prost(string, repeated, tag="1")] - pub lines: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct LogErrorMsg { - #[prost(string, repeated, tag="1")] - pub lines: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct SwitchSessionMsg { - #[prost(message, optional, tag="1")] - pub connect_to_session: ::core::option::Option<ConnectToSession>, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct UnblockCliPipeInputMsg { - #[prost(string, tag="1")] - pub pipe_name: ::prost::alloc::string::String, -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct CliPipeOutputMsg { - #[prost(string, tag="1")] - pub pipe_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] - pub output: ::prost::alloc::string::String, -} -/// Empty message -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct QueryTerminalSizeMsg { -} -/// Empty message -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct StartWebServerMsg { -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct RenamedSessionMsg { - #[prost(string, tag="1")] - pub name: ::prost::alloc::string::String, -} -/// Empty message -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConfigFileUpdatedMsg { -} -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] pub struct ClientToServerMsg { #[prost(oneof="client_to_server_msg::Message", tags="1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16")] pub message: ::core::option::Option<client_to_server_msg::Message>, @@ -2834,3 +2738,119 @@ pub struct FailedToStartWebServerMsg { #[prost(string, tag="1")] pub error: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ServerToClientMsg { + #[prost(oneof="server_to_client_msg::Message", tags="1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13")] + pub message: ::core::option::Option<server_to_client_msg::Message>, +} +/// Nested message and enum types in `ServerToClientMsg`. +pub mod server_to_client_msg { + #[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Message { + #[prost(message, tag="1")] + Render(super::RenderMsg), + #[prost(message, tag="2")] + UnblockInputThread(super::UnblockInputThreadMsg), + #[prost(message, tag="3")] + Exit(super::ExitMsg), + #[prost(message, tag="4")] + Connected(super::ConnectedMsg), + #[prost(message, tag="5")] + Log(super::LogMsg), + #[prost(message, tag="6")] + LogError(super::LogErrorMsg), + #[prost(message, tag="7")] + SwitchSession(super::SwitchSessionMsg), + #[prost(message, tag="8")] + UnblockCliPipeInput(super::UnblockCliPipeInputMsg), + #[prost(message, tag="9")] + CliPipeOutput(super::CliPipeOutputMsg), + #[prost(message, tag="10")] + QueryTerminalSize(super::QueryTerminalSizeMsg), + #[prost(message, tag="11")] + StartWebServer(super::StartWebServerMsg), + #[prost(message, tag="12")] + RenamedSession(super::RenamedSessionMsg), + #[prost(message, tag="13")] + ConfigFileUpdated(super::ConfigFileUpdatedMsg), + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RenderMsg { + #[prost(string, tag="1")] + pub content: ::prost::alloc::string::String, +} +/// Empty message +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UnblockInputThreadMsg { +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExitMsg { + #[prost(enumeration="ExitReason", tag="1")] + pub exit_reason: i32, + #[prost(string, optional, tag="2")] + pub payload: ::core::option::Option<::prost::alloc::string::String>, +} +/// Empty message +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConnectedMsg { +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LogMsg { + #[prost(string, repeated, tag="1")] + pub lines: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LogErrorMsg { + #[prost(string, repeated, tag="1")] + pub lines: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SwitchSessionMsg { + #[prost(message, optional, tag="1")] + pub connect_to_session: ::core::option::Option<ConnectToSession>, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct UnblockCliPipeInputMsg { + #[prost(string, tag="1")] + pub pipe_name: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct CliPipeOutputMsg { + #[prost(string, tag="1")] + pub pipe_name: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub output: ::prost::alloc::string::String, +} +/// Empty message +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct QueryTerminalSizeMsg { +} +/// Empty message +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct StartWebServerMsg { +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct RenamedSessionMsg { + #[prost(string, tag="1")] + pub name: ::prost::alloc::string::String, +} +/// Empty message +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConfigFileUpdatedMsg { +} diff --git a/zellij-utils/src/cli.rs b/zellij-utils/src/cli.rs index 7b984fd1..8ebbeca7 100644 --- a/zellij-utils/src/cli.rs +++ b/zellij-utils/src/cli.rs @@ -111,6 +111,11 @@ pub enum Command { #[clap(name = "web", value_parser)] Web(WebCli), + /// Send actions to a specific session + #[clap(visible_alias = "ac")] + #[clap(subcommand)] + Action(Box<CliAction>), + /// Explore existing zellij sessions #[clap(flatten)] Sessions(Sessions), @@ -333,10 +338,6 @@ pub enum Sessions { force: bool, }, - /// Send actions to a specific session - #[clap(visible_alias = "ac")] - #[clap(subcommand)] - Action(CliAction), /// Run a command in a new pane /// Returns: Created pane ID (format: terminal_<id>) #[clap(visible_alias = "r")] @@ -1355,4 +1356,20 @@ tail -f /tmp/my-live-logfile | zellij action pipe --name logs --plugin https://e #[clap(short, long, value_parser)] cwd: Option<PathBuf>, }, + /// Set the default foreground/background color of a pane + SetPaneColor { + /// The pane_id of the pane, eg. terminal_1, plugin_2 or 3 (equivalent to terminal_3). + /// Defaults to $ZELLIJ_PANE_ID if not provided. + #[clap(short, long, value_parser)] + pane_id: Option<String>, + /// Foreground color (e.g. "#00e000", "rgb:00/e0/00") + #[clap(long, value_parser)] + fg: Option<String>, + /// Background color (e.g. "#001a3a", "rgb:00/1a/3a") + #[clap(long, value_parser)] + bg: Option<String>, + /// Reset pane colors to terminal defaults + #[clap(long, value_parser, conflicts_with_all(&["fg", "bg"]))] + reset: bool, + }, } diff --git a/zellij-utils/src/client_server_contract/common_types.proto b/zellij-utils/src/client_server_contract/common_types.proto index 03602019..e5e661a9 100644 --- a/zellij-utils/src/client_server_contract/common_types.proto +++ b/zellij-utils/src/client_server_contract/common_types.proto @@ -243,6 +243,7 @@ message Action { CurrentTabInfoAction current_tab_info = 105; ShowFloatingPanesAction show_floating_panes = 106; HideFloatingPanesAction hide_floating_panes = 107; + SetPaneColorAction set_pane_color = 108; } } @@ -651,6 +652,12 @@ message SetPaneBorderlessAction { bool borderless = 2; } +message SetPaneColorAction { + PaneId pane_id = 1; + optional string fg = 2; + optional string bg = 3; +} + // Supporting enums and messages enum InputMode { INPUT_MODE_UNSPECIFIED = 0; @@ -856,6 +863,8 @@ message TiledPaneLayout { bool is_expanded_in_stack = 11; bool hide_floating_panes = 12; optional string pane_initial_contents = 13; + optional string default_fg = 14; + optional string default_bg = 15; // NOTE: run_instructions_to_ignore is not represented here because it's a field used only inside the server itself and not part of the server/client contract } @@ -872,6 +881,8 @@ message FloatingPaneLayout { optional string pane_initial_contents = 10; optional uint32 logical_position = 11; optional bool borderless = 12; + optional string default_fg = 13; + optional string default_bg = 14; } message SwapTiledLayout { diff --git a/zellij-utils/src/data.rs b/zellij-utils/src/data.rs index 66cf0815..4a7088c0 100644 --- a/zellij-utils/src/data.rs +++ b/zellij-utils/src/data.rs @@ -2264,6 +2264,10 @@ pub struct PaneInfo { /// Grouped panes (usually through an explicit user action) that are staged for a bulk action /// the index is kept track of in order to preserve the pane group order pub index_in_pane_group: BTreeMap<ClientId, usize>, + /// The default foreground color of this pane, if set (e.g. "#00e000") + pub default_fg: Option<String>, + /// The default background color of this pane, if set (e.g. "#001a3a") + pub default_bg: Option<String>, } #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] @@ -3471,6 +3475,7 @@ pub enum PluginCommand { ShowFloatingPanes { tab_id: Option<usize>, }, + SetPaneColor(PaneId, Option<String>, Option<String>), // (pane_id, fg, bg) } // Response type for plugin API methods that open a pane in a new tab diff --git a/zellij-utils/src/errors.rs b/zellij-utils/src/errors.rs index 2085e913..928c8901 100644 --- a/zellij-utils/src/errors.rs +++ b/zellij-utils/src/errors.rs @@ -372,6 +372,7 @@ pub enum ScreenContext { ResizePaneWithId, EditScrollbackForPaneWithId, WriteToPaneId, + SetPaneColor, WriteKeyToPaneId, CopyTextToClipboard, MovePaneWithPaneId, diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index 2841ea53..5ed8504e 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -327,6 +327,12 @@ pub enum Action { command: RunCommandAction, near_current_pane: bool, }, + /// Set pane default foreground/background color + SetPaneColor { + pane_id: PaneId, + fg: Option<String>, + bg: Option<String>, + }, /// Detach session and exit Detach, /// Switch to a different session @@ -1492,6 +1498,38 @@ impl Action { } } }, + CliAction::SetPaneColor { + pane_id, + fg, + bg, + reset, + } => { + let pane_id_str = match pane_id { + Some(id) => id, + None => std::env::var("ZELLIJ_PANE_ID").map_err(|_| { + "No --pane-id provided and ZELLIJ_PANE_ID is not set".to_string() + })?, + }; + let parsed_pane_id = PaneId::from_str(&pane_id_str); + match parsed_pane_id { + Ok(parsed_pane_id) => { + let (fg, bg) = if reset { + (None, None) + } else { + (fg, bg) + }; + Ok(vec![Action::SetPaneColor { + pane_id: parsed_pane_id, + fg, + bg, + }]) + }, + Err(_e) => Err(format!( + "Malformed pane id: {}, expecting either a bare integer (eg. 1), a terminal pane id (eg. terminal_1) or a plugin pane id (eg. plugin_1)", + pane_id_str + )), + } + }, CliAction::Detach => Ok(vec![Action::Detach]), CliAction::SwitchSession { name, diff --git a/zellij-utils/src/input/layout.rs b/zellij-utils/src/input/layout.rs index 87a058c5..3f1f72f1 100644 --- a/zellij-utils/src/input/layout.rs +++ b/zellij-utils/src/input/layout.rs @@ -794,6 +794,8 @@ pub struct FloatingPaneLayout { pub already_running: bool, pub pane_initial_contents: Option<String>, pub logical_position: Option<usize>, + pub default_fg: Option<String>, + pub default_bg: Option<String>, } impl FloatingPaneLayout { @@ -811,6 +813,8 @@ impl FloatingPaneLayout { already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, } } pub fn add_cwd_to_layout(&mut self, cwd: &PathBuf) { @@ -855,6 +859,8 @@ pub struct TiledPaneLayout { pub run_instructions_to_ignore: Vec<Option<Run>>, pub hide_floating_panes: bool, // only relevant if this is the base layout pub pane_initial_contents: Option<String>, + pub default_fg: Option<String>, + pub default_bg: Option<String>, } impl TiledPaneLayout { diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_added_to_args_in_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_added_to_args_in_template.snap index 92117f30..bb4010cb 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_added_to_args_in_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_added_to_args_in_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1410 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -38,6 +39,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -69,6 +72,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -82,6 +87,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_override_args_in_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_override_args_in_template.snap index 50cb55ff..9830de48 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_override_args_in_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__args_override_args_in_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1375 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -41,6 +42,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -72,6 +75,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -85,6 +90,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_a_stack_with_an_expanded_pane.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_a_stack_with_an_expanded_pane.snap index b9c0bbf2..688f2b80 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_a_stack_with_an_expanded_pane.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_a_stack_with_an_expanded_pane.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1984 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -30,6 +31,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -46,6 +49,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -62,6 +67,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -75,6 +82,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -88,6 +97,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_node.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_node.snap index 1bc75b25..debfb03f 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_node.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_node.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1952 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -30,6 +31,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -46,6 +49,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -59,6 +64,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -72,6 +79,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_template.snap index 3de11489..35c767a6 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_define_stacked_children_for_pane_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1969 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -34,6 +35,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -50,6 +53,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -63,6 +68,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +83,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -89,6 +98,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap index 164ddb71..a1fcdacc 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__can_load_swap_layouts_from_a_different_file.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1938 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -26,6 +27,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -39,6 +42,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -91,6 +96,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -115,6 +122,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -133,6 +142,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -146,6 +157,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -159,6 +172,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -198,6 +213,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -211,6 +228,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, MaxPanes( 8, @@ -256,6 +275,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -282,6 +303,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -302,6 +325,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -318,6 +343,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -334,6 +361,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -350,6 +379,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -363,6 +394,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -376,6 +409,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -389,6 +424,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -428,6 +465,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -441,6 +480,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, MaxPanes( 12, @@ -486,6 +527,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -512,6 +555,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -532,6 +577,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -548,6 +595,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -564,6 +613,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -580,6 +631,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -593,6 +646,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -613,6 +668,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -629,6 +686,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -645,6 +704,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -661,6 +722,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -674,6 +737,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -687,6 +752,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -700,6 +767,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -739,6 +808,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -752,6 +823,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, }, Some( diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_pane_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_pane_template.snap index d8debed4..56ba1f22 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_pane_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_pane_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1033 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -36,6 +37,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -72,6 +77,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -85,6 +92,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -98,6 +107,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -114,6 +125,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -127,6 +140,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -151,6 +166,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -166,6 +183,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -182,6 +201,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -195,6 +216,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -208,6 +231,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_tab_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_tab_template.snap index 668489c1..3ae6e4a9 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_tab_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__children_not_as_first_child_of_tab_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 985 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -31,6 +32,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -51,6 +54,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -67,6 +72,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -80,6 +87,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -93,6 +102,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -109,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -122,6 +135,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -150,6 +165,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -165,6 +182,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -181,6 +200,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -194,6 +215,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -216,6 +239,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_added_to_close_on_exit_in_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_added_to_close_on_exit_in_template.snap index afde0f8f..8ba07ad3 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_added_to_close_on_exit_in_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_added_to_close_on_exit_in_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1427 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -38,6 +39,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -66,6 +69,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -79,6 +84,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_overrides_close_on_exit_in_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_overrides_close_on_exit_in_template.snap index afde0f8f..032bd843 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_overrides_close_on_exit_in_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__close_on_exit_overrides_close_on_exit_in_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1393 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -38,6 +39,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -66,6 +69,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -79,6 +84,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__combined_tab_and_pane_template_both_with_children.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__combined_tab_and_pane_template_both_with_children.snap index d1eba165..6e99b11c 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__combined_tab_and_pane_template_both_with_children.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__combined_tab_and_pane_template_both_with_children.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1085 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -31,6 +32,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -53,6 +56,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -66,6 +71,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -82,6 +89,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -95,6 +104,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -115,6 +126,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -131,6 +144,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -144,6 +159,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -157,6 +174,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -185,6 +204,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -207,6 +228,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -220,6 +243,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -236,6 +261,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -249,6 +276,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -265,6 +294,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -278,6 +309,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -300,6 +333,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_added_to_cwd_in_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_added_to_cwd_in_template.snap index f506e101..c2b277c1 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_added_to_cwd_in_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_added_to_cwd_in_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1462 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -38,6 +39,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -68,6 +71,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -81,6 +86,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_override_cwd_in_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_override_cwd_in_template.snap index 62a41cf5..30376415 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_override_cwd_in_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__cwd_override_cwd_in_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1445 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -40,6 +41,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -70,6 +73,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -83,6 +88,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__env_var_expansion.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__env_var_expansion.snap index 926c98b9..30b301da 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__env_var_expansion.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__env_var_expansion.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 2230 expression: "format!(\"{layout:#?}\")" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -49,6 +52,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -69,6 +74,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -89,6 +96,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -119,6 +128,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -143,6 +154,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -167,6 +180,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -197,6 +212,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -221,6 +238,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -238,6 +257,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -268,6 +289,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -288,6 +311,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -308,6 +333,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -328,6 +355,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -358,6 +387,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -382,6 +413,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -406,6 +439,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -436,6 +471,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -460,6 +497,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -477,6 +516,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd.snap index 100723b0..4fa28d02 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1847 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -98,6 +105,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_pane_templates.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_pane_templates.snap index a904f8b8..36b254da 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_pane_templates.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_pane_templates.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1868 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -33,6 +34,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -63,6 +66,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -87,6 +92,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -104,6 +111,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -121,6 +130,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -138,6 +149,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -160,6 +173,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_tab_templates.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_tab_templates.snap index c295617a..248d4682 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_tab_templates.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_and_tab_cwd_prepended_to_panes_with_and_without_cwd_in_tab_templates.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1887 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -83,6 +88,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -100,6 +107,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -117,6 +126,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -139,6 +150,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_given_to_panes_without_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_given_to_panes_without_cwd.snap index dd93444f..b6171a49 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_given_to_panes_without_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_given_to_panes_without_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1732 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -106,6 +113,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -136,6 +145,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -153,6 +164,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor.snap index be32b092..aaca18c6 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1765 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -30,6 +31,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -60,6 +63,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -77,6 +82,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor_overrides_global_cwd_in_layout_file.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor_overrides_global_cwd_in_layout_file.snap index 8f71561f..d5067f75 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor_overrides_global_cwd_in_layout_file.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_passed_from_layout_constructor_overrides_global_cwd_in_layout_file.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1786 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -106,6 +113,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -136,6 +145,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -153,6 +164,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_prepended_to_panes_with_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_prepended_to_panes_with_cwd.snap index 5561302c..1666c83b 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_prepended_to_panes_with_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_prepended_to_panes_with_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1745 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -106,6 +113,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -136,6 +145,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -153,6 +164,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_with_tab_cwd_given_to_panes_without_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_with_tab_cwd_given_to_panes_without_cwd.snap index ea72b0f3..e745a99b 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_with_tab_cwd_given_to_panes_without_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__global_cwd_with_tab_cwd_given_to_panes_without_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1802 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -98,6 +105,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_close_on_exit.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_close_on_exit.snap index 54bf2a0c..baf0eca4 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_close_on_exit.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_close_on_exit.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 511 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -38,6 +39,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -51,6 +54,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_start_suspended.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_start_suspended.snap index fb72c8d7..481a74d8 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_start_suspended.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_command_panes_and_start_suspended.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 524 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -38,6 +39,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -51,6 +54,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_default_tab_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_default_tab_template.snap index 5534df4c..abddb5c9 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_default_tab_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_default_tab_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 819 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -27,6 +28,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -47,6 +50,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -63,6 +68,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +83,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -92,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -105,6 +116,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -131,6 +144,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -151,6 +166,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -167,6 +184,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -180,6 +199,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -196,6 +217,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -209,6 +232,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -233,6 +258,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -249,6 +276,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -265,6 +294,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -278,6 +309,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -304,6 +337,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -320,6 +355,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -336,6 +373,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -349,6 +388,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_branched_pane_templates.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_branched_pane_templates.snap index d840f90c..3d267afa 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_branched_pane_templates.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_branched_pane_templates.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 939 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -30,6 +31,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -46,6 +49,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -66,6 +71,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -82,6 +89,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -95,6 +104,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -115,6 +126,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -131,6 +144,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -147,6 +162,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -160,6 +177,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -173,6 +192,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -186,6 +207,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_pane_templates.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_pane_templates.snap index bf4f7934..6f24f2ee 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_pane_templates.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_nested_pane_templates.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 913 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -30,6 +31,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -46,6 +49,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -66,6 +71,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -82,6 +89,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -95,6 +104,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -111,6 +122,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -124,6 +137,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -137,6 +152,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_new_tab_template.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_new_tab_template.snap index 1b32a429..3eb32a53 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_new_tab_template.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_new_tab_template.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 844 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -27,6 +28,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -43,6 +46,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +61,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -82,6 +89,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -98,6 +107,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -111,6 +122,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -131,6 +144,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -161,6 +176,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -177,6 +194,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -190,6 +209,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -203,6 +224,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_excluded_from_sync.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_excluded_from_sync.snap index 81d7fd34..a14262ee 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_excluded_from_sync.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_excluded_from_sync.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1096 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -28,6 +29,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -41,6 +44,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_templates.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_templates.snap index 4cd8c5f6..43965e11 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_templates.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_pane_templates.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 871 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -30,6 +31,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -50,6 +53,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -63,6 +68,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -79,6 +86,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -92,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -112,6 +123,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -132,6 +145,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -148,6 +163,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -161,6 +178,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -177,6 +196,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -190,6 +211,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -210,6 +233,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -230,6 +255,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -246,6 +273,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -259,6 +288,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -275,6 +306,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -288,6 +321,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Vertical, @@ -308,6 +343,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -324,6 +361,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -340,6 +379,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -353,6 +394,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -366,6 +409,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tab_and_pane_templates.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tab_and_pane_templates.snap index c5d1e092..edc76b2e 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tab_and_pane_templates.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tab_and_pane_templates.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 892 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -61,6 +64,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -74,6 +79,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -90,6 +97,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -103,6 +112,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -116,6 +127,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -138,6 +151,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tabs_and_floating_panes.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tabs_and_floating_panes.snap index 87d7ec68..9e7bf8af 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tabs_and_floating_panes.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__layout_with_tabs_and_floating_panes.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 305 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -25,6 +26,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -38,6 +41,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [ FloatingPaneLayout { @@ -53,6 +58,8 @@ Layout { already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, ], ), @@ -77,6 +84,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -90,6 +99,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [ FloatingPaneLayout { @@ -105,6 +116,8 @@ Layout { already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: None, @@ -119,6 +132,8 @@ Layout { already_running: false, pane_initial_contents: None, logical_position: None, + default_fg: None, + default_bg: None, }, ], ), @@ -141,6 +156,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_is_overriden_by_its_consumers_bare_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_is_overriden_by_its_consumers_bare_cwd.snap index 4813f482..f6ffefa0 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_is_overriden_by_its_consumers_bare_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_is_overriden_by_its_consumers_bare_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1616 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -39,6 +40,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -96,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -113,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_overriden_by_its_consumers_command_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_overriden_by_its_consumers_command_cwd.snap index eee14300..7e3cb306 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_overriden_by_its_consumers_command_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_overriden_by_its_consumers_command_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1562 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -39,6 +40,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -96,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -113,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_remains_when_its_consumer_command_does_not_have_a_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_remains_when_its_consumer_command_does_not_have_a_cwd.snap index 68cc0653..91e2f358 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_remains_when_its_consumer_command_does_not_have_a_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_with_cwd_remains_when_its_consumer_command_does_not_have_a_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1579 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -39,6 +40,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -96,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -113,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_is_overriden_by_its_consumers_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_is_overriden_by_its_consumers_cwd.snap index 68cc0653..2d0ca360 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_is_overriden_by_its_consumers_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_is_overriden_by_its_consumers_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1597 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -39,6 +40,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -96,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -113,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_receives_its_consumers_bare_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_receives_its_consumers_bare_cwd.snap index 4813f482..fdbf56a3 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_receives_its_consumers_bare_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_command_without_cwd_receives_its_consumers_bare_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1634 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -39,6 +40,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -96,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -113,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_cwd_overriden_by_its_consumers_bare_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_cwd_overriden_by_its_consumers_bare_cwd.snap index 3663a4de..5bb6ccec 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_cwd_overriden_by_its_consumers_bare_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_cwd_overriden_by_its_consumers_bare_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1652 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -46,6 +49,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -93,6 +100,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_with_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_with_cwd.snap index 4813f482..4e8812fa 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_with_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_with_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1686 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -39,6 +40,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -96,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -113,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_without_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_without_cwd.snap index b6e8054b..5ea6f110 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_without_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_command_without_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1668 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -39,6 +40,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -56,6 +59,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -96,6 +101,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -113,6 +120,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_edit.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_edit.snap index dedbca10..1913b50f 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_edit.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_bare_propagated_to_its_consumer_edit.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1702 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -33,6 +34,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -50,6 +53,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -84,6 +89,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -101,6 +108,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_command_propagated_to_its_consumer_edit.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_command_propagated_to_its_consumer_edit.snap index 407aa8df..f6bbaeed 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_command_propagated_to_its_consumer_edit.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__pane_template_with_command_propagated_to_its_consumer_edit.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1718 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -33,6 +34,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -50,6 +53,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -84,6 +89,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -101,6 +108,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_given_to_panes_without_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_given_to_panes_without_cwd.snap index e281ddf0..8a8e5420 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_given_to_panes_without_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_given_to_panes_without_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1817 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -98,6 +105,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_prepended_to_panes_with_cwd.snap b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_prepended_to_panes_with_cwd.snap index babaab58..1b37491e 100644 --- a/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_prepended_to_panes_with_cwd.snap +++ b/zellij-utils/src/input/unit/snapshots/zellij_utils__input__layout__layout_test__tab_cwd_prepended_to_panes_with_cwd.snap @@ -1,5 +1,6 @@ --- source: zellij-utils/src/input/./unit/layout_test.rs +assertion_line: 1832 expression: "format!(\"{:#?}\", layout)" --- Layout { @@ -29,6 +30,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, TiledPaneLayout { children_split_direction: Horizontal, @@ -59,6 +62,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, ], split_size: None, @@ -76,6 +81,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), @@ -98,6 +105,8 @@ Layout { run_instructions_to_ignore: [], hide_floating_panes: false, pane_initial_contents: None, + default_fg: None, + default_bg: None, }, [], ), diff --git a/zellij-utils/src/ipc/protobuf_conversion.rs b/zellij-utils/src/ipc/protobuf_conversion.rs index 91f64070..1d228340 100644 --- a/zellij-utils/src/ipc/protobuf_conversion.rs +++ b/zellij-utils/src/ipc/protobuf_conversion.rs @@ -740,7 +740,7 @@ impl From<crate::input::actions::Action> ResizeAction, RunAction, SaveSessionAction, ScrollDownAction, ScrollDownAtAction, ScrollToBottomAction, ScrollToTopAction, ScrollUpAction, ScrollUpAtAction, SearchAction, SearchInputAction, SearchToggleOptionAction, SetPaneBorderlessAction, - ShowFloatingPanesAction, SkipConfirmAction, StackPanesAction, + SetPaneColorAction, ShowFloatingPanesAction, SkipConfirmAction, StackPanesAction, StartOrReloadPluginAction, SwitchFocusAction, SwitchModeForAllClientsAction, SwitchSessionAction, SwitchToModeAction, TabNameInputAction, ToggleActiveSyncTabAction, ToggleFloatingPanesAction, ToggleFocusFullscreenAction, ToggleGroupMarkingAction, @@ -1391,6 +1391,13 @@ impl From<crate::input::actions::Action> crate::input::actions::Action::CurrentTabInfo { output_json } => { ActionType::CurrentTabInfo(CurrentTabInfoAction { output_json }) }, + crate::input::actions::Action::SetPaneColor { pane_id, fg, bg } => { + ActionType::SetPaneColor(SetPaneColorAction { + pane_id: Some(pane_id.into()), + fg, + bg, + }) + }, }; Self { @@ -2079,6 +2086,16 @@ impl TryFrom<crate::client_server_contract::client_server_contract::Action> ActionType::ToggleGroupMarking(_) => { Ok(crate::input::actions::Action::ToggleGroupMarking) }, + ActionType::SetPaneColor(set_pane_color_action) => { + Ok(crate::input::actions::Action::SetPaneColor { + pane_id: set_pane_color_action + .pane_id + .ok_or_else(|| anyhow!("SetPaneColor missing pane_id"))? + .try_into()?, + fg: set_pane_color_action.fg, + bg: set_pane_color_action.bg, + }) + }, } } } @@ -3129,6 +3146,8 @@ impl From<crate::input::layout::TiledPaneLayout> is_expanded_in_stack: layout.is_expanded_in_stack, hide_floating_panes: layout.hide_floating_panes, pane_initial_contents: layout.pane_initial_contents, + default_fg: layout.default_fg, + default_bg: layout.default_bg, } } } @@ -3150,6 +3169,8 @@ impl From<crate::input::layout::FloatingPaneLayout> pane_initial_contents: layout.pane_initial_contents, logical_position: layout.logical_position.map(|l| l as u32), borderless: layout.borderless, + default_fg: layout.default_fg, + default_bg: layout.default_bg, } } } @@ -3558,6 +3579,8 @@ impl TryFrom<crate::client_server_contract::client_server_contract::TiledPaneLay run_instructions_to_ignore: vec![], // not represented in protobuf hide_floating_panes: layout.hide_floating_panes, pane_initial_contents: layout.pane_initial_contents, + default_fg: layout.default_fg, + default_bg: layout.default_bg, }) } } @@ -3590,6 +3613,8 @@ impl TryFrom<crate::client_server_contract::client_server_contract::FloatingPane pane_initial_contents: layout.pane_initial_contents, logical_position: layout.logical_position.map(|p| p as usize), borderless: layout.borderless, + default_fg: layout.default_fg, + default_bg: layout.default_bg, }) } } diff --git a/zellij-utils/src/ipc/tests/roundtrip_tests.rs b/zellij-utils/src/ipc/tests/roundtrip_tests.rs index 233a0e5d..fb8e28f8 100644 --- a/zellij-utils/src/ipc/tests/roundtrip_tests.rs +++ b/zellij-utils/src/ipc/tests/roundtrip_tests.rs @@ -1976,6 +1976,8 @@ fn test_client_messages() { already_running: true, pane_initial_contents: Some("pane_initial_contents".to_owned()), logical_position: Some(15), + default_fg: None, + default_bg: None, }, FloatingPaneLayout { name: Some("third floating layout".to_owned()), @@ -2721,6 +2723,26 @@ fn test_client_messages() { client_id: Some(100), is_cli_client: true, }); + test_client_roundtrip!(ClientToServerMsg::Action { + action: Action::SetPaneColor { + pane_id: PaneId::Terminal(0), + fg: Some("#00e000".to_owned()), + bg: Some("#001a3a".to_owned()), + }, + terminal_id: Some(1), + client_id: Some(100), + is_cli_client: true, + }); + test_client_roundtrip!(ClientToServerMsg::Action { + action: Action::SetPaneColor { + pane_id: PaneId::Plugin(2), + fg: None, + bg: None, + }, + terminal_id: Some(1), + client_id: Some(100), + is_cli_client: true, + }); test_client_roundtrip!(ClientToServerMsg::Key { key: KeyWithModifier { bare_key: BareKey::PageDown, @@ -3130,3 +3152,41 @@ fn test_server_messages() { } }); } + +#[test] +fn set_pane_color_wire_roundtrip() { + // Test actual byte-level encode/decode, not just struct conversion + use prost::Message; + + let original = ClientToServerMsg::Action { + action: Action::SetPaneColor { + pane_id: PaneId::Terminal(0), + fg: Some("#00e000".to_owned()), + bg: Some("#001a3a".to_owned()), + }, + terminal_id: Some(1), + client_id: Some(100), + is_cli_client: true, + }; + + // Rust -> proto struct + let proto: crate::client_server_contract::client_server_contract::ClientToServerMsg = + original.clone().into(); + + // proto struct -> bytes (what goes over the wire) + let bytes = proto.encode_to_vec(); + + // bytes -> proto struct (what the server does) + let decoded_proto = + crate::client_server_contract::client_server_contract::ClientToServerMsg::decode( + &bytes[..], + ) + .expect("Failed to decode protobuf bytes"); + + // proto struct -> Rust + let roundtrip: ClientToServerMsg = decoded_proto + .try_into() + .expect("Failed to convert decoded protobuf back to Rust"); + + assert_eq!(original, roundtrip); +} diff --git a/zellij-utils/src/kdl/kdl_layout_parser.rs b/zellij-utils/src/kdl/kdl_layout_parser.rs index 6e1e2c76..ff7fcfe3 100644 --- a/zellij-utils/src/kdl/kdl_layout_parser.rs +++ b/zellij-utils/src/kdl/kdl_layout_parser.rs @@ -106,6 +106,8 @@ impl<'a> KdlLayoutParser<'a> { || property_name == "expanded" || property_name == "exclude_from_sync" || property_name == "contents_file" + || property_name == "default_fg" + || property_name == "default_bg" } fn is_a_valid_floating_pane_property(&self, property_name: &str) -> bool { property_name == "borderless" @@ -124,6 +126,8 @@ impl<'a> KdlLayoutParser<'a> { || property_name == "height" || property_name == "pinned" || property_name == "contents_file" + || property_name == "default_fg" + || property_name == "default_bg" } fn is_a_valid_tab_property(&self, property_name: &str) -> bool { property_name == "focus" @@ -563,6 +567,10 @@ impl<'a> KdlLayoutParser<'a> { kdl_node.span().len(), )); } + let default_fg = kdl_get_string_property_or_child_value_with_error!(kdl_node, "default_fg") + .map(|s| s.to_string()); + let default_bg = kdl_get_string_property_or_child_value_with_error!(kdl_node, "default_bg") + .map(|s| s.to_string()); self.assert_no_mixed_children_and_properties(kdl_node)?; let pane_initial_contents = contents_file.and_then(|contents_file| { self.file_name @@ -585,6 +593,8 @@ impl<'a> KdlLayoutParser<'a> { children_are_stacked, is_expanded_in_stack, pane_initial_contents, + default_fg, + default_bg, ..Default::default() }) } @@ -605,6 +615,10 @@ impl<'a> KdlLayoutParser<'a> { .map(|name| name.to_string()); let contents_file = kdl_get_string_property_or_child_value_with_error!(kdl_node, "contents_file"); + let default_fg = kdl_get_string_property_or_child_value_with_error!(kdl_node, "default_fg") + .map(|s| s.to_string()); + let default_bg = kdl_get_string_property_or_child_value_with_error!(kdl_node, "default_bg") + .map(|s| s.to_string()); self.assert_no_mixed_children_and_properties(kdl_node)?; let pane_initial_contents = contents_file.and_then(|contents_file| { self.file_name @@ -625,6 +639,8 @@ impl<'a> KdlLayoutParser<'a> { pinned, borderless, pane_initial_contents, + default_fg, + default_bg, ..Default::default() }) } diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs index 12eadff6..9fcb3113 100644 --- a/zellij-utils/src/kdl/mod.rs +++ b/zellij-utils/src/kdl/mod.rs @@ -5927,6 +5927,8 @@ impl PaneInfo { plugin_url, is_selectable, index_in_pane_group: Default::default(), // we don't serialize this + default_fg: None, + default_bg: None, }; Ok((tab_position, pane_info)) } @@ -6075,6 +6077,8 @@ fn serialize_and_deserialize_session_info_with_data() { plugin_url: None, is_selectable: true, index_in_pane_group: Default::default(), // we don't serialize this + default_fg: None, + default_bg: None, }, PaneInfo { id: 1, @@ -6100,6 +6104,8 @@ fn serialize_and_deserialize_session_info_with_data() { plugin_url: Some("i_am_a_fake_plugin".to_owned()), is_selectable: true, index_in_pane_group: Default::default(), // we don't serialize this + default_fg: None, + default_bg: None, }, ]; let mut panes = HashMap::new(); diff --git a/zellij-utils/src/plugin_api/action.rs b/zellij-utils/src/plugin_api/action.rs index 5bb58db3..81db2c67 100644 --- a/zellij-utils/src/plugin_api/action.rs +++ b/zellij-utils/src/plugin_api/action.rs @@ -1836,7 +1836,8 @@ impl TryFrom<Action> for ProtobufAction { | Action::SwitchSession { .. } | Action::SaveSession | Action::ListTabs { .. } - | Action::CurrentTabInfo { .. } => Err("Unsupported action"), + | Action::CurrentTabInfo { .. } + | Action::SetPaneColor { .. } => Err("Unsupported action"), } } } @@ -2916,6 +2917,8 @@ impl TryFrom<ProtobufTiledPaneLayout> for TiledPaneLayout { run_instructions_to_ignore, hide_floating_panes: protobuf.hide_floating_panes, pane_initial_contents: protobuf.pane_initial_contents, + default_fg: None, + default_bg: None, }) } } @@ -2972,6 +2975,8 @@ impl TryFrom<ProtobufFloatingPaneLayout> for FloatingPaneLayout { pane_initial_contents: protobuf.pane_initial_contents, logical_position: protobuf.logical_position.map(|p| p as usize), borderless: protobuf.borderless, + default_fg: None, + default_bg: None, }) } } diff --git a/zellij-utils/src/plugin_api/event.proto b/zellij-utils/src/plugin_api/event.proto index 5aa119a9..bbee50a3 100644 --- a/zellij-utils/src/plugin_api/event.proto +++ b/zellij-utils/src/plugin_api/event.proto @@ -406,6 +406,8 @@ message PaneInfo { optional string plugin_url = 21; bool is_selectable = 22; repeated IndexInPaneGroup index_in_pane_group = 23; + optional string default_fg = 24; + optional string default_bg = 25; } message IndexInPaneGroup { diff --git a/zellij-utils/src/plugin_api/event.rs b/zellij-utils/src/plugin_api/event.rs index 3b135b6d..631d5069 100644 --- a/zellij-utils/src/plugin_api/event.rs +++ b/zellij-utils/src/plugin_api/event.rs @@ -1560,6 +1560,8 @@ impl TryFrom<ProtobufPaneInfo> for PaneInfo { ) }) .collect(), + default_fg: protobuf_pane_info.default_fg, + default_bg: protobuf_pane_info.default_bg, }) } } @@ -1603,6 +1605,8 @@ impl TryFrom<PaneInfo> for ProtobufPaneInfo { index: index as u32, }) .collect(), + default_fg: pane_info.default_fg, + default_bg: pane_info.default_bg, }) } } @@ -2511,6 +2515,8 @@ fn serialize_session_update_event_with_non_default_values() { plugin_url: None, is_selectable: true, index_in_pane_group: index_in_pane_group_1, + default_fg: None, + default_bg: None, }, PaneInfo { id: 1, @@ -2536,6 +2542,8 @@ fn serialize_session_update_event_with_non_default_values() { plugin_url: Some("i_am_a_fake_plugin".to_owned()), is_selectable: true, index_in_pane_group: index_in_pane_group_2, + default_fg: None, + default_bg: None, }, ]; panes.insert(0, panes_list); diff --git a/zellij-utils/src/plugin_api/plugin_command.proto b/zellij-utils/src/plugin_api/plugin_command.proto index 7ba3aabe..53e9d729 100644 --- a/zellij-utils/src/plugin_api/plugin_command.proto +++ b/zellij-utils/src/plugin_api/plugin_command.proto @@ -198,6 +198,7 @@ enum CommandName { OpenEditPaneInPlaceOfPaneId = 203; HideFloatingPanes = 204; ShowFloatingPanes = 205; + SetPaneColor = 206; } message PluginCommand { @@ -345,6 +346,7 @@ message PluginCommand { OpenEditPaneInPlaceOfPaneIdPayload open_edit_pane_in_place_of_pane_id_payload = 154; HideFloatingPanesPayload hide_floating_panes_payload = 155; ShowFloatingPanesPayload show_floating_panes_payload = 156; + SetPaneColorPayload set_pane_color_payload = 157; } } @@ -1212,3 +1214,9 @@ message HideFloatingPanesResponse { string error = 2; } } + +message SetPaneColorPayload { + PaneId pane_id = 1; + optional string fg = 2; + optional string bg = 3; +} diff --git a/zellij-utils/src/plugin_api/plugin_command.rs b/zellij-utils/src/plugin_api/plugin_command.rs index c3741591..abd9a994 100644 --- a/zellij-utils/src/plugin_api/plugin_command.rs +++ b/zellij-utils/src/plugin_api/plugin_command.rs @@ -102,7 +102,7 @@ pub use super::generated_api::api::{ SaveLayoutPayload, SaveLayoutResponse as ProtobufSaveLayoutResponse, SaveSessionPayload, SaveSessionResponse as ProtobufSaveSessionResponse, ScrollDownInPaneIdPayload, ScrollToBottomInPaneIdPayload, ScrollToTopInPaneIdPayload, ScrollUpInPaneIdPayload, - SetFloatingPanePinnedPayload, SetPaneBorderlessPayload, + SetFloatingPanePinnedPayload, SetPaneBorderlessPayload, SetPaneColorPayload, SetSelfMouseSelectionSupportPayload, SetTimeoutPayload, ShowCursorPayload, ShowFloatingPanesPayload as ProtobufShowFloatingPanesPayload, ShowFloatingPanesResponse as ProtobufShowFloatingPanesResponse, ShowPaneWithIdPayload, @@ -2423,6 +2423,17 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand { None => Ok(PluginCommand::ShowFloatingPanes { tab_id: None }), _ => Err("Mismatched payload for ShowFloatingPanes"), }, + Some(CommandName::SetPaneColor) => match protobuf_plugin_command.payload { + Some(Payload::SetPaneColorPayload(payload)) => match payload.pane_id { + Some(pane_id) => Ok(PluginCommand::SetPaneColor( + pane_id.try_into()?, + payload.fg, + payload.bg, + )), + None => Err("Malformed SetPaneColor payload"), + }, + _ => Err("Mismatched payload for SetPaneColor"), + }, None => Err("Unrecognized plugin command"), } } @@ -3975,6 +3986,14 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand { }, )), }), + PluginCommand::SetPaneColor(pane_id, fg, bg) => Ok(ProtobufPluginCommand { + name: CommandName::SetPaneColor as i32, + payload: Some(Payload::SetPaneColorPayload(SetPaneColorPayload { + pane_id: Some(pane_id.try_into()?), + fg, + bg, + })), + }), } } } diff --git a/zellij-utils/src/session_serialization.rs b/zellij-utils/src/session_serialization.rs index bb61b42f..bfad7da7 100644 --- a/zellij-utils/src/session_serialization.rs +++ b/zellij-utils/src/session_serialization.rs @@ -36,6 +36,8 @@ pub struct PaneLayoutManifest { pub title: Option<String>, pub is_focused: bool, pub pane_contents: Option<String>, + pub default_fg: Option<String>, + pub default_bg: Option<String>, } pub fn serialize_session_layout( @@ -182,6 +184,16 @@ fn serialize_tiled_pane( ); serialize_tiled_layout_attributes(&layout, ignore_size, &mut tiled_pane_node); + if let Some(ref fg) = layout.default_fg { + tiled_pane_node + .entries_mut() + .push(KdlEntry::new_prop("default_fg", fg.to_owned())); + } + if let Some(ref bg) = layout.default_bg { + tiled_pane_node + .entries_mut() + .push(KdlEntry::new_prop("default_bg", bg.to_owned())); + } let has_child_attributes = !layout.children.is_empty() || layout.external_children_index.is_some() || !args.is_empty() @@ -659,6 +671,16 @@ fn serialize_floating_pane( has_children, &mut floating_pane_node, ); + if let Some(ref fg) = layout.default_fg { + floating_pane_node + .entries_mut() + .push(KdlEntry::new_prop("default_fg", fg.to_owned())); + } + if let Some(ref bg) = layout.default_bg { + floating_pane_node + .entries_mut() + .push(KdlEntry::new_prop("default_bg", bg.to_owned())); + } serialize_start_suspended(&command, &mut floating_pane_node_children); serialize_floating_layout_attributes(&layout, &mut floating_pane_node_children); serialize_args(args, &mut floating_pane_node_children); @@ -709,7 +731,16 @@ fn tiled_pane_layout_from_manifest( manifest: Option<&PaneLayoutManifest>, split_size: Option<SplitSize>, ) -> TiledPaneLayout { - let (run, borderless, is_expanded_in_stack, name, focus, pane_initial_contents) = manifest + let ( + run, + borderless, + is_expanded_in_stack, + name, + focus, + pane_initial_contents, + default_fg, + default_bg, + ) = manifest .map(|g| { let mut run = g.run.clone(); if let Some(cwd) = &g.cwd { @@ -726,9 +757,11 @@ fn tiled_pane_layout_from_manifest( g.title.clone(), Some(g.is_focused), g.pane_contents.clone(), + g.default_fg.clone(), + g.default_bg.clone(), ) }) - .unwrap_or((None, None, false, None, None, None)); + .unwrap_or((None, None, false, None, None, None, None, None)); TiledPaneLayout { split_size, run, @@ -737,6 +770,8 @@ fn tiled_pane_layout_from_manifest( name, focus, pane_initial_contents, + default_fg, + default_bg, ..Default::default() } } @@ -845,6 +880,8 @@ fn get_floating_panes_layout_from_panegeoms( pane_initial_contents: m.pane_contents.clone(), logical_position: None, borderless: Some(m.is_borderless), + default_fg: m.default_fg.clone(), + default_bg: m.default_bg.clone(), } }) .collect() |
