diff options
| author | Aram Drevekenin <aram@poor.dev> | 2024-08-29 17:35:21 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-29 17:35:21 +0200 |
| commit | 1776d240dade5ef1d254651ba53d0ab6d99e10ff (patch) | |
| tree | ce86a9254abdd7d21682999d81111cf2443db09e /zellij-tile | |
| parent | docs(changelog): reload config options at runtime (diff) | |
| download | sl0ppij-1776d240dade5ef1d254651ba53d0ab6d99e10ff.tar.gz sl0ppij-1776d240dade5ef1d254651ba53d0ab6d99e10ff.tar.xz sl0ppij-1776d240dade5ef1d254651ba53d0ab6d99e10ff.zip | |
feat(plugins): add plugin APIs to affect other panes (#3576)
* resize_pane_with_id and close_pane_with_id
* focus_pane_with_id and edit_scrollback_for_pane_with_id
* write_to_pane_id and write_chars_to_pane_id
* lots more commands
* style(fmt): rustfmt
Diffstat (limited to 'zellij-tile')
| -rw-r--r-- | zellij-tile/src/shim.rs | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/zellij-tile/src/shim.rs b/zellij-tile/src/shim.rs index 2c5e8580..9b57d1a9 100644 --- a/zellij-tile/src/shim.rs +++ b/zellij-tile/src/shim.rs @@ -857,6 +857,179 @@ pub fn rerun_command_pane(terminal_pane_id: u32) { unsafe { host_run_plugin_command() }; } +/// Sugar for close_terminal_pane and close_plugin_pane +pub fn close_pane_with_id(pane_id: PaneId) { + let plugin_command = match pane_id { + PaneId::Terminal(terminal_pane_id) => PluginCommand::CloseTerminalPane(terminal_pane_id), + PaneId::Plugin(plugin_pane_id) => PluginCommand::ClosePluginPane(plugin_pane_id), + }; + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Resize the specified pane (increase/decrease) with an optional direction (left/right/up/down) +pub fn resize_pane_with_id(resize_strategy: ResizeStrategy, pane_id: PaneId) { + let plugin_command = PluginCommand::ResizePaneIdWithDirection(resize_strategy, pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Changes the focus to the pane with the specified id, unsuppressing it if it was suppressed and switching to its tab and layer (eg. floating/tiled). +pub fn focus_pane_with_id(pane_id: PaneId, should_float_if_hidden: bool) { + let plugin_command = match pane_id { + PaneId::Terminal(terminal_pane_id) => { + PluginCommand::FocusTerminalPane(terminal_pane_id, should_float_if_hidden) + }, + PaneId::Plugin(plugin_pane_id) => { + PluginCommand::FocusPluginPane(plugin_pane_id, should_float_if_hidden) + }, + }; + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Edit the scrollback of the specified pane in the user's default `$EDITOR` (currently only works +/// for terminal panes) +pub fn edit_scrollback_for_pane_with_id(pane_id: PaneId) { + let plugin_command = PluginCommand::EditScrollbackForPaneWithId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Write bytes to the `STDIN` of the specified pane +pub fn write_to_pane_id(bytes: Vec<u8>, pane_id: PaneId) { + let plugin_command = PluginCommand::WriteToPaneId(bytes, pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Write characters to the `STDIN` of the specified pane +pub fn write_chars_to_pane_id(chars: &str, pane_id: PaneId) { + let plugin_command = PluginCommand::WriteCharsToPaneId(chars.to_owned(), pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Switch the position of the pane with this id with a different pane +pub fn move_pane_with_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::MovePaneWithPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Switch the position of the pane with this id with a different pane in the specified direction (eg. `Down`, `Up`, `Left`, `Right`). +pub fn move_pane_with_pane_id_in_direction(pane_id: PaneId, direction: Direction) { + let plugin_command = PluginCommand::MovePaneWithPaneIdInDirection(pane_id, direction); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Clear the scroll buffer of the specified pane +pub fn clear_screen_for_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::ClearScreenForPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Scroll the specified pane up 1 line +pub fn scroll_up_in_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::ScrollUpInPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Scroll the specified pane down 1 line +pub fn scroll_down_in_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::ScrollDownInPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Scroll the specified pane all the way to the top of the scrollbuffer +pub fn scroll_to_top_in_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::ScrollToTopInPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Scroll the specified pane all the way to the bottom of the scrollbuffer +pub fn scroll_to_bottom_in_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::ScrollToBottomInPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Scroll the specified pane up one page +pub fn page_scroll_up_in_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::PageScrollUpInPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Scroll the specified pane down one page +pub fn page_scroll_down_in_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::PageScrollDownInPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Toggle the specified pane to be fullscreen or normal sized +pub fn toggle_pane_id_fullscreen(pane_id: PaneId) { + let plugin_command = PluginCommand::TogglePaneIdFullscreen(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Embed the specified pane (make it stop floating) or turn it to a float pane if it is not +pub fn toggle_pane_embed_or_eject_for_pane_id(pane_id: PaneId) { + let plugin_command = PluginCommand::TogglePaneEmbedOrEjectForPaneId(pane_id); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Close the focused tab +pub fn close_tab_with_index(tab_index: usize) { + let plugin_command = PluginCommand::CloseTabWithIndex(tab_index); + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + +/// Rename the specified pane +pub fn rename_pane_with_id<S: AsRef<str>>(pane_id: PaneId, new_name: S) +where + S: ToString, +{ + let plugin_command = match pane_id { + PaneId::Terminal(terminal_pane_id) => { + PluginCommand::RenameTerminalPane(terminal_pane_id, new_name.to_string()) + }, + PaneId::Plugin(plugin_pane_id) => { + PluginCommand::RenamePluginPane(plugin_pane_id, new_name.to_string()) + }, + }; + let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap(); + object_to_stdout(&protobuf_plugin_command.encode_to_vec()); + unsafe { host_run_plugin_command() }; +} + // Utility Functions #[allow(unused)] |
