diff options
| author | Aram Drevekenin <aram@poor.dev> | 2021-08-24 10:58:36 +0200 |
|---|---|---|
| committer | Aram Drevekenin <aram@poor.dev> | 2021-08-24 10:58:36 +0200 |
| commit | 618c2c376bb4edca8693ea4b871279bc04501559 (patch) | |
| tree | b4d4426b353955e8af1ed8ad6531f95860eda5f6 /zellij-server/src | |
| parent | docs(changelog): add `ToggleTab` action (diff) | |
| parent | Add `template` section in `layout` file (diff) | |
| download | sl0ppij-618c2c376bb4edca8693ea4b871279bc04501559.tar.gz sl0ppij-618c2c376bb4edca8693ea4b871279bc04501559.tar.xz sl0ppij-618c2c376bb4edca8693ea4b871279bc04501559.zip | |
Merge branch 'tab-layout' of https://github.com/a-kenji/zellij into a-kenji-tab-layout
Diffstat (limited to 'zellij-server/src')
| -rw-r--r-- | zellij-server/src/lib.rs | 57 | ||||
| -rw-r--r-- | zellij-server/src/pty.rs | 15 | ||||
| -rw-r--r-- | zellij-server/src/route.rs | 4 |
3 files changed, 52 insertions, 24 deletions
diff --git a/zellij-server/src/lib.rs b/zellij-server/src/lib.rs index 690304bb..d0b3b5d2 100644 --- a/zellij-server/src/lib.rs +++ b/zellij-server/src/lib.rs @@ -11,11 +11,13 @@ mod ui; mod wasm_vm; use log::info; +use std::{ + path::PathBuf, + sync::{Arc, Mutex, RwLock}, + thread, +}; use zellij_utils::zellij_tile; -use std::path::PathBuf; -use std::sync::{Arc, Mutex, RwLock}; -use std::thread; use wasmer::Store; use zellij_tile::data::{Event, Palette, PluginCapabilities}; @@ -34,7 +36,7 @@ use zellij_utils::{ input::{ command::{RunCommand, TerminalAction}, get_mode_info, - layout::Layout, + layout::LayoutTemplate, options::Options, }, ipc::{ClientAttributes, ClientToServerMsg, ExitReason, ServerToClientMsg}, @@ -44,7 +46,12 @@ use zellij_utils::{ /// Instructions related to server-side application #[derive(Debug, Clone)] pub(crate) enum ServerInstruction { - NewClient(ClientAttributes, Box<CliArgs>, Box<Options>, Option<Layout>), + NewClient( + ClientAttributes, + Box<CliArgs>, + Box<Options>, + Option<LayoutTemplate>, + ), Render(Option<String>), UnblockInputThread, ClientExit, @@ -207,7 +214,7 @@ pub fn start_server(os_input: Box<dyn ServerOsApi>, socket_path: PathBuf) { to_server.clone(), client_attributes, session_state.clone(), - layout, + layout.clone(), ); *session_data.write().unwrap() = Some(session); *session_state.write().unwrap() = SessionState::Attached; @@ -219,14 +226,34 @@ pub fn start_server(os_input: Box<dyn ServerOsApi>, socket_path: PathBuf) { }) }); - session_data - .read() - .unwrap() - .as_ref() - .unwrap() - .senders - .send_to_pty(PtyInstruction::NewTab(default_shell.clone())) - .unwrap(); + let spawn_tabs = |tab_layout| { + session_data + .read() + .unwrap() + .as_ref() + .unwrap() + .senders + .send_to_pty(PtyInstruction::NewTab(default_shell.clone(), tab_layout)) + .unwrap() + }; + + match layout { + None => { + spawn_tabs(None); + } + Some(layout) => { + if !&layout.tabs.is_empty() { + for tab_layout in layout.tabs { + spawn_tabs(Some(tab_layout.clone())); + // Spawning tabs in too quick succession might mess up the layout + // TODO: investigate why + thread::sleep(std::time::Duration::from_millis(250)); + } + } else { + spawn_tabs(None); + } + } + } } ServerInstruction::AttachClient(attrs, _, options) => { *session_state.write().unwrap() = SessionState::Attached; @@ -302,7 +329,7 @@ fn init_session( to_server: SenderWithContext<ServerInstruction>, client_attributes: ClientAttributes, session_state: Arc<RwLock<SessionState>>, - layout: Option<Layout>, + layout: Option<LayoutTemplate>, ) -> SessionMetaData { let (to_screen, screen_receiver): ChannelWithContext<ScreenInstruction> = channels::unbounded(); let to_screen = SenderWithContext::new(to_screen); diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index 5ef3b321..5c0e4a26 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -20,7 +20,7 @@ use zellij_utils::{ errors::{get_current_ctx, ContextType, PtyContext}, input::{ command::TerminalAction, - layout::{Layout, Run}, + layout::{Layout, LayoutTemplate, Run, TabLayout}, }, logging::debug_to_file, }; @@ -33,7 +33,7 @@ pub(crate) enum PtyInstruction { SpawnTerminal(Option<TerminalAction>), SpawnTerminalVertically(Option<TerminalAction>), SpawnTerminalHorizontally(Option<TerminalAction>), - NewTab(Option<TerminalAction>), + NewTab(Option<TerminalAction>, Option<TabLayout>), ClosePane(PaneId), CloseTab(Vec<PaneId>), Exit, @@ -47,7 +47,7 @@ impl From<&PtyInstruction> for PtyContext { PtyInstruction::SpawnTerminalHorizontally(_) => PtyContext::SpawnTerminalHorizontally, PtyInstruction::ClosePane(_) => PtyContext::ClosePane, PtyInstruction::CloseTab(_) => PtyContext::CloseTab, - PtyInstruction::NewTab(_) => PtyContext::NewTab, + PtyInstruction::NewTab(..) => PtyContext::NewTab, PtyInstruction::Exit => PtyContext::Exit, } } @@ -60,7 +60,7 @@ pub(crate) struct Pty { task_handles: HashMap<RawFd, JoinHandle<()>>, } -pub(crate) fn pty_thread_main(mut pty: Pty, maybe_layout: Option<Layout>) { +pub(crate) fn pty_thread_main(mut pty: Pty, maybe_layout: Option<LayoutTemplate>) { loop { let (event, mut err_ctx) = pty.bus.recv().expect("failed to receive event on channel"); err_ctx.add_call(ContextType::Pty((&event).into())); @@ -86,11 +86,12 @@ pub(crate) fn pty_thread_main(mut pty: Pty, maybe_layout: Option<Layout>) { .send_to_screen(ScreenInstruction::HorizontalSplit(PaneId::Terminal(pid))) .unwrap(); } - PtyInstruction::NewTab(terminal_action) => { + PtyInstruction::NewTab(terminal_action, tab_layout) => { if let Some(layout) = maybe_layout.clone() { - pty.spawn_terminals_for_layout(layout, terminal_action); + let merged_layout = layout.construct_tab_layout(tab_layout); + pty.spawn_terminals_for_layout(merged_layout, terminal_action.clone()); } else { - let pid = pty.spawn_terminal(terminal_action); + let pid = pty.spawn_terminal(terminal_action.clone()); pty.bus .senders .send_to_screen(ScreenInstruction::NewTab(pid)) diff --git a/zellij-server/src/route.rs b/zellij-server/src/route.rs index 54ddfe1b..a88d04b0 100644 --- a/zellij-server/src/route.rs +++ b/zellij-server/src/route.rs @@ -197,11 +197,11 @@ fn route_action( .send_to_screen(ScreenInstruction::CloseFocusedPane) .unwrap(); } - Action::NewTab => { + Action::NewTab(tab_layout) => { let shell = session.default_shell.clone(); session .senders - .send_to_pty(PtyInstruction::NewTab(shell)) + .send_to_pty(PtyInstruction::NewTab(shell, tab_layout)) .unwrap(); } Action::GoToNextTab => { |
