diff options
| author | Aram Drevekenin <aram@poor.dev> | 2025-12-23 13:41:56 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-23 13:41:56 +0100 |
| commit | 3fe48a972c55537502128779116d38d8f8aedb7e (patch) | |
| tree | 350386442db2a46e1d8ba3d9d4dd0c7d53b34c13 /zellij-utils/src/ipc/protobuf_conversion.rs | |
| parent | Read only web tokens (#4551) (diff) | |
| download | sl0ppij-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.rs | 90 |
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 { |
