From cafcca0c57696968b609c4f4a8c7a6fe7f2909a8 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Mon, 31 May 2021 21:47:32 +0200 Subject: [PATCH] Move `layout.rs` from `server` to `utils` * give feedback on most errors in the layout-file --- assets/layouts/disable-status-bar.yaml | 8 + src/main.rs | 9 + src/tests/fixtures/htop | Bin 16234 -> 16236 bytes src/tests/integration/basic.rs | 14 ++ src/tests/integration/close_pane.rs | 13 ++ src/tests/integration/compatibility.rs | 20 +++ src/tests/integration/layouts.rs | 7 + src/tests/integration/move_focus_down.rs | 2 + src/tests/integration/move_focus_left.rs | 3 + src/tests/integration/move_focus_right.rs | 3 + src/tests/integration/move_focus_up.rs | 2 + src/tests/integration/resize_down.rs | 13 ++ src/tests/integration/resize_left.rs | 13 ++ src/tests/integration/resize_right.rs | 13 ++ src/tests/integration/resize_up.rs | 13 ++ src/tests/integration/tabs.rs | 8 + .../integration/terminal_window_resize.rs | 4 + src/tests/integration/toggle_fullscreen.rs | 2 + src/tests/mod.rs | 14 +- zellij-client/src/lib.rs | 23 ++- zellij-server/src/lib.rs | 28 +-- zellij-server/src/pty.rs | 2 +- zellij-server/src/screen.rs | 3 +- zellij-server/src/tab.rs | 8 +- zellij-server/src/ui/mod.rs | 1 - .../ui => zellij-utils/src/input}/layout.rs | 167 +++++++++++------- zellij-utils/src/input/mod.rs | 1 + zellij-utils/src/ipc.rs | 4 +- 28 files changed, 291 insertions(+), 107 deletions(-) create mode 100644 assets/layouts/disable-status-bar.yaml rename {zellij-server/src/ui => zellij-utils/src/input}/layout.rs (80%) diff --git a/assets/layouts/disable-status-bar.yaml b/assets/layouts/disable-status-bar.yaml new file mode 100644 index 00000000..fd9c97da --- /dev/null +++ b/assets/layouts/disable-status-bar.yaml @@ -0,0 +1,8 @@ +--- +direction: Horizontal +parts: + - direction: Vertical + split_size: + Fixed: 1 + plugin: tab-bar + - direction: Vertical diff --git a/src/main.rs b/src/main.rs index 97ad3dee..1c0dc390 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use zellij_utils::{ cli::{CliArgs, Command, Sessions}, consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR}, input::config::Config, + input::layout::Layout, input::options::Options, logging::*, setup::{get_default_data_dir, Setup}, @@ -72,6 +73,7 @@ pub fn main() { opts, config, ClientInfo::Attach(session_name.unwrap(), force, config_options), + None, ); } else { let session_name = opts @@ -85,11 +87,18 @@ pub fn main() { #[cfg(not(disable_automatic_asset_installation))] populate_data_dir(&data_dir); + let layout = Layout::from_path_or_default( + opts.layout.as_ref(), + opts.layout_path.as_ref(), + &data_dir, + ); + start_client( Box::new(os_input), opts, config, ClientInfo::New(session_name), + layout, ); } } diff --git a/src/tests/fixtures/htop b/src/tests/fixtures/htop index 37ee0777175ef96c63168734eb7e21e634750b8a..dab2b7833766ead1318a4a25252596a6500f0369 100644 GIT binary patch delta 10 RcmaD=_oi+`mOT?M7XTl|1VsP< delta 7 OcmaD;_o{9~mOTIy90V)? diff --git a/src/tests/integration/basic.rs b/src/tests/integration/basic.rs index 640b1c55..bd178701 100644 --- a/src/tests/integration/basic.rs +++ b/src/tests/integration/basic.rs @@ -33,6 +33,7 @@ pub fn starts_with_one_terminal() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -61,6 +62,7 @@ pub fn split_terminals_vertically() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -89,6 +91,7 @@ pub fn split_terminals_horizontally() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -124,6 +127,7 @@ pub fn split_largest_terminal() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -152,6 +156,7 @@ pub fn cannot_split_terminals_vertically_when_active_terminal_is_too_small() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -180,6 +185,7 @@ pub fn cannot_split_terminals_horizontally_when_active_terminal_is_too_small() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -208,6 +214,7 @@ pub fn cannot_split_largest_terminal_when_there_is_no_room() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -244,6 +251,7 @@ pub fn scrolling_up_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -282,6 +290,7 @@ pub fn scrolling_down_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -317,6 +326,7 @@ pub fn scrolling_page_up_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -355,6 +365,7 @@ pub fn scrolling_page_down_inside_a_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -394,6 +405,7 @@ pub fn max_panes() { opts, Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -431,6 +443,7 @@ pub fn toggle_focused_pane_fullscreen() { opts, Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -471,6 +484,7 @@ pub fn bracketed_paste() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/close_pane.rs b/src/tests/integration/close_pane.rs index 59881514..b9af7bcc 100644 --- a/src/tests/integration/close_pane.rs +++ b/src/tests/integration/close_pane.rs @@ -46,6 +46,7 @@ pub fn close_pane_with_another_pane_above_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -89,6 +90,7 @@ pub fn close_pane_with_another_pane_below_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -129,6 +131,7 @@ pub fn close_pane_with_another_pane_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -170,6 +173,7 @@ pub fn close_pane_with_another_pane_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -216,6 +220,7 @@ pub fn close_pane_with_multiple_panes_above_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -260,6 +265,7 @@ pub fn close_pane_with_multiple_panes_below_it() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -306,6 +312,7 @@ pub fn close_pane_with_multiple_panes_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -350,6 +357,7 @@ pub fn close_pane_with_multiple_panes_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -417,6 +425,7 @@ pub fn close_pane_with_multiple_panes_above_it_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -480,6 +489,7 @@ pub fn close_pane_with_multiple_panes_below_it_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -545,6 +555,7 @@ pub fn close_pane_with_multiple_panes_to_the_left_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -610,6 +621,7 @@ pub fn close_pane_with_multiple_panes_to_the_right_away_from_screen_edges() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -647,6 +659,7 @@ pub fn closing_last_pane_exits_app() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index ec983b09..d3bbccba 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -49,6 +49,7 @@ pub fn run_bandwhich_from_fish_shell() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -78,6 +79,7 @@ pub fn fish_tab_completion_options() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -112,6 +114,7 @@ pub fn fish_select_tab_completion_options() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -150,6 +153,7 @@ pub fn vim_scroll_region_down() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -185,6 +189,7 @@ pub fn vim_ctrl_d() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -219,6 +224,7 @@ pub fn vim_ctrl_u() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -248,6 +254,7 @@ pub fn htop() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -277,6 +284,7 @@ pub fn htop_scrolling() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -306,6 +314,7 @@ pub fn htop_right_scrolling() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -343,6 +352,7 @@ pub fn vim_overwrite() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -375,6 +385,7 @@ pub fn clear_scroll_region() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -404,6 +415,7 @@ pub fn display_tab_characters_properly() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -433,6 +445,7 @@ pub fn neovim_insert_mode() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -464,6 +477,7 @@ pub fn bash_cursor_linewrap() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -495,6 +509,7 @@ pub fn fish_paste_multiline() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -524,6 +539,7 @@ pub fn git_log() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -555,6 +571,7 @@ pub fn git_diff_scrollup() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -584,6 +601,7 @@ pub fn emacs_longbuf() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -613,6 +631,7 @@ pub fn top_and_quit() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -648,6 +667,7 @@ pub fn exa_plus_omf_theme() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/layouts.rs b/src/tests/integration/layouts.rs index e6986924..9a97170b 100644 --- a/src/tests/integration/layouts.rs +++ b/src/tests/integration/layouts.rs @@ -29,11 +29,18 @@ pub fn accepts_basic_layout() { "src/tests/fixtures/layouts/three-panes-with-nesting.yaml", )); + let layout = zellij_utils::input::layout::Layout::from_path_or_default( + None, + opts.layout_path.as_ref(), + std::path::Path::new("unused"), + ); + start( Box::new(fake_input_output.clone()), opts, Box::new(fake_input_output.clone()), Config::default(), + layout, ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/move_focus_down.rs b/src/tests/integration/move_focus_down.rs index 2f18ab62..50789739 100644 --- a/src/tests/integration/move_focus_down.rs +++ b/src/tests/integration/move_focus_down.rs @@ -38,6 +38,7 @@ pub fn move_focus_down() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -75,6 +76,7 @@ pub fn move_focus_down_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_left.rs b/src/tests/integration/move_focus_left.rs index a9fca49e..d33ccffa 100644 --- a/src/tests/integration/move_focus_left.rs +++ b/src/tests/integration/move_focus_left.rs @@ -38,6 +38,7 @@ pub fn move_focus_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -76,6 +77,7 @@ pub fn move_focus_left_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -114,6 +116,7 @@ pub fn move_focus_left_changes_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_right.rs b/src/tests/integration/move_focus_right.rs index c85d5b96..62e2a0df 100644 --- a/src/tests/integration/move_focus_right.rs +++ b/src/tests/integration/move_focus_right.rs @@ -39,6 +39,7 @@ pub fn move_focus_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -76,6 +77,7 @@ pub fn move_focus_right_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -114,6 +116,7 @@ pub fn move_focus_right_changes_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/move_focus_up.rs b/src/tests/integration/move_focus_up.rs index d161ff8a..17dced0b 100644 --- a/src/tests/integration/move_focus_up.rs +++ b/src/tests/integration/move_focus_up.rs @@ -37,6 +37,7 @@ pub fn move_focus_up() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -75,6 +76,7 @@ pub fn move_focus_up_to_the_most_recently_used_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_down.rs b/src/tests/integration/resize_down.rs index e5d35c26..ee439b63 100644 --- a/src/tests/integration/resize_down.rs +++ b/src/tests/integration/resize_down.rs @@ -49,6 +49,7 @@ pub fn resize_down_with_pane_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -94,6 +95,7 @@ pub fn resize_down_with_pane_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -145,6 +147,7 @@ pub fn resize_down_with_panes_above_and_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -195,6 +198,7 @@ pub fn resize_down_with_multiple_panes_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -247,6 +251,7 @@ pub fn resize_down_with_panes_above_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -298,6 +303,7 @@ pub fn resize_down_with_panes_below_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -347,6 +353,7 @@ pub fn resize_down_with_panes_above_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -397,6 +404,7 @@ pub fn resize_down_with_panes_below_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -451,6 +459,7 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -507,6 +516,7 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -581,6 +591,7 @@ pub fn resize_down_with_panes_above_aligned_left_and_right_with_panes_to_the_lef CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -656,6 +667,7 @@ pub fn resize_down_with_panes_below_aligned_left_and_right_with_to_the_left_and_ CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -698,6 +710,7 @@ pub fn cannot_resize_down_when_pane_below_is_at_minimum_height() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_left.rs b/src/tests/integration/resize_left.rs index 564d5c60..950bacd7 100644 --- a/src/tests/integration/resize_left.rs +++ b/src/tests/integration/resize_left.rs @@ -45,6 +45,7 @@ pub fn resize_left_with_pane_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -88,6 +89,7 @@ pub fn resize_left_with_pane_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -133,6 +135,7 @@ pub fn resize_left_with_panes_to_the_left_and_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -181,6 +184,7 @@ pub fn resize_left_with_multiple_panes_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -231,6 +235,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -278,6 +283,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -327,6 +333,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -375,6 +382,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -429,6 +437,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_current_pa CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -485,6 +494,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_current_p CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -558,6 +568,7 @@ pub fn resize_left_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abov CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -633,6 +644,7 @@ pub fn resize_left_with_panes_to_the_right_aligned_top_and_bottom_with_panes_abo CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -675,6 +687,7 @@ pub fn cannot_resize_left_when_pane_to_the_left_is_at_minimum_width() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_right.rs b/src/tests/integration/resize_right.rs index 716ed128..dd100cc0 100644 --- a/src/tests/integration/resize_right.rs +++ b/src/tests/integration/resize_right.rs @@ -45,6 +45,7 @@ pub fn resize_right_with_pane_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -88,6 +89,7 @@ pub fn resize_right_with_pane_to_the_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -133,6 +135,7 @@ pub fn resize_right_with_panes_to_the_left_and_right() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -181,6 +184,7 @@ pub fn resize_right_with_multiple_panes_to_the_left() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -231,6 +235,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -278,6 +283,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -327,6 +333,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -375,6 +382,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_bottom_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -429,6 +437,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_current_p CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -485,6 +494,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_current_ CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -558,6 +568,7 @@ pub fn resize_right_with_panes_to_the_left_aligned_top_and_bottom_with_panes_abo CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -632,6 +643,7 @@ pub fn resize_right_with_panes_to_the_right_aligned_top_and_bottom_with_panes_ab CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -674,6 +686,7 @@ pub fn cannot_resize_right_when_pane_to_the_left_is_at_minimum_width() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/resize_up.rs b/src/tests/integration/resize_up.rs index 0097756a..186365ac 100644 --- a/src/tests/integration/resize_up.rs +++ b/src/tests/integration/resize_up.rs @@ -47,6 +47,7 @@ pub fn resize_up_with_pane_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -92,6 +93,7 @@ pub fn resize_up_with_pane_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -142,6 +144,7 @@ pub fn resize_up_with_panes_above_and_below() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -191,6 +194,7 @@ pub fn resize_up_with_multiple_panes_above() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -241,6 +245,7 @@ pub fn resize_up_with_panes_above_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -292,6 +297,7 @@ pub fn resize_up_with_panes_below_aligned_left_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -341,6 +347,7 @@ pub fn resize_up_with_panes_above_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -391,6 +398,7 @@ pub fn resize_up_with_panes_below_aligned_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -445,6 +453,7 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -501,6 +510,7 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_current_pane() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -575,6 +585,7 @@ pub fn resize_up_with_panes_above_aligned_left_and_right_with_panes_to_the_left_ CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -650,6 +661,7 @@ pub fn resize_up_with_panes_below_aligned_left_and_right_with_to_the_left_and_ri CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -692,6 +704,7 @@ pub fn cannot_resize_up_when_pane_above_is_at_minimum_height() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/tabs.rs b/src/tests/integration/tabs.rs index 90f82c6d..36b95f85 100644 --- a/src/tests/integration/tabs.rs +++ b/src/tests/integration/tabs.rs @@ -40,6 +40,7 @@ pub fn open_new_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -76,6 +77,7 @@ pub fn switch_to_prev_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -112,6 +114,7 @@ pub fn switch_to_next_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -148,6 +151,7 @@ pub fn close_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -185,6 +189,7 @@ pub fn close_last_pane_in_a_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -224,6 +229,7 @@ pub fn close_the_middle_tab() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -268,6 +274,7 @@ pub fn close_the_tab_that_has_a_pane_in_fullscreen() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -304,6 +311,7 @@ pub fn closing_last_tab_exits_the_app() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/integration/terminal_window_resize.rs b/src/tests/integration/terminal_window_resize.rs index 2be41c3a..a69891ab 100644 --- a/src/tests/integration/terminal_window_resize.rs +++ b/src/tests/integration/terminal_window_resize.rs @@ -36,6 +36,7 @@ pub fn window_width_decrease_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -72,6 +73,7 @@ pub fn window_width_increase_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -108,6 +110,7 @@ pub fn window_height_increase_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer @@ -144,6 +147,7 @@ pub fn window_width_and_height_decrease_with_one_pane() { opts, Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output .stdout_writer diff --git a/src/tests/integration/toggle_fullscreen.rs b/src/tests/integration/toggle_fullscreen.rs index 80257982..b3cf1493 100644 --- a/src/tests/integration/toggle_fullscreen.rs +++ b/src/tests/integration/toggle_fullscreen.rs @@ -38,6 +38,7 @@ pub fn adding_new_terminal_in_fullscreen() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output @@ -73,6 +74,7 @@ pub fn move_focus_is_disabled_in_fullscreen() { CliArgs::default(), Box::new(fake_input_output.clone()), Config::default(), + None, ); let output_frames = fake_input_output diff --git a/src/tests/mod.rs b/src/tests/mod.rs index e075ed49..014246d1 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -7,13 +7,17 @@ pub mod utils; use std::path::PathBuf; use zellij_client::{os_input_output::ClientOsApi, start_client, ClientInfo}; use zellij_server::{os_input_output::ServerOsApi, start_server}; -use zellij_utils::{cli::CliArgs, input::config::Config}; +use zellij_utils::{ + cli::CliArgs, + input::{config::Config, layout::Layout}, +}; pub fn start( client_os_input: Box, opts: CliArgs, server_os_input: Box, config: Config, + layout: Option, ) { let server_thread = std::thread::Builder::new() .name("server_thread".into()) @@ -21,6 +25,12 @@ pub fn start( start_server(server_os_input, PathBuf::from("")); }) .unwrap(); - start_client(client_os_input, opts, config, ClientInfo::New("".into())); + start_client( + client_os_input, + opts, + config, + ClientInfo::New("".into()), + layout, + ); let _ = server_thread.join(); } diff --git a/zellij-client/src/lib.rs b/zellij-client/src/lib.rs index ece154ea..83121b67 100644 --- a/zellij-client/src/lib.rs +++ b/zellij-client/src/lib.rs @@ -18,7 +18,7 @@ use zellij_utils::{ channels::{self, ChannelWithContext, SenderWithContext}, consts::{SESSION_NAME, ZELLIJ_IPC_PIPE}, errors::{ClientContext, ContextType, ErrorInstruction}, - input::{actions::Action, config::Config, options::Options}, + input::{actions::Action, config::Config, layout::Layout, options::Options}, ipc::{ClientAttributes, ClientToServerMsg, ExitReason, ServerToClientMsg}, }; @@ -86,19 +86,13 @@ pub fn start_client( opts: CliArgs, config: Config, info: ClientInfo, + layout: Option, ) { let clear_client_terminal_attributes = "\u{1b}[?1l\u{1b}=\u{1b}[r\u{1b}12l\u{1b}[?1000l\u{1b}[?1002l\u{1b}[?1003l\u{1b}[?1005l\u{1b}[?1006l\u{1b}[?12l"; let take_snapshot = "\u{1b}[?1049h"; let bracketed_paste = "\u{1b}[?2004h"; os_input.unset_raw_mode(0); - let config_options = Options::from_cli(&config.options, opts.command.clone()); - let palette = config.themes.clone().map_or_else( - || os_input.load_palette(), - |t| { - t.theme_config(&config_options) - .unwrap_or_else(|| os_input.load_palette()) - }, - ); + let _ = os_input .get_stdout_writer() .write(take_snapshot.as_bytes()) @@ -109,6 +103,15 @@ pub fn start_client( .unwrap(); std::env::set_var(&"ZELLIJ", "0"); + let config_options = Options::from_cli(&config.options, opts.command.clone()); + let palette = config.themes.clone().map_or_else( + || os_input.load_palette(), + |t| { + t.theme_config(&config_options) + .unwrap_or_else(|| os_input.load_palette()) + }, + ); + let full_screen_ws = os_input.get_terminal_size_using_fd(0); let client_attributes = ClientAttributes { position_and_size: full_screen_ws, @@ -133,6 +136,7 @@ pub fn start_client( client_attributes, Box::new(opts), Box::new(config_options.clone()), + layout, ) } }; @@ -143,6 +147,7 @@ pub fn start_client( client_attributes, Box::new(opts), Box::new(config_options.clone()), + layout, ) }; diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs index 1691420e..3ffd760d 100644 --- a/zellij-server/src/lib.rs +++ b/zellij-server/src/lib.rs @@ -22,7 +22,6 @@ use crate::{ pty::{pty_thread_main, Pty, PtyInstruction}, screen::{screen_thread_main, ScreenInstruction}, thread_bus::{Bus, ThreadSenders}, - ui::layout::Layout, wasm_vm::{wasm_thread_main, PluginInstruction}, }; use route::route_thread_main; @@ -30,7 +29,7 @@ use zellij_utils::{ channels::{self, ChannelWithContext, SenderWithContext}, cli::CliArgs, errors::{ContextType, ErrorInstruction, ServerContext}, - input::{get_mode_info, options::Options}, + input::{get_mode_info, layout::Layout, options::Options}, ipc::{ClientAttributes, ClientToServerMsg, ExitReason, ServerToClientMsg}, setup::get_default_data_dir, }; @@ -38,7 +37,7 @@ use zellij_utils::{ /// Instructions related to server-side application #[derive(Debug, Clone)] pub(crate) enum ServerInstruction { - NewClient(ClientAttributes, Box, Box), + NewClient(ClientAttributes, Box, Box, Option), Render(Option), UnblockInputThread, ClientExit, @@ -50,8 +49,8 @@ pub(crate) enum ServerInstruction { impl From for ServerInstruction { fn from(instruction: ClientToServerMsg) -> Self { match instruction { - ClientToServerMsg::NewClient(attrs, opts, options) => { - ServerInstruction::NewClient(attrs, opts, options) + ClientToServerMsg::NewClient(attrs, opts, options, layout) => { + ServerInstruction::NewClient(attrs, opts, options, layout) } ClientToServerMsg::AttachClient(attrs, force, options) => { ServerInstruction::AttachClient(attrs, force, options) @@ -206,7 +205,7 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { let (instruction, mut err_ctx) = server_receiver.recv().unwrap(); err_ctx.add_call(ContextType::IPCServer((&instruction).into())); match instruction { - ServerInstruction::NewClient(client_attributes, opts, config_options) => { + ServerInstruction::NewClient(client_attributes, opts, config_options, layout) => { let session = init_session( os_input.clone(), opts, @@ -214,6 +213,7 @@ pub fn start_server(os_input: Box, socket_path: PathBuf) { to_server.clone(), client_attributes, session_state.clone(), + layout, ); *session_data.write().unwrap() = Some(session); *session_state.write().unwrap() = SessionState::Attached; @@ -301,6 +301,7 @@ fn init_session( to_server: SenderWithContext, client_attributes: ClientAttributes, session_state: Arc>, + layout: Option, ) -> SessionMetaData { let (to_screen, screen_receiver): ChannelWithContext = channels::unbounded(); let to_screen = SenderWithContext::new(to_screen); @@ -321,19 +322,6 @@ fn init_session( arrow_fonts: config_options.simplified_ui, }; - // Don't use default layouts in tests, but do everywhere else - #[cfg(not(any(feature = "test", test)))] - let default_layout = Some(PathBuf::from("default")); - #[cfg(any(feature = "test", test))] - let default_layout = None; - let layout_path = opts.layout_path; - let maybe_layout = opts - .layout - .as_ref() - .map(|p| Layout::from_dir(&p, &data_dir)) - .or_else(|| layout_path.map(|p| Layout::new(&p))) - .or_else(|| default_layout.map(|p| Layout::from_dir(&p, &data_dir))); - let pty_thread = thread::Builder::new() .name("pty".to_string()) .spawn({ @@ -349,7 +337,7 @@ fn init_session( opts.debug, ); - move || pty_thread_main(pty, maybe_layout) + move || pty_thread_main(pty, layout) }) .unwrap(); diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index 41f9d1a9..ea3d01a8 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -12,12 +12,12 @@ use crate::{ panes::PaneId, screen::ScreenInstruction, thread_bus::{Bus, ThreadSenders}, - ui::layout::Layout, wasm_vm::PluginInstruction, ServerInstruction, }; use zellij_utils::{ errors::{get_current_ctx, ContextType, PtyContext}, + input::layout::Layout, logging::debug_to_file, }; diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 48be44bf..2c960d17 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -5,14 +5,13 @@ use std::os::unix::io::RawFd; use std::str; use std::sync::{Arc, RwLock}; -use zellij_utils::zellij_tile; +use zellij_utils::{input::layout::Layout, zellij_tile}; use crate::{ panes::PaneId, pty::{PtyInstruction, VteBytes}, tab::Tab, thread_bus::Bus, - ui::layout::Layout, wasm_vm::PluginInstruction, ServerInstruction, SessionState, }; diff --git a/zellij-server/src/tab.rs b/zellij-server/src/tab.rs index 7daf2092..ba2aca46 100644 --- a/zellij-server/src/tab.rs +++ b/zellij-server/src/tab.rs @@ -8,7 +8,7 @@ use crate::{ panes::{PaneId, PluginPane, TerminalPane}, pty::{PtyInstruction, VteBytes}, thread_bus::ThreadSenders, - ui::{boundaries::Boundaries, layout::Layout, pane_resizer::PaneResizer}, + ui::{boundaries::Boundaries, pane_resizer::PaneResizer}, wasm_vm::PluginInstruction, ServerInstruction, SessionState, }; @@ -21,7 +21,11 @@ use std::{ collections::{BTreeMap, HashSet}, }; use zellij_tile::data::{Event, InputMode, ModeInfo, Palette}; -use zellij_utils::{input::parse_keys, pane_size::PositionAndSize, shared::adjust_to_size}; +use zellij_utils::{ + input::{layout::Layout, parse_keys}, + pane_size::PositionAndSize, + shared::adjust_to_size, +}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this diff --git a/zellij-server/src/ui/mod.rs b/zellij-server/src/ui/mod.rs index 1e4c85fd..b2d94d16 100644 --- a/zellij-server/src/ui/mod.rs +++ b/zellij-server/src/ui/mod.rs @@ -1,3 +1,2 @@ pub mod boundaries; -pub mod layout; pub mod pane_resizer; diff --git a/zellij-server/src/ui/layout.rs b/zellij-utils/src/input/layout.rs similarity index 80% rename from zellij-server/src/ui/layout.rs rename to zellij-utils/src/input/layout.rs index a9af665f..ce562d2b 100644 --- a/zellij-server/src/ui/layout.rs +++ b/zellij-utils/src/input/layout.rs @@ -1,10 +1,107 @@ -use zellij_utils::{serde, serde_yaml}; +//! The layout system. +// Layouts have been moved from [`zellij-server`] to +// [`zellij-utils`] in order to provide more helpful +// error messages to the user until a more general +// logging system is in place. +// In case there is a logging system in place evaluate, +// if [`zellij-utils`], or [`zellij-server`] is a proper +// place. +// If plugins should be able to depend on the layout system +// then [`zellij-utils`] could be a proper place. +use crate::{input::config::ConfigError, pane_size::PositionAndSize}; +use crate::{serde, serde_yaml}; use serde::{Deserialize, Serialize}; use std::path::{Path, PathBuf}; use std::{fs::File, io::prelude::*}; -use zellij_utils::pane_size::PositionAndSize; +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(crate = "self::serde")] +pub enum Direction { + Horizontal, + Vertical, +} + +#[derive(Debug, Serialize, Deserialize, Clone, Copy)] +#[serde(crate = "self::serde")] +pub enum SplitSize { + Percent(u8), // 1 to 100 + Fixed(u16), // An absolute number of columns or rows +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(crate = "self::serde")] +pub struct Layout { + pub direction: Direction, + #[serde(default)] + pub parts: Vec, + pub split_size: Option, + pub plugin: Option, +} + +type LayoutResult = Result; + +impl Layout { + pub fn new(layout_path: &Path) -> LayoutResult { + let mut layout_file = File::open(&layout_path) + .or_else(|_| File::open(&layout_path.with_extension("yaml"))) + .map_err(|e| ConfigError::IoPath(e, layout_path.into()))?; + + let mut layout = String::new(); + layout_file.read_to_string(&mut layout)?; + let layout: Layout = serde_yaml::from_str(&layout)?; + Ok(layout) + } + + // It wants to use Path here, but that doesn't compile. + #[allow(clippy::ptr_arg)] + pub fn from_dir(layout: &PathBuf, data_dir: &Path) -> LayoutResult { + Self::new(&data_dir.join("layouts/").join(layout)) + } + + pub fn from_path_or_default( + layout: Option<&PathBuf>, + layout_path: Option<&PathBuf>, + data_dir: &Path, + ) -> Option { + let layout_result = layout + .map(|p| Layout::from_dir(&p, &data_dir)) + .or_else(|| layout_path.map(|p| Layout::new(&p))) + .or_else(|| { + Some(Layout::from_dir( + &std::path::PathBuf::from("default"), + &data_dir, + )) + }); + + match layout_result { + None => None, + Some(Ok(layout)) => Some(layout), + Some(Err(e)) => { + eprintln!("There was an error in the layout file:\n{}", e); + std::process::exit(1); + } + } + } + + pub fn total_terminal_panes(&self) -> usize { + let mut total_panes = 0; + total_panes += self.parts.len(); + for part in self.parts.iter() { + if part.plugin.is_none() { + total_panes += part.total_terminal_panes(); + } + } + total_panes + } + + pub fn position_panes_in_space( + &self, + space: &PositionAndSize, + ) -> Vec<(Layout, PositionAndSize)> { + split_space(space, &self) + } +} fn split_space_to_parts_vertically( space_to_split: &PositionAndSize, @@ -167,69 +264,3 @@ fn split_space( } pane_positions } - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(crate = "self::serde")] -pub(crate) enum Direction { - Horizontal, - Vertical, -} - -#[derive(Debug, Serialize, Deserialize, Clone, Copy)] -#[serde(crate = "self::serde")] -pub(crate) enum SplitSize { - Percent(u8), // 1 to 100 - Fixed(u16), // An absolute number of columns or rows -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(crate = "self::serde")] -pub(crate) struct Layout { - pub direction: Direction, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub parts: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - pub split_size: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub plugin: Option, -} - -impl Layout { - pub fn new(layout_path: &Path) -> Self { - let mut layout_file = File::open(&layout_path) - .or_else(|_| File::open(&layout_path.with_extension("yaml"))) - .unwrap_or_else(|_| panic!("cannot find layout {}", &layout_path.display())); - - let mut layout = String::new(); - layout_file - .read_to_string(&mut layout) - .unwrap_or_else(|_| panic!("could not read layout {}", &layout_path.display())); - let layout: Layout = serde_yaml::from_str(&layout) - .unwrap_or_else(|_| panic!("could not parse layout {}", &layout_path.display())); - layout - } - - // It wants to use Path here, but that doesn't compile. - #[allow(clippy::ptr_arg)] - pub fn from_dir(layout: &PathBuf, data_dir: &Path) -> Self { - Self::new(&data_dir.join("layouts/").join(layout)) - } - - pub fn total_terminal_panes(&self) -> usize { - let mut total_panes = 0; - total_panes += self.parts.len(); - for part in self.parts.iter() { - if part.plugin.is_none() { - total_panes += part.total_terminal_panes(); - } - } - total_panes - } - - pub fn position_panes_in_space( - &self, - space: &PositionAndSize, - ) -> Vec<(Layout, PositionAndSize)> { - split_space(space, &self) - } -} diff --git a/zellij-utils/src/input/mod.rs b/zellij-utils/src/input/mod.rs index 93a1d225..9250cad5 100644 --- a/zellij-utils/src/input/mod.rs +++ b/zellij-utils/src/input/mod.rs @@ -3,6 +3,7 @@ pub mod actions; pub mod config; pub mod keybinds; +pub mod layout; pub mod options; pub mod theme; diff --git a/zellij-utils/src/ipc.rs b/zellij-utils/src/ipc.rs index 3d75f8a7..3fd2b243 100644 --- a/zellij-utils/src/ipc.rs +++ b/zellij-utils/src/ipc.rs @@ -4,7 +4,7 @@ use crate::cli::CliArgs; use crate::pane_size::PositionAndSize; use crate::{ errors::{get_current_ctx, ErrorContext}, - input::{actions::Action, options::Options}, + input::{actions::Action, layout::Layout, options::Options}, }; use interprocess::local_socket::LocalSocketStream; use nix::unistd::dup; @@ -56,7 +56,7 @@ pub enum ClientToServerMsg { // Disconnect from the session we're connected to DisconnectFromSession,*/ TerminalResize(PositionAndSize), - NewClient(ClientAttributes, Box, Box), + NewClient(ClientAttributes, Box, Box, Option), AttachClient(ClientAttributes, bool, Options), Action(Action), ClientExited,