aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2021-08-24 10:58:36 +0200
committerAram Drevekenin <aram@poor.dev>2021-08-24 10:58:36 +0200
commit618c2c376bb4edca8693ea4b871279bc04501559 (patch)
treeb4d4426b353955e8af1ed8ad6531f95860eda5f6 /zellij-server/src
parentdocs(changelog): add `ToggleTab` action (diff)
parentAdd `template` section in `layout` file (diff)
downloadsl0ppij-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.rs57
-rw-r--r--zellij-server/src/pty.rs15
-rw-r--r--zellij-server/src/route.rs4
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 => {