aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-utils
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2026-02-25 09:48:47 +0100
committerGitHub <noreply@github.com>2026-02-25 09:48:47 +0100
commit6e0dd8e51cae440c1453c983740abc6869c46029 (patch)
tree7b7a4aaef1fc5df6ad7c56e572aad50f19858f46 /zellij-utils
parentfix: respect user's cursor choice in web client even when terminal overrides ... (diff)
downloadsl0ppij-6e0dd8e51cae440c1453c983740abc6869c46029.tar.gz
sl0ppij-6e0dd8e51cae440c1453c983740abc6869c46029.tar.xz
sl0ppij-6e0dd8e51cae440c1453c983740abc6869c46029.zip
Atomic show hide floating panes (#4764)
* atomic show/hide floating panes (cli, plugin API, keybinding) * rustfmt * add pr
Diffstat (limited to 'zellij-utils')
-rw-r--r--zellij-utils/assets/prost/api.action.rs24
-rw-r--r--zellij-utils/assets/prost/api.plugin_command.rs58
-rw-r--r--zellij-utils/assets/prost_ipc/client_server_contract.rs18
-rw-r--r--zellij-utils/src/cli.rs14
-rw-r--r--zellij-utils/src/client_server_contract/common_types.proto8
-rw-r--r--zellij-utils/src/data.rs6
-rw-r--r--zellij-utils/src/input/actions.rs14
-rw-r--r--zellij-utils/src/ipc/protobuf_conversion.rs47
-rw-r--r--zellij-utils/src/kdl/mod.rs30
-rw-r--r--zellij-utils/src/plugin_api/action.proto12
-rw-r--r--zellij-utils/src/plugin_api/action.rs37
-rw-r--r--zellij-utils/src/plugin_api/plugin_command.proto26
-rw-r--r--zellij-utils/src/plugin_api/plugin_command.rs62
13 files changed, 328 insertions, 28 deletions
diff --git a/zellij-utils/assets/prost/api.action.rs b/zellij-utils/assets/prost/api.action.rs
index 61acbc50..1d2908a1 100644
--- a/zellij-utils/assets/prost/api.action.rs
+++ b/zellij-utils/assets/prost/api.action.rs
@@ -302,7 +302,7 @@ pub struct OverrideLayoutPayload {
pub struct Action {
#[prost(enumeration="ActionName", tag="1")]
pub name: i32,
- #[prost(oneof="action::OptionalPayload", tags="2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57")]
+ #[prost(oneof="action::OptionalPayload", tags="2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59")]
pub optional_payload: ::core::option::Option<action::OptionalPayload>,
}
/// Nested message and enum types in `Action`.
@@ -416,6 +416,10 @@ pub mod action {
CloseTabByIdPayload(u64),
#[prost(message, tag="57")]
RenameTabByIdPayload(super::TabIdAndName),
+ #[prost(message, tag="58")]
+ ShowFloatingPanesPayload(super::ShowFloatingPanesPayload),
+ #[prost(message, tag="59")]
+ HideFloatingPanesPayload(super::HideFloatingPanesPayload),
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
@@ -448,6 +452,18 @@ pub struct TabIdAndName {
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct ShowFloatingPanesPayload {
+ #[prost(uint32, optional, tag="1")]
+ pub tab_id: ::core::option::Option<u32>,
+}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct HideFloatingPanesPayload {
+ #[prost(uint32, optional, tag="1")]
+ pub tab_id: ::core::option::Option<u32>,
+}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
pub struct PaneIdAndShouldFloat {
#[prost(uint32, tag="1")]
pub pane_id: u32,
@@ -1084,6 +1100,8 @@ pub enum ActionName {
GoToTabById = 95,
CloseTabById = 96,
RenameTabById = 97,
+ ShowFloatingPanes = 98,
+ HideFloatingPanes = 99,
}
impl ActionName {
/// String value of the enum field names used in the ProtoBuf definition.
@@ -1187,6 +1205,8 @@ impl ActionName {
ActionName::GoToTabById => "GoToTabById",
ActionName::CloseTabById => "CloseTabById",
ActionName::RenameTabById => "RenameTabById",
+ ActionName::ShowFloatingPanes => "ShowFloatingPanes",
+ ActionName::HideFloatingPanes => "HideFloatingPanes",
}
}
/// Creates an enum from field names used in the ProtoBuf definition.
@@ -1287,6 +1307,8 @@ impl ActionName {
"GoToTabById" => Some(Self::GoToTabById),
"CloseTabById" => Some(Self::CloseTabById),
"RenameTabById" => Some(Self::RenameTabById),
+ "ShowFloatingPanes" => Some(Self::ShowFloatingPanes),
+ "HideFloatingPanes" => Some(Self::HideFloatingPanes),
_ => None,
}
}
diff --git a/zellij-utils/assets/prost/api.plugin_command.rs b/zellij-utils/assets/prost/api.plugin_command.rs
index bab1d81b..d89da18b 100644
--- a/zellij-utils/assets/prost/api.plugin_command.rs
+++ b/zellij-utils/assets/prost/api.plugin_command.rs
@@ -3,7 +3,7 @@
pub struct PluginCommand {
#[prost(enumeration="CommandName", tag="1")]
pub name: i32,
- #[prost(oneof="plugin_command::Payload", tags="2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154")]
+ #[prost(oneof="plugin_command::Payload", tags="2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156")]
pub payload: ::core::option::Option<plugin_command::Payload>,
}
/// Nested message and enum types in `PluginCommand`.
@@ -291,6 +291,10 @@ pub mod plugin_command {
OpenTerminalPaneInPlaceOfPaneIdPayload(super::OpenTerminalPaneInPlaceOfPaneIdPayload),
#[prost(message, tag="154")]
OpenEditPaneInPlaceOfPaneIdPayload(super::OpenEditPaneInPlaceOfPaneIdPayload),
+ #[prost(message, tag="155")]
+ HideFloatingPanesPayload(super::HideFloatingPanesPayload),
+ #[prost(message, tag="156")]
+ ShowFloatingPanesPayload(super::ShowFloatingPanesPayload),
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
@@ -1718,6 +1722,52 @@ pub struct OpenEditPaneInPlaceOfPaneIdResponse {
#[prost(message, optional, tag="1")]
pub pane_id: ::core::option::Option<PaneId>,
}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct HideFloatingPanesPayload {
+ #[prost(uint32, optional, tag="1")]
+ pub tab_id: ::core::option::Option<u32>,
+}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct ShowFloatingPanesPayload {
+ #[prost(uint32, optional, tag="1")]
+ pub tab_id: ::core::option::Option<u32>,
+}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct ShowFloatingPanesResponse {
+ #[prost(oneof="show_floating_panes_response::Result", tags="1, 2")]
+ pub result: ::core::option::Option<show_floating_panes_response::Result>,
+}
+/// Nested message and enum types in `ShowFloatingPanesResponse`.
+pub mod show_floating_panes_response {
+ #[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Oneof)]
+ pub enum Result {
+ #[prost(bool, tag="1")]
+ Success(bool),
+ #[prost(string, tag="2")]
+ Error(::prost::alloc::string::String),
+ }
+}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct HideFloatingPanesResponse {
+ #[prost(oneof="hide_floating_panes_response::Result", tags="1, 2")]
+ pub result: ::core::option::Option<hide_floating_panes_response::Result>,
+}
+/// Nested message and enum types in `HideFloatingPanesResponse`.
+pub mod hide_floating_panes_response {
+ #[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Oneof)]
+ pub enum Result {
+ #[prost(bool, tag="1")]
+ Success(bool),
+ #[prost(string, tag="2")]
+ Error(::prost::alloc::string::String),
+ }
+}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum CommandName {
@@ -1904,6 +1954,8 @@ pub enum CommandName {
OpenCommandPaneInPlaceOfPaneId = 201,
OpenTerminalPaneInPlaceOfPaneId = 202,
OpenEditPaneInPlaceOfPaneId = 203,
+ HideFloatingPanes = 204,
+ ShowFloatingPanes = 205,
}
impl CommandName {
/// String value of the enum field names used in the ProtoBuf definition.
@@ -2095,6 +2147,8 @@ impl CommandName {
CommandName::OpenCommandPaneInPlaceOfPaneId => "OpenCommandPaneInPlaceOfPaneId",
CommandName::OpenTerminalPaneInPlaceOfPaneId => "OpenTerminalPaneInPlaceOfPaneId",
CommandName::OpenEditPaneInPlaceOfPaneId => "OpenEditPaneInPlaceOfPaneId",
+ CommandName::HideFloatingPanes => "HideFloatingPanes",
+ CommandName::ShowFloatingPanes => "ShowFloatingPanes",
}
}
/// Creates an enum from field names used in the ProtoBuf definition.
@@ -2283,6 +2337,8 @@ impl CommandName {
"OpenCommandPaneInPlaceOfPaneId" => Some(Self::OpenCommandPaneInPlaceOfPaneId),
"OpenTerminalPaneInPlaceOfPaneId" => Some(Self::OpenTerminalPaneInPlaceOfPaneId),
"OpenEditPaneInPlaceOfPaneId" => Some(Self::OpenEditPaneInPlaceOfPaneId),
+ "HideFloatingPanes" => Some(Self::HideFloatingPanes),
+ "ShowFloatingPanes" => Some(Self::ShowFloatingPanes),
_ => None,
}
}
diff --git a/zellij-utils/assets/prost_ipc/client_server_contract.rs b/zellij-utils/assets/prost_ipc/client_server_contract.rs
index 5d58692f..c61229e9 100644
--- a/zellij-utils/assets/prost_ipc/client_server_contract.rs
+++ b/zellij-utils/assets/prost_ipc/client_server_contract.rs
@@ -119,7 +119,7 @@ pub struct RgbColor {
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Action {
- #[prost(oneof="action::ActionType", tags="1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105")]
+ #[prost(oneof="action::ActionType", tags="1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107")]
pub action_type: ::core::option::Option<action::ActionType>,
}
/// Nested message and enum types in `Action`.
@@ -337,6 +337,10 @@ pub mod action {
ListTabs(super::ListTabsAction),
#[prost(message, tag="105")]
CurrentTabInfo(super::CurrentTabInfoAction),
+ #[prost(message, tag="106")]
+ ShowFloatingPanes(super::ShowFloatingPanesAction),
+ #[prost(message, tag="107")]
+ HideFloatingPanes(super::HideFloatingPanesAction),
}
}
// Action message definitions (all 92 variants)
@@ -432,6 +436,18 @@ pub struct ToggleFloatingPanesAction {
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct ShowFloatingPanesAction {
+ #[prost(uint32, optional, tag="1")]
+ pub tab_id: ::core::option::Option<u32>,
+}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct HideFloatingPanesAction {
+ #[prost(uint32, optional, tag="1")]
+ pub tab_id: ::core::option::Option<u32>,
+}
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CloseFocusAction {
}
#[allow(clippy::derive_partial_eq_without_eq)]
diff --git a/zellij-utils/src/cli.rs b/zellij-utils/src/cli.rs
index 7b64e147..f8bf79ac 100644
--- a/zellij-utils/src/cli.rs
+++ b/zellij-utils/src/cli.rs
@@ -905,6 +905,20 @@ pub enum CliAction {
TogglePaneEmbedOrFloating,
/// Toggle the visibility of all floating panes in the current Tab, open one if none exist
ToggleFloatingPanes,
+ /// Show all floating panes in the specified tab (or active tab if tab_id is not provided).
+ ///
+ /// Returns exit code 0 if state was changed, 2 if already visible, 1 if tab not found.
+ ShowFloatingPanes {
+ #[clap(short, long, value_parser)]
+ tab_id: Option<usize>,
+ },
+ /// Hide all floating panes in the specified tab (or active tab if tab_id is not provided).
+ ///
+ /// Returns exit code 0 if state was changed, 2 if already hidden, 1 if tab not found.
+ HideFloatingPanes {
+ #[clap(short, long, value_parser)]
+ tab_id: Option<usize>,
+ },
/// Close the focused pane.
ClosePane,
/// Renames the focused pane
diff --git a/zellij-utils/src/client_server_contract/common_types.proto b/zellij-utils/src/client_server_contract/common_types.proto
index 3a9e854b..46f1b812 100644
--- a/zellij-utils/src/client_server_contract/common_types.proto
+++ b/zellij-utils/src/client_server_contract/common_types.proto
@@ -241,6 +241,8 @@ message Action {
RenameTabByIdAction rename_tab_by_id = 103;
ListTabsAction list_tabs = 104;
CurrentTabInfoAction current_tab_info = 105;
+ ShowFloatingPanesAction show_floating_panes = 106;
+ HideFloatingPanesAction hide_floating_panes = 107;
}
}
@@ -269,6 +271,12 @@ message TogglePaneFramesAction {}
message ToggleActiveSyncTabAction {}
message TogglePaneEmbedOrFloatingAction {}
message ToggleFloatingPanesAction {}
+message ShowFloatingPanesAction {
+ optional uint32 tab_id = 1;
+}
+message HideFloatingPanesAction {
+ optional uint32 tab_id = 1;
+}
message CloseFocusAction {}
message UndoRenamePaneAction {}
message NoOpAction {}
diff --git a/zellij-utils/src/data.rs b/zellij-utils/src/data.rs
index 675cbcfe..74dfdfe7 100644
--- a/zellij-utils/src/data.rs
+++ b/zellij-utils/src/data.rs
@@ -3461,6 +3461,12 @@ pub enum PluginCommand {
OpenCommandPaneInPlaceOfPaneId(PaneId, CommandToRun, bool, Context), // bool = close_replaced_pane
OpenTerminalPaneInPlaceOfPaneId(PaneId, FileToOpen, bool),
OpenEditPaneInPlaceOfPaneId(PaneId, FileToOpen, bool, Context),
+ HideFloatingPanes {
+ tab_id: Option<usize>,
+ },
+ ShowFloatingPanes {
+ tab_id: Option<usize>,
+ },
}
// Response type for plugin API methods that open a pane in a new tab
diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs
index 025b0535..2841ea53 100644
--- a/zellij-utils/src/input/actions.rs
+++ b/zellij-utils/src/input/actions.rs
@@ -273,6 +273,14 @@ pub enum Action {
TogglePaneEmbedOrFloating,
/// Toggle the visibility of all floating panes (if any) in the current Tab
ToggleFloatingPanes,
+ /// Show all floating panes in the specified tab (or active tab if tab_id is None)
+ ShowFloatingPanes {
+ tab_id: Option<usize>,
+ },
+ /// Hide all floating panes in the specified tab (or active tab if tab_id is None)
+ HideFloatingPanes {
+ tab_id: Option<usize>,
+ },
/// Close the focus pane.
CloseFocus,
PaneNameInput {
@@ -941,6 +949,12 @@ impl Action {
CliAction::SwitchMode { input_mode } => Ok(vec![Action::SwitchToMode { input_mode }]),
CliAction::TogglePaneEmbedOrFloating => Ok(vec![Action::TogglePaneEmbedOrFloating]),
CliAction::ToggleFloatingPanes => Ok(vec![Action::ToggleFloatingPanes]),
+ CliAction::ShowFloatingPanes { tab_id } => {
+ Ok(vec![Action::ShowFloatingPanes { tab_id }])
+ },
+ CliAction::HideFloatingPanes { tab_id } => {
+ Ok(vec![Action::HideFloatingPanes { tab_id }])
+ },
CliAction::ClosePane => Ok(vec![Action::CloseFocus]),
CliAction::RenamePane { name } => Ok(vec![
Action::UndoRenamePane,
diff --git a/zellij-utils/src/ipc/protobuf_conversion.rs b/zellij-utils/src/ipc/protobuf_conversion.rs
index 8d8bd542..b6bfbf9c 100644
--- a/zellij-utils/src/ipc/protobuf_conversion.rs
+++ b/zellij-utils/src/ipc/protobuf_conversion.rs
@@ -725,19 +725,20 @@ impl From<crate::input::actions::Action>
FocusNextPaneAction, FocusPluginPaneWithIdAction, FocusPreviousPaneAction,
FocusTerminalPaneWithIdAction, GoToNextTabAction, GoToPreviousTabAction, GoToTabAction,
GoToTabByIdAction, GoToTabNameAction, HalfPageScrollDownAction, HalfPageScrollUpAction,
- KeybindPipeAction, LaunchOrFocusPluginAction, LaunchPluginAction, ListClientsAction,
- ListPanesAction, ListTabsAction, MouseEventAction, MoveFocusAction,
- MoveFocusOrTabAction, MovePaneAction, MovePaneBackwardsAction, MoveTabAction,
- NewBlockingPaneAction, NewFloatingPaneAction, NewFloatingPluginPaneAction,
- NewInPlacePaneAction, NewInPlacePluginPaneAction, NewPaneAction, NewStackedPaneAction,
- NewTabAction, NewTiledPaneAction, NewTiledPluginPaneAction, NextSwapLayoutAction,
- NoOpAction, OverrideLayoutAction, PageScrollDownAction, PageScrollUpAction,
- PaneIdWithPlugin, PaneNameInputAction, PreviousSwapLayoutAction, QueryTabNamesAction,
- QuitAction, RenamePluginPaneAction, RenameSessionAction, RenameTabAction,
- RenameTabByIdAction, RenameTerminalPaneAction, ResizeAction, RunAction,
- SaveSessionAction, ScrollDownAction, ScrollDownAtAction, ScrollToBottomAction,
- ScrollToTopAction, ScrollUpAction, ScrollUpAtAction, SearchAction, SearchInputAction,
- SearchToggleOptionAction, SetPaneBorderlessAction, SkipConfirmAction, StackPanesAction,
+ HideFloatingPanesAction, KeybindPipeAction, LaunchOrFocusPluginAction,
+ LaunchPluginAction, ListClientsAction, ListPanesAction, ListTabsAction,
+ MouseEventAction, MoveFocusAction, MoveFocusOrTabAction, MovePaneAction,
+ MovePaneBackwardsAction, MoveTabAction, NewBlockingPaneAction, NewFloatingPaneAction,
+ NewFloatingPluginPaneAction, NewInPlacePaneAction, NewInPlacePluginPaneAction,
+ NewPaneAction, NewStackedPaneAction, NewTabAction, NewTiledPaneAction,
+ NewTiledPluginPaneAction, NextSwapLayoutAction, NoOpAction, OverrideLayoutAction,
+ PageScrollDownAction, PageScrollUpAction, PaneIdWithPlugin, PaneNameInputAction,
+ PreviousSwapLayoutAction, QueryTabNamesAction, QuitAction, RenamePluginPaneAction,
+ RenameSessionAction, RenameTabAction, RenameTabByIdAction, RenameTerminalPaneAction,
+ ResizeAction, RunAction, SaveSessionAction, ScrollDownAction, ScrollDownAtAction,
+ ScrollToBottomAction, ScrollToTopAction, ScrollUpAction, ScrollUpAtAction,
+ SearchAction, SearchInputAction, SearchToggleOptionAction, SetPaneBorderlessAction,
+ ShowFloatingPanesAction, SkipConfirmAction, StackPanesAction,
StartOrReloadPluginAction, SwitchFocusAction, SwitchModeForAllClientsAction,
SwitchSessionAction, SwitchToModeAction, TabNameInputAction, ToggleActiveSyncTabAction,
ToggleFloatingPanesAction, ToggleFocusFullscreenAction, ToggleGroupMarkingAction,
@@ -971,6 +972,16 @@ impl From<crate::input::actions::Action>
crate::input::actions::Action::ToggleFloatingPanes => {
ActionType::ToggleFloatingPanes(ToggleFloatingPanesAction {})
},
+ crate::input::actions::Action::ShowFloatingPanes { tab_id } => {
+ ActionType::ShowFloatingPanes(ShowFloatingPanesAction {
+ tab_id: tab_id.map(|id| id as u32),
+ })
+ },
+ crate::input::actions::Action::HideFloatingPanes { tab_id } => {
+ ActionType::HideFloatingPanes(HideFloatingPanesAction {
+ tab_id: tab_id.map(|id| id as u32),
+ })
+ },
crate::input::actions::Action::CloseFocus => {
ActionType::CloseFocus(CloseFocusAction {})
},
@@ -1621,6 +1632,16 @@ impl TryFrom<crate::client_server_contract::client_server_contract::Action>
ActionType::ToggleFloatingPanes(_) => {
Ok(crate::input::actions::Action::ToggleFloatingPanes)
},
+ ActionType::ShowFloatingPanes(a) => {
+ Ok(crate::input::actions::Action::ShowFloatingPanes {
+ tab_id: a.tab_id.map(|id| id as usize),
+ })
+ },
+ ActionType::HideFloatingPanes(a) => {
+ Ok(crate::input::actions::Action::HideFloatingPanes {
+ tab_id: a.tab_id.map(|id| id as usize),
+ })
+ },
ActionType::CloseFocus(_) => Ok(crate::input::actions::Action::CloseFocus),
ActionType::PaneNameInput(pane_name_action) => {
Ok(crate::input::actions::Action::PaneNameInput {
diff --git a/zellij-utils/src/kdl/mod.rs b/zellij-utils/src/kdl/mod.rs
index 03d55417..ced75920 100644
--- a/zellij-utils/src/kdl/mod.rs
+++ b/zellij-utils/src/kdl/mod.rs
@@ -63,6 +63,8 @@ macro_rules! parse_kdl_action_arguments {
"ToggleActiveSyncTab" => Ok(Action::ToggleActiveSyncTab),
"TogglePaneEmbedOrFloating" => Ok(Action::TogglePaneEmbedOrFloating),
"ToggleFloatingPanes" => Ok(Action::ToggleFloatingPanes),
+ "ShowFloatingPanes" => Ok(Action::ShowFloatingPanes { tab_id: None }),
+ "HideFloatingPanes" => Ok(Action::HideFloatingPanes { tab_id: None }),
"CloseFocus" => Ok(Action::CloseFocus),
"UndoRenamePane" => Ok(Action::UndoRenamePane),
"NoOp" => Ok(Action::NoOp),
@@ -729,6 +731,20 @@ impl Action {
},
Action::TogglePaneEmbedOrFloating => Some(KdlNode::new("TogglePaneEmbedOrFloating")),
Action::ToggleFloatingPanes => Some(KdlNode::new("ToggleFloatingPanes")),
+ Action::ShowFloatingPanes { tab_id } => {
+ let mut node = KdlNode::new("ShowFloatingPanes");
+ if let Some(id) = tab_id {
+ node.push(KdlValue::Base10(*id as i64));
+ }
+ Some(node)
+ },
+ Action::HideFloatingPanes { tab_id } => {
+ let mut node = KdlNode::new("HideFloatingPanes");
+ if let Some(id) = tab_id {
+ node.push(KdlValue::Base10(*id as i64));
+ }
+ Some(node)
+ },
Action::CloseFocus => Some(KdlNode::new("CloseFocus")),
Action::PaneNameInput { input: bytes } => {
let mut node = KdlNode::new("PaneNameInput");
@@ -1510,6 +1526,20 @@ impl TryFrom<(&KdlNode, &Options)> for Action {
"ToggleFloatingPanes" => {
parse_kdl_action_arguments!(action_name, action_arguments, kdl_action)
},
+ "ShowFloatingPanes" => {
+ let tab_id = action_arguments
+ .first()
+ .and_then(|v| v.value().as_i64())
+ .map(|n| n as usize);
+ Ok(Action::ShowFloatingPanes { tab_id })
+ },
+ "HideFloatingPanes" => {
+ let tab_id = action_arguments
+ .first()
+ .and_then(|v| v.value().as_i64())
+ .map(|n| n as usize);
+ Ok(Action::HideFloatingPanes { tab_id })
+ },
"CloseFocus" => parse_kdl_action_arguments!(action_name, action_arguments, kdl_action),
"UndoRenamePane" => {
parse_kdl_action_arguments!(action_name, action_arguments, kdl_action)
diff --git a/zellij-utils/src/plugin_api/action.proto b/zellij-utils/src/plugin_api/action.proto
index 73db5c1d..e4a42668 100644
--- a/zellij-utils/src/plugin_api/action.proto
+++ b/zellij-utils/src/plugin_api/action.proto
@@ -242,6 +242,8 @@ message Action {
uint64 go_to_tab_by_id_payload = 55;
uint64 close_tab_by_id_payload = 56;
TabIdAndName rename_tab_by_id_payload = 57;
+ ShowFloatingPanesPayload show_floating_panes_payload = 58;
+ HideFloatingPanesPayload hide_floating_panes_payload = 59;
}
}
@@ -262,6 +264,14 @@ message TabIdAndName {
string name = 2;
}
+message ShowFloatingPanesPayload {
+ optional uint32 tab_id = 1;
+}
+
+message HideFloatingPanesPayload {
+ optional uint32 tab_id = 1;
+}
+
message PaneIdAndShouldFloat {
uint32 pane_id = 1;
bool should_float = 2;
@@ -469,6 +479,8 @@ enum ActionName {
GoToTabById = 95;
CloseTabById = 96;
RenameTabById = 97;
+ ShowFloatingPanes = 98;
+ HideFloatingPanes = 99;
}
message Position {
diff --git a/zellij-utils/src/plugin_api/action.rs b/zellij-utils/src/plugin_api/action.rs
index 1a8ab956..5bb58db3 100644
--- a/zellij-utils/src/plugin_api/action.rs
+++ b/zellij-utils/src/plugin_api/action.rs
@@ -16,6 +16,7 @@ pub use super::generated_api::api::{
FloatingPaneLayout as ProtobufFloatingPaneLayout,
FloatingPlacement as ProtobufFloatingPlacement,
GoToTabNamePayload,
+ HideFloatingPanesPayload,
IdAndName,
InPlaceConfig as ProtobufInPlaceConfig,
KeyModifier as ProtobufKeyModifier,
@@ -56,12 +57,14 @@ pub use super::generated_api::api::{
ScrollAtPayload,
SearchDirection as ProtobufSearchDirection,
SearchOption as ProtobufSearchOption,
+ ShowFloatingPanesPayload,
SplitDirection as ProtobufSplitDirection,
SplitSize as ProtobufSplitSize,
StackedPlacement as ProtobufStackedPlacement,
SwapFloatingLayout as ProtobufSwapFloatingLayout,
SwapTiledLayout as ProtobufSwapTiledLayout,
SwitchToModePayload,
+ TabIdAndName,
TabLayoutInfo as ProtobufTabLayoutInfo,
TiledPaneLayout as ProtobufTiledPaneLayout,
TiledPlacement as ProtobufTiledPlacement,
@@ -396,6 +399,24 @@ impl TryFrom<ProtobufAction> for Action {
None => Ok(Action::ToggleFloatingPanes),
}
},
+ Some(ProtobufActionName::ShowFloatingPanes) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::ShowFloatingPanesPayload(payload)) => {
+ Ok(Action::ShowFloatingPanes {
+ tab_id: payload.tab_id.map(|id| id as usize),
+ })
+ },
+ None => Ok(Action::ShowFloatingPanes { tab_id: None }),
+ _ => Err("Wrong payload for ShowFloatingPanes"),
+ },
+ Some(ProtobufActionName::HideFloatingPanes) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::HideFloatingPanesPayload(payload)) => {
+ Ok(Action::HideFloatingPanes {
+ tab_id: payload.tab_id.map(|id| id as usize),
+ })
+ },
+ None => Ok(Action::HideFloatingPanes { tab_id: None }),
+ _ => Err("Wrong payload for HideFloatingPanes"),
+ },
Some(ProtobufActionName::CloseFocus) => match protobuf_action.optional_payload {
Some(_) => Err("CloseFocus should not have a payload"),
None => Ok(Action::CloseFocus),
@@ -1306,6 +1327,22 @@ impl TryFrom<Action> for ProtobufAction {
name: ProtobufActionName::ToggleFloatingPanes as i32,
optional_payload: None,
}),
+ Action::ShowFloatingPanes { tab_id } => Ok(ProtobufAction {
+ name: ProtobufActionName::ShowFloatingPanes as i32,
+ optional_payload: Some(OptionalPayload::ShowFloatingPanesPayload(
+ ShowFloatingPanesPayload {
+ tab_id: tab_id.map(|id| id as u32),
+ },
+ )),
+ }),
+ Action::HideFloatingPanes { tab_id } => Ok(ProtobufAction {
+ name: ProtobufActionName::HideFloatingPanes as i32,
+ optional_payload: Some(OptionalPayload::HideFloatingPanesPayload(
+ HideFloatingPanesPayload {
+ tab_id: tab_id.map(|id| id as u32),
+ },
+ )),
+ }),
Action::CloseFocus => Ok(ProtobufAction {
name: ProtobufActionName::CloseFocus as i32,
optional_payload: None,
diff --git a/zellij-utils/src/plugin_api/plugin_command.proto b/zellij-utils/src/plugin_api/plugin_command.proto
index e3e1ee4b..7ba3aabe 100644
--- a/zellij-utils/src/plugin_api/plugin_command.proto
+++ b/zellij-utils/src/plugin_api/plugin_command.proto
@@ -196,6 +196,8 @@ enum CommandName {
OpenCommandPaneInPlaceOfPaneId = 201;
OpenTerminalPaneInPlaceOfPaneId = 202;
OpenEditPaneInPlaceOfPaneId = 203;
+ HideFloatingPanes = 204;
+ ShowFloatingPanes = 205;
}
message PluginCommand {
@@ -341,6 +343,8 @@ message PluginCommand {
OpenCommandPaneInPlaceOfPaneIdPayload open_command_pane_in_place_of_pane_id_payload = 152;
OpenTerminalPaneInPlaceOfPaneIdPayload open_terminal_pane_in_place_of_pane_id_payload = 153;
OpenEditPaneInPlaceOfPaneIdPayload open_edit_pane_in_place_of_pane_id_payload = 154;
+ HideFloatingPanesPayload hide_floating_panes_payload = 155;
+ ShowFloatingPanesPayload show_floating_panes_payload = 156;
}
}
@@ -1186,3 +1190,25 @@ message OpenTerminalPaneInPlaceOfPaneIdResponse {
message OpenEditPaneInPlaceOfPaneIdResponse {
optional PaneId pane_id = 1;
}
+
+message HideFloatingPanesPayload {
+ optional uint32 tab_id = 1;
+}
+
+message ShowFloatingPanesPayload {
+ optional uint32 tab_id = 1;
+}
+
+message ShowFloatingPanesResponse {
+ oneof result {
+ bool success = 1;
+ string error = 2;
+ }
+}
+
+message HideFloatingPanesResponse {
+ oneof result {
+ bool success = 1;
+ string error = 2;
+ }
+}
diff --git a/zellij-utils/src/plugin_api/plugin_command.rs b/zellij-utils/src/plugin_api/plugin_command.rs
index 632fe167..c3741591 100644
--- a/zellij-utils/src/plugin_api/plugin_command.rs
+++ b/zellij-utils/src/plugin_api/plugin_command.rs
@@ -7,9 +7,10 @@ pub use super::generated_api::api::{
break_panes_to_tab_with_index_response, delete_layout_response, dump_layout_response,
dump_session_layout_response, edit_layout_response, focus_or_create_tab_response,
get_focused_pane_info_response, get_pane_cwd_response, get_pane_pid_response,
- get_pane_running_command_response, new_tab_response, parse_layout_response,
- plugin_command::Payload, rename_layout_response, save_layout_response,
- save_session_response, BreakPanesToNewTabPayload,
+ get_pane_running_command_response, hide_floating_panes_response, new_tab_response,
+ parse_layout_response, plugin_command::Payload, rename_layout_response,
+ save_layout_response, save_session_response, show_floating_panes_response,
+ BreakPanesToNewTabPayload,
BreakPanesToNewTabResponse as ProtobufBreakPanesToNewTabResponse,
BreakPanesToTabWithIdPayload,
BreakPanesToTabWithIdResponse as ProtobufBreakPanesToTabWithIdResponse,
@@ -45,11 +46,12 @@ pub use super::generated_api::api::{
GetSessionEnvironmentVariablesPayload as ProtobufGetSessionEnvironmentVariablesPayload,
GetSessionEnvironmentVariablesResponse as ProtobufGetSessionEnvironmentVariablesResponse,
GetTabInfoPayload, GetTabInfoResponse as ProtobufGetTabInfoResponse, GoToTabWithIdPayload,
- GroupAndUngroupPanesPayload, HidePaneWithIdPayload, HighlightAndUnhighlightPanesPayload,
- HttpVerb as ProtobufHttpVerb, IdAndNewName, KeyToRebind, KeyToUnbind, KillSessionsPayload,
- ListTokensResponse, LoadNewPluginPayload, MessageToPluginPayload,
- MovePaneWithPaneIdInDirectionPayload, MovePaneWithPaneIdPayload, MovePayload,
- NewPluginArgs as ProtobufNewPluginArgs, NewTabPayload,
+ GroupAndUngroupPanesPayload, HideFloatingPanesPayload as ProtobufHideFloatingPanesPayload,
+ HideFloatingPanesResponse as ProtobufHideFloatingPanesResponse, HidePaneWithIdPayload,
+ HighlightAndUnhighlightPanesPayload, HttpVerb as ProtobufHttpVerb, IdAndNewName,
+ KeyToRebind, KeyToUnbind, KillSessionsPayload, ListTokensResponse, LoadNewPluginPayload,
+ MessageToPluginPayload, MovePaneWithPaneIdInDirectionPayload, MovePaneWithPaneIdPayload,
+ MovePayload, NewPluginArgs as ProtobufNewPluginArgs, NewTabPayload,
NewTabResponse as ProtobufNewTabResponse, NewTabsResponse as ProtobufNewTabsResponse,
NewTabsWithLayoutInfoPayload,
OpenCommandPaneBackgroundResponse as ProtobufOpenCommandPaneBackgroundResponse,
@@ -102,10 +104,12 @@ pub use super::generated_api::api::{
ScrollToBottomInPaneIdPayload, ScrollToTopInPaneIdPayload, ScrollUpInPaneIdPayload,
SetFloatingPanePinnedPayload, SetPaneBorderlessPayload,
SetSelfMouseSelectionSupportPayload, SetTimeoutPayload, ShowCursorPayload,
- ShowPaneWithIdPayload, StackPanesPayload, SubscribePayload, SwitchSessionPayload,
- SwitchTabToIdPayload, SwitchTabToPayload, TogglePaneBorderlessPayload,
- TogglePaneEmbedOrEjectForPaneIdPayload, TogglePaneIdFullscreenPayload, UnsubscribePayload,
- WebRequestPayload, WriteCharsToPaneIdPayload, WriteToPaneIdPayload,
+ ShowFloatingPanesPayload as ProtobufShowFloatingPanesPayload,
+ ShowFloatingPanesResponse as ProtobufShowFloatingPanesResponse, ShowPaneWithIdPayload,
+ StackPanesPayload, SubscribePayload, SwitchSessionPayload, SwitchTabToIdPayload,
+ SwitchTabToPayload, TogglePaneBorderlessPayload, TogglePaneEmbedOrEjectForPaneIdPayload,
+ TogglePaneIdFullscreenPayload, UnsubscribePayload, WebRequestPayload,
+ WriteCharsToPaneIdPayload, WriteToPaneIdPayload,
},
plugin_permission::PermissionType as ProtobufPermissionType,
resize::ResizeAction as ProtobufResizeAction,
@@ -2401,6 +2405,24 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand {
_ => Err("Mismatched payload for OpenEditPaneInPlaceOfPaneId"),
}
},
+ Some(CommandName::HideFloatingPanes) => match protobuf_plugin_command.payload {
+ Some(Payload::HideFloatingPanesPayload(payload)) => {
+ Ok(PluginCommand::HideFloatingPanes {
+ tab_id: payload.tab_id.map(|id| id as usize),
+ })
+ },
+ None => Ok(PluginCommand::HideFloatingPanes { tab_id: None }),
+ _ => Err("Mismatched payload for HideFloatingPanes"),
+ },
+ Some(CommandName::ShowFloatingPanes) => match protobuf_plugin_command.payload {
+ Some(Payload::ShowFloatingPanesPayload(payload)) => {
+ Ok(PluginCommand::ShowFloatingPanes {
+ tab_id: payload.tab_id.map(|id| id as usize),
+ })
+ },
+ None => Ok(PluginCommand::ShowFloatingPanes { tab_id: None }),
+ _ => Err("Mismatched payload for ShowFloatingPanes"),
+ },
None => Err("Unrecognized plugin command"),
}
}
@@ -3937,6 +3959,22 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand {
)),
})
},
+ PluginCommand::HideFloatingPanes { tab_id } => Ok(ProtobufPluginCommand {
+ name: CommandName::HideFloatingPanes as i32,
+ payload: Some(Payload::HideFloatingPanesPayload(
+ ProtobufHideFloatingPanesPayload {
+ tab_id: tab_id.map(|id| id as u32),
+ },
+ )),
+ }),
+ PluginCommand::ShowFloatingPanes { tab_id } => Ok(ProtobufPluginCommand {
+ name: CommandName::ShowFloatingPanes as i32,
+ payload: Some(Payload::ShowFloatingPanesPayload(
+ ProtobufShowFloatingPanesPayload {
+ tab_id: tab_id.map(|id| id as u32),
+ },
+ )),
+ }),
}
}
}