diff options
| author | Brooks Rady <b.j.rady@gmail.com> | 2021-04-28 16:27:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-28 16:27:06 +0100 |
| commit | 3c431ee6254858e5a46fd0870e5aff47f57f64e3 (patch) | |
| tree | fc8bc45e46354debd316c0e88a1194643089014a /src | |
| parent | docs(changelog): Screen Config File (#399) (diff) | |
| parent | Defining sync keybind using default.yaml (diff) | |
| download | sl0ppij-3c431ee6254858e5a46fd0870e5aff47f57f64e3.tar.gz sl0ppij-3c431ee6254858e5a46fd0870e5aff47f57f64e3.tar.xz sl0ppij-3c431ee6254858e5a46fd0870e5aff47f57f64e3.zip | |
feat(ui): add the ability to synchronize input sent to panes
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/tab.rs | 23 | ||||
| -rw-r--r-- | src/common/errors.rs | 2 | ||||
| -rw-r--r-- | src/common/input/actions.rs | 2 | ||||
| -rw-r--r-- | src/common/input/handler.rs | 6 | ||||
| -rw-r--r-- | src/common/mod.rs | 16 | ||||
| -rw-r--r-- | src/common/screen.rs | 4 |
6 files changed, 48 insertions, 5 deletions
diff --git a/src/client/tab.rs b/src/client/tab.rs index af48d3fe..f9d98ace 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -68,6 +68,7 @@ pub struct Tab { max_panes: Option<usize>, full_screen_ws: PositionAndSize, fullscreen_is_active: bool, + synchronize_is_active: bool, os_api: Box<dyn OsApi>, pub send_pty_instructions: SenderWithContext<PtyInstruction>, pub send_plugin_instructions: SenderWithContext<PluginInstruction>, @@ -249,6 +250,7 @@ impl Tab { active_terminal: pane_id, full_screen_ws: *full_screen_ws, fullscreen_is_active: false, + synchronize_is_active: false, os_api, send_app_instructions, send_pty_instructions, @@ -592,6 +594,21 @@ impl Tab { terminal_output.handle_pty_bytes(bytes); } } + pub fn write_to_terminals_on_current_tab(&mut self, input_bytes: Vec<u8>) { + let pane_ids = self.get_pane_ids(); + pane_ids.iter().for_each(|pane_id| match pane_id { + PaneId::Terminal(pid) => { + self.write_to_pane_id(input_bytes.clone(), *pid); + } + PaneId::Plugin(_) => {} + }); + } + pub fn write_to_pane_id(&mut self, mut input_bytes: Vec<u8>, pid: RawFd) { + self.os_api + .write_to_tty_stdin(pid, &mut input_bytes) + .expect("failed to write to terminal"); + self.os_api.tcdrain(pid).expect("failed to drain terminal"); + } pub fn write_to_active_terminal(&mut self, input_bytes: Vec<u8>) { match self.get_active_pane_id() { Some(PaneId::Terminal(active_terminal_id)) => { @@ -677,6 +694,12 @@ impl Tab { pub fn toggle_fullscreen_is_active(&mut self) { self.fullscreen_is_active = !self.fullscreen_is_active; } + pub fn is_sync_panes_active(&self) -> bool { + self.synchronize_is_active + } + pub fn toggle_sync_panes_is_active(&mut self) { + self.synchronize_is_active = !self.synchronize_is_active; + } pub fn render(&mut self) { if self.active_terminal.is_none() { // we might not have an active terminal if we closed the last pane diff --git a/src/common/errors.rs b/src/common/errors.rs index dd675738..c1c6753f 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -200,6 +200,7 @@ pub enum ScreenContext { PageScrollDown, ClearScroll, CloseFocusedPane, + ToggleActiveSyncPanes, ToggleActiveTerminalFullscreen, SetSelectable, SetInvisibleBorders, @@ -260,6 +261,7 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenInstruction::UpdateTabName(_) => ScreenContext::UpdateTabName, ScreenInstruction::TerminalResize => ScreenContext::TerminalResize, ScreenInstruction::ChangeMode(_) => ScreenContext::ChangeMode, + ScreenInstruction::ToggleActiveSyncPanes => ScreenContext::ToggleActiveSyncPanes, } } } diff --git a/src/common/input/actions.rs b/src/common/input/actions.rs index 3bcadf15..46a8e1d6 100644 --- a/src/common/input/actions.rs +++ b/src/common/input/actions.rs @@ -39,6 +39,8 @@ pub enum Action { PageScrollDown, /// Toggle between fullscreen focus pane and normal layout. ToggleFocusFullscreen, + /// Toggle between sending text commands to all panes and normal mode. + ToggleActiveSyncPanes, /// Open a new pane in the specified direction (relative to focus). /// If no direction is specified, will try to use the biggest available space. NewPane(Option<Direction>), diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 197f8315..62118722 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -244,6 +244,11 @@ impl InputHandler { .send(ScreenInstruction::SwitchTabPrev) .unwrap(); } + Action::ToggleActiveSyncPanes => { + self.send_screen_instructions + .send(ScreenInstruction::ToggleActiveSyncPanes) + .unwrap(); + } Action::CloseTab => { self.command_is_executing.closing_pane(); self.send_screen_instructions @@ -293,6 +298,7 @@ pub fn get_mode_info(mode: InputMode) -> ModeInfo { keybinds.push(("d".to_string(), "Down split".to_string())); keybinds.push(("r".to_string(), "Right split".to_string())); keybinds.push(("x".to_string(), "Close".to_string())); + keybinds.push(("s".to_string(), "Sync".to_string())); keybinds.push(("f".to_string(), "Fullscreen".to_string())); } InputMode::Tab => { diff --git a/src/common/mod.rs b/src/common/mod.rs index ec2efe58..0a04e3ff 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -320,10 +320,11 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: CliArgs) { command_is_executing.done_opening_new_pane(); } ScreenInstruction::WriteCharacter(bytes) => { - screen - .get_active_tab_mut() - .unwrap() - .write_to_active_terminal(bytes); + let active_tab = screen.get_active_tab_mut().unwrap(); + match active_tab.is_sync_panes_active() { + true => active_tab.write_to_terminals_on_current_tab(bytes), + false => active_tab.write_to_active_terminal(bytes), + } } ScreenInstruction::ResizeLeft => { screen.get_active_tab_mut().unwrap().resize_left(); @@ -444,6 +445,13 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: CliArgs) { ScreenInstruction::ChangeMode(mode_info) => { screen.change_mode(mode_info); } + ScreenInstruction::ToggleActiveSyncPanes => { + screen + .get_active_tab_mut() + .unwrap() + .toggle_sync_panes_is_active(); + screen.update_tabs(); + } ScreenInstruction::Quit => { break; } diff --git a/src/common/screen.rs b/src/common/screen.rs index a2f41574..bc68f2ea 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -51,6 +51,7 @@ pub enum ScreenInstruction { NewTab(RawFd), SwitchTabNext, SwitchTabPrev, + ToggleActiveSyncPanes, CloseTab, GoToTab(u32), UpdateTabName(Vec<u8>), @@ -285,7 +286,7 @@ impl Screen { self.update_tabs(); } - fn update_tabs(&self) { + pub fn update_tabs(&self) { let mut tab_data = vec![]; let active_tab_index = self.active_tab_index.unwrap(); for tab in self.tabs.values() { @@ -293,6 +294,7 @@ impl Screen { position: tab.position, name: tab.name.clone(), active: active_tab_index == tab.index, + is_sync_panes_active: tab.is_sync_panes_active(), }); } self.send_plugin_instructions |
