aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/ipc/protobuf_conversion.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2025-12-23 13:41:56 +0100
committerGitHub <noreply@github.com>2025-12-23 13:41:56 +0100
commit3fe48a972c55537502128779116d38d8f8aedb7e (patch)
tree350386442db2a46e1d8ba3d9d4dd0c7d53b34c13 /zellij-utils/src/ipc/protobuf_conversion.rs
parentRead only web tokens (#4551) (diff)
downloadsl0ppij-3fe48a972c55537502128779116d38d8f8aedb7e.tar.gz
sl0ppij-3fe48a972c55537502128779116d38d8f8aedb7e.tar.xz
sl0ppij-3fe48a972c55537502128779116d38d8f8aedb7e.zip
Feature: allow overriding a layout for a currently running tab (change layout at runtime) (#4566)
* add tests for LayoutApplier * initial untested implementation of override functions * add override-layout cli action with stub in screen * filter run instructions to ignore * implement override-layout roundtrip through plugin and pty threads * initial full-cycle working override implementation * fix some bugs (eg. actually start new terminals) * fix some bugs with focus after override * fix floating pane matching bug in layout applier * formatting * use first tab, error on more than 1 tab * fix some floating_panes ordering and shell issues * get new tab name to work * respect swap layouts * allow specifying tab properties on main layout node if we just have one tab * add tests for new override methods * start work on retaining panes, hard-coded things, kind of working but broken in many places * fixed most tiled pane override bugs * reset viewport before reapplying * revert constraint system changes * retain-existing-terminal-panes flag * add retain terminal panes tests * add retain plugin panes flag * add keybind * add retain plugin panes tests * add override-layout e2e test * refactor: layout_applier * style: rustfmt * some cleanups * fix cli flags * no crashy * formatting and artifacts * moar cleanups * fix: respect expanded in stack when overriding * docs(changelog): add PR
Diffstat (limited to 'zellij-utils/src/ipc/protobuf_conversion.rs')
-rw-r--r--zellij-utils/src/ipc/protobuf_conversion.rs90
1 files changed, 77 insertions, 13 deletions
diff --git a/zellij-utils/src/ipc/protobuf_conversion.rs b/zellij-utils/src/ipc/protobuf_conversion.rs
index cf7b9802..e803f51e 100644
--- a/zellij-utils/src/ipc/protobuf_conversion.rs
+++ b/zellij-utils/src/ipc/protobuf_conversion.rs
@@ -723,19 +723,19 @@ impl From<crate::input::actions::Action>
MoveTabAction, NewBlockingPaneAction, NewFloatingPaneAction,
NewFloatingPluginPaneAction, NewInPlacePaneAction, NewInPlacePluginPaneAction,
NewPaneAction, NewStackedPaneAction, NewTabAction, NewTiledPaneAction,
- NewTiledPluginPaneAction, NextSwapLayoutAction, NoOpAction, PageScrollDownAction,
- PageScrollUpAction, PaneIdWithPlugin, PaneNameInputAction, PreviousSwapLayoutAction,
- QueryTabNamesAction, QuitAction, RenamePluginPaneAction, RenameSessionAction,
- RenameTabAction, RenameTerminalPaneAction, ResizeAction, RunAction, ScrollDownAction,
- ScrollDownAtAction, ScrollToBottomAction, ScrollToTopAction, ScrollUpAction,
- ScrollUpAtAction, SearchAction, SearchInputAction, SearchToggleOptionAction,
- SkipConfirmAction, StackPanesAction, StartOrReloadPluginAction, SwitchFocusAction,
- SwitchModeForAllClientsAction, SwitchSessionAction, SwitchToModeAction,
- TabNameInputAction, ToggleActiveSyncTabAction, ToggleFloatingPanesAction,
- ToggleFocusFullscreenAction, ToggleGroupMarkingAction, ToggleMouseModeAction,
- TogglePaneEmbedOrFloatingAction, TogglePaneFramesAction, TogglePaneInGroupAction,
- TogglePanePinnedAction, ToggleTabAction, UndoRenamePaneAction, UndoRenameTabAction,
- WriteAction, WriteCharsAction,
+ NewTiledPluginPaneAction, NextSwapLayoutAction, NoOpAction, OverrideLayoutAction,
+ PageScrollDownAction, PageScrollUpAction, PaneIdWithPlugin, PaneNameInputAction,
+ PreviousSwapLayoutAction, QueryTabNamesAction, QuitAction, RenamePluginPaneAction,
+ RenameSessionAction, RenameTabAction, RenameTerminalPaneAction, ResizeAction,
+ RunAction, ScrollDownAction, ScrollDownAtAction, ScrollToBottomAction,
+ ScrollToTopAction, ScrollUpAction, ScrollUpAtAction, SearchAction, SearchInputAction,
+ SearchToggleOptionAction, SkipConfirmAction, StackPanesAction,
+ StartOrReloadPluginAction, SwitchFocusAction, SwitchModeForAllClientsAction,
+ SwitchSessionAction, SwitchToModeAction, TabNameInputAction, ToggleActiveSyncTabAction,
+ ToggleFloatingPanesAction, ToggleFocusFullscreenAction, ToggleGroupMarkingAction,
+ ToggleMouseModeAction, TogglePaneEmbedOrFloatingAction, TogglePaneFramesAction,
+ TogglePaneInGroupAction, TogglePanePinnedAction, ToggleTabAction, UndoRenamePaneAction,
+ UndoRenameTabAction, WriteAction, WriteCharsAction,
};
use std::collections::HashMap;
@@ -1097,6 +1097,27 @@ impl From<crate::input::actions::Action>
crate::input::actions::Action::NextSwapLayout => {
ActionType::NextSwapLayout(NextSwapLayoutAction {})
},
+ crate::input::actions::Action::OverrideLayout {
+ tiled_layout,
+ floating_layouts,
+ swap_tiled_layouts,
+ swap_floating_layouts,
+ tab_name,
+ retain_existing_terminal_panes,
+ retain_existing_plugin_panes,
+ } => ActionType::OverrideLayout(OverrideLayoutAction {
+ tiled_layout: tiled_layout.map(|l| l.into()),
+ floating_layouts: floating_layouts.into_iter().map(|l| l.into()).collect(),
+ swap_tiled_layouts: swap_tiled_layouts
+ .map(|layouts| layouts.into_iter().map(|l| l.into()).collect())
+ .unwrap_or_default(),
+ swap_floating_layouts: swap_floating_layouts
+ .map(|layouts| layouts.into_iter().map(|l| l.into()).collect())
+ .unwrap_or_default(),
+ tab_name,
+ retain_existing_terminal_panes,
+ retain_existing_plugin_panes,
+ }),
crate::input::actions::Action::QueryTabNames => {
ActionType::QueryTabNames(QueryTabNamesAction {})
},
@@ -1672,6 +1693,49 @@ impl TryFrom<crate::client_server_contract::client_server_contract::Action>
Ok(crate::input::actions::Action::PreviousSwapLayout)
},
ActionType::NextSwapLayout(_) => Ok(crate::input::actions::Action::NextSwapLayout),
+ ActionType::OverrideLayout(override_layout_action) => {
+ Ok(crate::input::actions::Action::OverrideLayout {
+ tiled_layout: override_layout_action
+ .tiled_layout
+ .map(|l| l.try_into())
+ .transpose()?,
+ floating_layouts: override_layout_action
+ .floating_layouts
+ .into_iter()
+ .map(|l| l.try_into())
+ .collect::<Result<Vec<_>>>()?,
+ swap_tiled_layouts: if override_layout_action.swap_tiled_layouts.is_empty() {
+ None
+ } else {
+ Some(
+ override_layout_action
+ .swap_tiled_layouts
+ .into_iter()
+ .map(|l| l.try_into())
+ .collect::<Result<Vec<_>>>()?,
+ )
+ },
+ swap_floating_layouts: if override_layout_action
+ .swap_floating_layouts
+ .is_empty()
+ {
+ None
+ } else {
+ Some(
+ override_layout_action
+ .swap_floating_layouts
+ .into_iter()
+ .map(|l| l.try_into())
+ .collect::<Result<Vec<_>>>()?,
+ )
+ },
+ tab_name: override_layout_action.tab_name,
+ retain_existing_terminal_panes: override_layout_action
+ .retain_existing_terminal_panes,
+ retain_existing_plugin_panes: override_layout_action
+ .retain_existing_plugin_panes,
+ })
+ },
ActionType::QueryTabNames(_) => Ok(crate::input::actions::Action::QueryTabNames),
ActionType::NewTiledPluginPane(new_tiled_plugin_action) => {
Ok(crate::input::actions::Action::NewTiledPluginPane {