aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src/tab/unit
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2023-02-17 12:05:50 +0100
committerGitHub <noreply@github.com>2023-02-17 12:05:50 +0100
commitf1ff272b0b65f6d328fef24531ada67ea585ce85 (patch)
tree0e33aa4a1af21c0785fa30118ee42a21972497cf /zellij-server/src/tab/unit
parentdocs(changelog): termwiz update (diff)
downloadsl0ppij-f1ff272b0b65f6d328fef24531ada67ea585ce85.tar.gz
sl0ppij-f1ff272b0b65f6d328fef24531ada67ea585ce85.tar.xz
sl0ppij-f1ff272b0b65f6d328fef24531ada67ea585ce85.zip
feat(ui): swap layouts and stacked panes (#2167)
* relayout working with hard coded layout * work * refactor(layout): PaneLayout => TiledPaneLayout * tests passing * tests passing * tests passing * stacked panes and passing tests * tests for stacked panes * refactor(panes): stacked panes * fix: focusing into stacked panes from the left/right * fix(layouts): handle stacked layouts in the middle of the screen * fix(pane-stack): focus correctly when coming to stack from above/below * fix(stacked-panes): resize stack * fix(stacked-panes): focus with mouse * fix(stacked-panes): focus next pane * fix(layout-applier): sane focus order * fix(stacked-panes): better titles for one-liners * fix(stacked-panes): handle moving pane location in stack * fix(relayout): properly calculate display area * fix(relayout): properly calculate rounding errors * fix(stacked-panes): properly handle closing a pane near a stack * fix(swap-layouts): adjust swap layout sort order * feat(swap-layouts): ui + ux * fix(swap-layouts): include base layout * refactor(layout): remove unused method * fix(swap-layouts): respect pane contents and focus * work * fix(swap-layouts): load swap layouts from external file * fix(swap-layouts): properly truncate layout children * fix(stacked-panes): allow stacked panes to become fullscreen * fix(swap-layouts): work with multiple tabs * fix(swap-layouts): embed/eject panes properly with auto-layout * fix(stacked-panes): close last pane in stack * fix(stacked-panes): move focus for all clients in stack * fix(floating-panes): set layout damaged when moving panes * fix(relayout): move out of unfitting layout when resizing whole tab * fix(ui): background color for swap layout indicator * fix(keybinds): add switch next layout in tmux * fix(ui): swap layout indication in compact layout * fix(compact): correct swap constraint * fix(tests): tmux swap config shortcut * fix(resizes): cache resizes so as not to confuse panes (eg. vim) with multiple resizes that it debounces weirdly * feat(cli): dump swap layouts * fix(ui): stacked panes without pane frames * fix(ux): move pane forward/backwards also with floating panes * refactor(lint): remove unused stuff * refactor(tab): move swap layouts to separate file * style(fmt): rustfmt * style(fmt): rustfmt * refactor(panes): various cleanups * chore(deps): upgrade termwiz to get alt left-bracket * fix(assets): merge conflicts of binary files * style(fmt): rustfmt * style(clippy): no thank you! * chore(repo): remove garbage file
Diffstat (limited to 'zellij-server/src/tab/unit')
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_floating_layout_is_included_in_swap_layouts.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_layout_is_included_in_swap_layouts.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_horizontally.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_non_directionally.snap46
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_vertically.snap46
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_horizontally.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_non_directionally.snap46
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_vertically.snap46
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_between_multiple_layouts.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_floating_layout_at_runtime.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_tiled_layout_at_runtime.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__cannot_decrease_stack_size_beyond_minimum_height.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane_in_mid_stack.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_above_main_pane.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_below_main_pane.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_pane_near_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_stacked_pane_with_previously_focused_other_pane.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__decreasing_size_of_whole_tab_treats_stacked_panes_properly.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__floating_layout_with_plugins_and_commands_swaped_properly.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_next_pane_expands_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_over_flexible_pane_with_the_mouse.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_under_flexible_pane_with_the_mouse.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_into_main_pane_in_stack_horizontally_does_not_break_stack.snap46
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_main_pane_in_stack_horizontally_does_not_break_stack.snap46
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_whole_tab_treats_stacked_panes_properly.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__layout_with_plugins_and_commands_swaped_properly.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_into_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_with_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_left_into_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_right_into_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_into_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_with_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_with_stacked_panes.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-2.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-3.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-2.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-3.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-4.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-5.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-6.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-7.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_tab_with_floating_panes.snap2
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_whole_tab_while_floting_pane_is_suppressed.snap2
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically.snap2
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically_and_expand_back.snap2
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__stacked_panes_can_become_fullscreen.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_command_panes_absent_from_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_plugin_panes_absent_from_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_command_panes_present_in_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_plugin_panes_present_in_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_command_panes_absent_from_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_plugin_panes_absent_from_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_command_panes_present_in_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_plugin_panes_present_in_existing_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children_and_no_pane_frames.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swapping_layouts_after_resize_snaps_to_current_layout.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_floating_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_resizing_whole_tab_with_auto_layout_and_floating_panes_the_layout_is_maintained.snap36
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap26
-rw-r--r--zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap26
-rw-r--r--zellij-server/src/tab/unit/tab_integration_tests.rs4067
-rw-r--r--zellij-server/src/tab/unit/tab_tests.rs55
71 files changed, 5871 insertions, 79 deletions
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_floating_layout_is_included_in_swap_layouts.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_floating_layout_is_included_in_swap_layouts.snap
new file mode 100644
index 00000000..f6e33291
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_floating_layout_is_included_in_swap_layouts.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5472
+expression: snapshot
+---
+00 (C): ┌ tab-bar ────────────────────────────────────────┌ status-bar ──────────────────────────────────────────────┐──────────┐
+01 (C): │I am a tab bar │I am a │ │
+02 (C): │ │status bar │ │
+03 (C): │ │ │ │
+04 (C): │ │ │ │
+05 (C): │ ┌ Pane #3 ──────────│ │ │
+06 (C): │ │ │ │ │
+07 (C): │ │ │ │ │
+08 (C): │ │ │ │ │
+09 (C): └─────────────────────────────│ └──────────────────────────────────────────────────────────┘ │
+10 (C): ┌ command1 ───────────────────│ ┌ command2 ────────────────────────────────────────────────┐ │
+11 (C): │ │ │ │ │
+12 (C): │ │ │ │ │
+13 (C): │ │ │ │ │
+14 (C): │ Waiting to ru└───────────────────│ Waiting to run: command2 │ │
+15 (C): │ │ │ │
+16 (C): │ <ENTER> to run, <Ctrl-c> to exit │ <ENTER> to run, <Ctrl-c> to exit │ │
+17 (C): │ │ │ │
+18 (C): │ │ │ │
+19 (C): └─────────────────────────────────────────────────└──────────────────────────────────────────────────────────┘──────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_layout_is_included_in_swap_layouts.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_layout_is_included_in_swap_layouts.snap
new file mode 100644
index 00000000..5fbf2847
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__base_layout_is_included_in_swap_layouts.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4762
+expression: snapshot
+---
+00 (C): I am a tab bar
+01 (C): ┌ command2 ─────────────────────────────┐┌ Pane #2 ─────────────────────────────┐┌ command1 ────────────────────────────┐
+02 (C): │ ││ ││ │
+03 (C): │ ││ ││ │
+04 (C): │ ││ ││ │
+05 (C): │ ││ ││ │
+06 (C): │ ││ ││ │
+07 (C): │ ││ ││ │
+08 (C): │ Waiting to run: command2 ││ ││ Waiting to run: command1 │
+09 (C): │ ││ ││ │
+10 (C): │ <ENTER> to run, <Ctrl-c> to exit ││ ││ <ENTER> to run, <Ctrl-c> to exit │
+11 (C): │ ││ ││ │
+12 (C): │ ││ ││ │
+13 (C): │ ││ ││ │
+14 (C): │ ││ ││ │
+15 (C): │ ││ ││ │
+16 (C): │ ││ ││ │
+17 (C): └───────────────────────────────────────┘└──────────────────────────────────────┘└──────────────────────────────────────┘
+18 (C): I am a
+19 (C): status bar
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_horizontally.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_horizontally.snap
new file mode 100644
index 00000000..f4322702
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_horizontally.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3955
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ────────────────────────────────────────────────────────┐┌ Pane #2 ───────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ───────────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ───────────────────────────────────────────┐
+03 (C): │ │┌ Pane #5 ───────────────────────────────────────────┐
+04 (C): │ │┌ Pane #6 ───────────────────────────────────────────┐
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └─────────────────────────────────────────────────────────────────┘└────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_non_directionally.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_non_directionally.snap
new file mode 100644
index 00000000..997af6c2
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_non_directionally.snap
@@ -0,0 +1,46 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4062
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+13 (C): ┌ Pane #2 ────────────────────────────────────────────────────────┐┌ Pane #4 ───────────────────────────────────────────┐
+14 (C): │ │┌ Pane #5 ───────────────────────────────────────────┐
+15 (C): │ │┌ Pane #6 ───────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): │ ││ │
+20 (C): │ ││ │
+21 (C): │ ││ │
+22 (C): │ ││ │
+23 (C): │ ││ │
+24 (C): │ ││ │
+25 (C): │ ││ │
+26 (C): │ ││ │
+27 (C): └─────────────────────────────────────────────────────────────────┘└────────────────────────────────────────────────────┘
+28 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+29 (C): │ │
+30 (C): │ │
+31 (C): │ │
+32 (C): │ │
+33 (C): │ │
+34 (C): │ │
+35 (C): │ │
+36 (C): │ │
+37 (C): │ │
+38 (C): │ │
+39 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_vertically.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_vertically.snap
new file mode 100644
index 00000000..b800c634
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_into_pane_stack_vertically.snap
@@ -0,0 +1,46 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4047
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+13 (C): ┌ Pane #2 ──────────────────────────────────────────────────┐┌ Pane #4 ─────────────────────────────────────────────────┐
+14 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+15 (C): │ │┌ Pane #6 ─────────────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): │ ││ │
+20 (C): │ ││ │
+21 (C): │ ││ │
+22 (C): │ ││ │
+23 (C): │ ││ │
+24 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+25 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+26 (C): │ │
+27 (C): │ │
+28 (C): │ │
+29 (C): │ │
+30 (C): │ │
+31 (C): │ │
+32 (C): │ │
+33 (C): │ │
+34 (C): │ │
+35 (C): │ │
+36 (C): │ │
+37 (C): │ │
+38 (C): │ │
+39 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_horizontally.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_horizontally.snap
new file mode 100644
index 00000000..ecee6a70
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_horizontally.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3716
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ───────────────────────────────────────────┐┌ Pane #2 ────────────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ────────────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ────────────────────────────────────────────────────────┐
+03 (C): │ │┌ Pane #5 ────────────────────────────────────────────────────────┐
+04 (C): │ │┌ Pane #6 ────────────────────────────────────────────────────────┐
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_non_directionally.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_non_directionally.snap
new file mode 100644
index 00000000..bcd3b4ee
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_non_directionally.snap
@@ -0,0 +1,46 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3823
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+13 (C): ┌ Pane #2 ───────────────────────────────────────────┐┌ Pane #4 ────────────────────────────────────────────────────────┐
+14 (C): │ │┌ Pane #5 ────────────────────────────────────────────────────────┐
+15 (C): │ │┌ Pane #6 ────────────────────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): │ ││ │
+20 (C): │ ││ │
+21 (C): │ ││ │
+22 (C): │ ││ │
+23 (C): │ ││ │
+24 (C): │ ││ │
+25 (C): │ ││ │
+26 (C): │ ││ │
+27 (C): └────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────┘
+28 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+29 (C): │ │
+30 (C): │ │
+31 (C): │ │
+32 (C): │ │
+33 (C): │ │
+34 (C): │ │
+35 (C): │ │
+36 (C): │ │
+37 (C): │ │
+38 (C): │ │
+39 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_vertically.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_vertically.snap
new file mode 100644
index 00000000..b5dea0aa
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_increase_size_of_main_pane_in_stack_vertically.snap
@@ -0,0 +1,46 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3807
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+13 (C): ┌ Pane #2 ──────────────────────────────────────────────────┐┌ Pane #4 ─────────────────────────────────────────────────┐
+14 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+15 (C): │ │┌ Pane #6 ─────────────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): │ ││ │
+20 (C): │ ││ │
+21 (C): │ ││ │
+22 (C): │ ││ │
+23 (C): │ ││ │
+24 (C): │ ││ │
+25 (C): │ ││ │
+26 (C): │ ││ │
+27 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+28 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+29 (C): │ │
+30 (C): │ │
+31 (C): │ │
+32 (C): │ │
+33 (C): │ │
+34 (C): │ │
+35 (C): │ │
+36 (C): │ │
+37 (C): │ │
+38 (C): │ │
+39 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_between_multiple_layouts.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_between_multiple_layouts.snap
new file mode 100644
index 00000000..b7f08c8a
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_between_multiple_layouts.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3064
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ─────────────────────────────────────────────────┐┌ Pane #2 ──────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └──────────────────────────────────────────────────────────┘└───────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_floating_layout_at_runtime.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_floating_layout_at_runtime.snap
new file mode 100644
index 00000000..04fa9400
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_floating_layout_at_runtime.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3022
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): ┌ Pane #2 ─────────────────────────────────────────────────┐ ┌ Pane #3 ─────────────────────────────────────────────────┐
+06 (C): │ │ │ │
+07 (C): │ │ │ │
+08 (C): │ │ │ │
+09 (C): │ │ │ │
+10 (C): │ │ │ │
+11 (C): │ │ │ │
+12 (C): │ │ │ │
+13 (C): │ │ │ │
+14 (C): └──────────────────────────────────────────────────────────┘ └──────────────────────────────────────────────────────────┘
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_tiled_layout_at_runtime.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_tiled_layout_at_runtime.snap
new file mode 100644
index 00000000..e14c889a
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__can_swap_tiled_layout_at_runtime.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 2977
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+10 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__cannot_decrease_stack_size_beyond_minimum_height.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__cannot_decrease_stack_size_beyond_minimum_height.snap
new file mode 100644
index 00000000..8416d6e0
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__cannot_decrease_stack_size_beyond_minimum_height.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4346
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #3 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+03 (C): │ │┌ Pane #6 ─────────────────────────────────────────────────┐
+04 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+05 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane.snap
new file mode 100644
index 00000000..1260736f
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3536
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane_in_mid_stack.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane_in_mid_stack.snap
new file mode 100644
index 00000000..071b2413
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_main_stacked_pane_in_mid_stack.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3590
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ │└──────────────────────────────────────────────────────────┘
+19 (C): └───────────────────────────────────────────────────────────┘└ Pane #6 ─────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_above_main_pane.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_above_main_pane.snap
new file mode 100644
index 00000000..17d9500e
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_above_main_pane.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3699
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #3 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ │└──────────────────────────────────────────────────────────┘
+18 (C): │ │└ Pane #5 ─────────────────────────────────────────────────┘
+19 (C): └───────────────────────────────────────────────────────────┘└ Pane #6 ─────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_below_main_pane.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_below_main_pane.snap
new file mode 100644
index 00000000..fffc3a7d
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_one_liner_stacked_pane_below_main_pane.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3645
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ │└──────────────────────────────────────────────────────────┘
+18 (C): │ │└ Pane #5 ─────────────────────────────────────────────────┘
+19 (C): └───────────────────────────────────────────────────────────┘└ Pane #6 ─────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_pane_near_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_pane_near_stacked_panes.snap
new file mode 100644
index 00000000..f9d93989
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_pane_near_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4574
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+03 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_stacked_pane_with_previously_focused_other_pane.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_stacked_pane_with_previously_focused_other_pane.snap
new file mode 100644
index 00000000..b065d0bc
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__close_stacked_pane_with_previously_focused_other_pane.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4517
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #3 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ │└──────────────────────────────────────────────────────────┘
+09 (C): └───────────────────────────────────────────────────────────┘└ Pane #6 ─────────────────────────────────────────────────┘
+10 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__decreasing_size_of_whole_tab_treats_stacked_panes_properly.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__decreasing_size_of_whole_tab_treats_stacked_panes_properly.snap
new file mode 100644
index 00000000..913206c0
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__decreasing_size_of_whole_tab_treats_stacked_panes_properly.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4195
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ───────────────────────────────────────┐┌ Pane #2 ───────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ───────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ───────────────────────────────────────┐
+03 (C): │ │┌ Pane #5 ───────────────────────────────────────┐
+04 (C): │ │┌ Pane #6 ───────────────────────────────────────┐
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): └────────────────────────────────────────────────┘└────────────────────────────────────────────────┘
+10 (C):
+11 (C):
+12 (C):
+13 (C):
+14 (C):
+15 (C):
+16 (C):
+17 (C):
+18 (C):
+19 (C):
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__floating_layout_with_plugins_and_commands_swaped_properly.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__floating_layout_with_plugins_and_commands_swaped_properly.snap
new file mode 100644
index 00000000..11b9b669
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__floating_layout_with_plugins_and_commands_swaped_properly.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5402
+expression: snapshot
+---
+00 (C): ┌ status-bar ──────────────────────────────────────────────┐─────────────────────────────────────────────────┐──────────┐
+01 (C): │I am a │b bar │ │
+02 (C): │status bar │ │ │
+03 (C): │ │ │ │
+04 (C): │ │ │ │
+05 (C): │ │ │ │
+06 (C): │ │ │ │
+07 (C): │ │ │ │
+08 (C): │ │ │ │
+09 (C): └──────────────────────────────────────────────────────────┘─────────────────────────────────────────────────┘ │
+10 (C): ┌ command2 ───────────────────│ ┌ command1 ────────────────────────────────────────────────┐ │
+11 (C): │ │ │ │ │
+12 (C): │ │ │ │ │
+13 (C): │ │ │ │ │
+14 (C): │ Waiting to ru└───────────────────│ Waiting to run: command1 │ │
+15 (C): │ │ │ │
+16 (C): │ <ENTER> to run, <Ctrl-c> to exit │ <ENTER> to run, <Ctrl-c> to exit │ │
+17 (C): │ │ │ │
+18 (C): │ │ │ │
+19 (C): └─────────────────────────────────────────────────└──────────────────────────────────────────────────────────┘──────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_next_pane_expands_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_next_pane_expands_stacked_panes.snap
new file mode 100644
index 00000000..fec3d753
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_next_pane_expands_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4628
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #3 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ │└──────────────────────────────────────────────────────────┘
+07 (C): │ │└ Pane #4 ─────────────────────────────────────────────────┘
+08 (C): │ │└ Pane #5 ─────────────────────────────────────────────────┘
+09 (C): └───────────────────────────────────────────────────────────┘└ Pane #6 ─────────────────────────────────────────────────┘
+10 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_over_flexible_pane_with_the_mouse.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_over_flexible_pane_with_the_mouse.snap
new file mode 100644
index 00000000..77530c7c
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_over_flexible_pane_with_the_mouse.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4399
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #3 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ │└──────────────────────────────────────────────────────────┘
+08 (C): │ │└ Pane #5 ─────────────────────────────────────────────────┘
+09 (C): └───────────────────────────────────────────────────────────┘└ Pane #6 ─────────────────────────────────────────────────┘
+10 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_under_flexible_pane_with_the_mouse.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_under_flexible_pane_with_the_mouse.snap
new file mode 100644
index 00000000..41100f1e
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__focus_stacked_pane_under_flexible_pane_with_the_mouse.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4454
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #3 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+03 (C): │ │┌ Pane #6 ─────────────────────────────────────────────────┐
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+10 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_into_main_pane_in_stack_horizontally_does_not_break_stack.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_into_main_pane_in_stack_horizontally_does_not_break_stack.snap
new file mode 100644
index 00000000..417fe7cd
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_into_main_pane_in_stack_horizontally_does_not_break_stack.snap
@@ -0,0 +1,46 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4178
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+13 (C): ┌ Pane #2 ────────────────────────────────────────────────────────┐┌ Pane #4 ───────────────────────────────────────────┐
+14 (C): │ │┌ Pane #6 ───────────────────────────────────────────┐
+15 (C): │ │┌ Pane #7 ───────────────────────────────────────────┐
+16 (C): │ │┌ Pane #8 ───────────────────────────────────────────┐
+17 (C): │ │┌ Pane #9 ───────────────────────────────────────────┐
+18 (C): │ │┌ Pane #10 ──────────────────────────────────────────┐
+19 (C): └─────────────────────────────────────────────────────────────────┘┌ Pane #11 ──────────────────────────────────────────┐
+20 (C): ┌ Pane #3 ────────────────────────────────────────────────────────┐│ │
+21 (C): │ ││ │
+22 (C): │ ││ │
+23 (C): │ ││ │
+24 (C): │ ││ │
+25 (C): │ ││ │
+26 (C): └─────────────────────────────────────────────────────────────────┘└────────────────────────────────────────────────────┘
+27 (C): ┌ Pane #5 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+28 (C): │ │
+29 (C): │ │
+30 (C): │ │
+31 (C): │ │
+32 (C): │ │
+33 (C): │ │
+34 (C): │ │
+35 (C): │ │
+36 (C): │ │
+37 (C): │ │
+38 (C): │ │
+39 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_main_pane_in_stack_horizontally_does_not_break_stack.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_main_pane_in_stack_horizontally_does_not_break_stack.snap
new file mode 100644
index 00000000..530bc567
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_main_pane_in_stack_horizontally_does_not_break_stack.snap
@@ -0,0 +1,46 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3942
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+13 (C): ┌ Pane #2 ───────────────────────────────────────────┐┌ Pane #4 ────────────────────────────────────────────────────────┐
+14 (C): │ │┌ Pane #6 ────────────────────────────────────────────────────────┐
+15 (C): │ │┌ Pane #7 ────────────────────────────────────────────────────────┐
+16 (C): │ │┌ Pane #8 ────────────────────────────────────────────────────────┐
+17 (C): │ │┌ Pane #9 ────────────────────────────────────────────────────────┐
+18 (C): │ │┌ Pane #10 ───────────────────────────────────────────────────────┐
+19 (C): └────────────────────────────────────────────────────┘┌ Pane #11 ───────────────────────────────────────────────────────┐
+20 (C): ┌ Pane #3 ───────────────────────────────────────────┐┌ Pane #12 ───────────────────────────────────────────────────────┐
+21 (C): │ ││ │
+22 (C): │ ││ │
+23 (C): │ ││ │
+24 (C): │ ││ │
+25 (C): │ ││ │
+26 (C): └────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────┘
+27 (C): ┌ Pane #5 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+28 (C): │ │
+29 (C): │ │
+30 (C): │ │
+31 (C): │ │
+32 (C): │ │
+33 (C): │ │
+34 (C): │ │
+35 (C): │ │
+36 (C): │ │
+37 (C): │ │
+38 (C): │ │
+39 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_whole_tab_treats_stacked_panes_properly.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_whole_tab_treats_stacked_panes_properly.snap
new file mode 100644
index 00000000..df202642
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__increasing_size_of_whole_tab_treats_stacked_panes_properly.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4253
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+03 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+04 (C): │ │┌ Pane #6 ─────────────────────────────────────────────────┐
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__layout_with_plugins_and_commands_swaped_properly.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__layout_with_plugins_and_commands_swaped_properly.snap
new file mode 100644
index 00000000..6be12af6
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__layout_with_plugins_and_commands_swaped_properly.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4689
+expression: snapshot
+---
+00 (C): I am a
+01 (C): status bar
+02 (C): ┌ command2 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+03 (C): │ │
+04 (C): │ Waiting to run: command2 │
+05 (C): │ │
+06 (C): │ <ENTER> to run, <Ctrl-c> to exit │
+07 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+08 (C): ┌ command1 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+09 (C): │ │
+10 (C): │ Waiting to run: command1 │
+11 (C): │ │
+12 (C): │ <ENTER> to run, <Ctrl-c> to exit │
+13 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+14 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+19 (C): I am a tab bar
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_into_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_into_stacked_panes.snap
new file mode 100644
index 00000000..9fee9b1e
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_into_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3492
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #6 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+07 (C): ┌ Pane #2 ──────────────────────────────────────────────────┐┌ Pane #4 ─────────────────────────────────────────────────┐
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ │└──────────────────────────────────────────────────────────┘
+13 (C): └───────────────────────────────────────────────────────────┘└ Pane #5 ─────────────────────────────────────────────────┘
+14 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_with_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_with_stacked_panes.snap
new file mode 100644
index 00000000..1dfa52c7
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_down_with_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3269
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_left_into_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_left_into_stacked_panes.snap
new file mode 100644
index 00000000..6a0d0d7e
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_left_into_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3378
+expression: snapshot
+---
+00 (C): ┌ Pane #3 ──────────────────────────────────────────────────┐┌ Pane #7 ─────────────────────────────────────────────────┐
+01 (C): ┌ Pane #2 ──────────────────────────────────────────────────┐│ │
+02 (C): ┌ Pane #4 ──────────────────────────────────────────────────┐│ │
+03 (C): ┌ Pane #5 ──────────────────────────────────────────────────┐│ │
+04 (C): ┌ Pane #6 ──────────────────────────────────────────────────┐│ │
+05 (C): ┌ Pane #8 ──────────────────────────────────────────────────┐│ │
+06 (C): ┌ Pane #9 ──────────────────────────────────────────────────┐│ │
+07 (C): ┌ Pane #10 ─────────────────────────────────────────────────┐│ │
+08 (C): ┌ Pane #11 ─────────────────────────────────────────────────┐│ │
+09 (C): ┌ Pane #12 ─────────────────────────────────────────────────┐└──────────────────────────────────────────────────────────┘
+10 (C): ┌ Pane #13 ─────────────────────────────────────────────────┐┌ Pane #15 ────────────────────────────────────────────────┐
+11 (C): ┌ Pane #14 ─────────────────────────────────────────────────┐│ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_right_into_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_right_into_stacked_panes.snap
new file mode 100644
index 00000000..3acd26d8
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_right_into_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3324
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+03 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+04 (C): │ │┌ Pane #6 ─────────────────────────────────────────────────┐
+05 (C): │ │┌ Pane #7 ─────────────────────────────────────────────────┐
+06 (C): │ │┌ Pane #8 ─────────────────────────────────────────────────┐
+07 (C): │ │┌ Pane #9 ─────────────────────────────────────────────────┐
+08 (C): │ │┌ Pane #10 ────────────────────────────────────────────────┐
+09 (C): └───────────────────────────────────────────────────────────┘┌ Pane #11 ────────────────────────────────────────────────┐
+10 (C): ┌ Pane #14 ─────────────────────────────────────────────────┐┌ Pane #12 ────────────────────────────────────────────────┐
+11 (C): │ │┌ Pane #13 ────────────────────────────────────────────────┐
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_into_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_into_stacked_panes.snap
new file mode 100644
index 00000000..e8e3dd7c
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_into_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3434
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+07 (C): ┌ Pane #2 ──────────────────────────────────────────────────┐┌ Pane #4 ─────────────────────────────────────────────────┐
+08 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+14 (C): ┌ Pane #3 ──────────────────────────────────────────────────┐┌ Pane #6 ─────────────────────────────────────────────────┐
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_with_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_with_stacked_panes.snap
new file mode 100644
index 00000000..c5d5de95
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_up_with_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3222
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ │└──────────────────────────────────────────────────────────┘
+19 (C): └───────────────────────────────────────────────────────────┘└ Pane #4 ─────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_with_stacked_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_with_stacked_panes.snap
new file mode 100644
index 00000000..254e671a
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__move_focus_with_stacked_panes.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3185
+expression: snapshot
+---
+00 (C): ┌ Pane #4 ─────────────────────────────────────────────────┐┌ Pane #1 ──────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #2 ──────────────────────────────────────────────────┐
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ │└───────────────────────────────────────────────────────────┘
+19 (C): └──────────────────────────────────────────────────────────┘┌ Pane #3 ──────────────────────────────────────────────────┐
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-2.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-2.snap
new file mode 100644
index 00000000..cdef4812
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-2.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5799
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ ┌ Pane #2 ────────────────────────────────────────────┐ ┌ Pane #3 ────────────────────────────────────────────┐ │
+06 (C): │ │ │ │ │ │
+07 (C): │ │ │ │ │ │
+08 (C): │ │ │ │ │ │
+09 (C): │ │ │ │ │ │
+10 (C): │ │ │ │ │ │
+11 (C): │ │ │ │ │ │
+12 (C): │ │ │ │ │ │
+13 (C): │ │ │ │ │ │
+14 (C): │ └─────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────┘ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-3.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-3.snap
new file mode 100644
index 00000000..b5c19c92
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout-3.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5799
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ ┌ Pane #3 ────────────────────────────────────────────┐ ┌ Pane #2 ────────────────────────────────────────────┐ │
+02 (C): │ │ │ │ │ │
+03 (C): │ │ │ │ │ │
+04 (C): │ │ │ │ │ │
+05 (C): │ │ │ │ │ │
+06 (C): │ │ │ │ │ │
+07 (C): │ │ │ │ │ │
+08 (C): │ │ │ │ │ │
+09 (C): │ │ │ │ │ │
+10 (C): │ └─────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────┘ │
+11 (C): │ ┌ Pane #4 ────────────────────────────────────────────┐ │
+12 (C): │ │ │ │
+13 (C): │ │ │ │
+14 (C): │ │ │ │
+15 (C): │ │ │ │
+16 (C): │ │ │ │
+17 (C): │ │ │ │
+18 (C): │ │ │ │
+19 (C): └─────────────────────────────└─────────────────────────────────────────────────────┘───────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout.snap
new file mode 100644
index 00000000..d6c84185
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_floating_pane_in_auto_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5799
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ ┌ Pane #2 ─────────────────────────────────────────────────┐
+11 (C): │ │ │
+12 (C): │ │ │
+13 (C): │ │ │
+14 (C): │ │ │
+15 (C): │ │ │
+16 (C): │ │ │
+17 (C): │ │ │
+18 (C): │ │ │
+19 (C): └────────────────────────────────────────────────────────────└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-2.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-2.snap
new file mode 100644
index 00000000..241910dc
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-2.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5099
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ │└──────────────────────────────────────────────────────────┘
+10 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-3.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-3.snap
new file mode 100644
index 00000000..764303eb
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-3.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5099
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ │└──────────────────────────────────────────────────────────┘
+07 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ │└──────────────────────────────────────────────────────────┘
+14 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-4.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-4.snap
new file mode 100644
index 00000000..2e426650
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-4.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5099
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ │└──────────────────────────────────────────────────────────┘
+05 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ │└──────────────────────────────────────────────────────────┘
+10 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ │└──────────────────────────────────────────────────────────┘
+15 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-5.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-5.snap
new file mode 100644
index 00000000..469f2b26
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-5.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5099
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ │└──────────────────────────────────────────────────────────┘
+05 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+10 (C): ┌ Pane #6 ──────────────────────────────────────────────────┐┌ Pane #4 ─────────────────────────────────────────────────┐
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ │└──────────────────────────────────────────────────────────┘
+15 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-6.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-6.snap
new file mode 100644
index 00000000..caf0b98a
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-6.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5099
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ │└──────────────────────────────────────────────────────────┘
+05 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+06 (C): └───────────────────────────────────────────────────────────┘│ │
+07 (C): ┌ Pane #6 ──────────────────────────────────────────────────┐│ │
+08 (C): │ ││ │
+09 (C): │ │└──────────────────────────────────────────────────────────┘
+10 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): └───────────────────────────────────────────────────────────┘│ │
+14 (C): ┌ Pane #7 ──────────────────────────────────────────────────┐└──────────────────────────────────────────────────────────┘
+15 (C): │ │┌ Pane #5 ─────────────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-7.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-7.snap
new file mode 100644
index 00000000..8956fb0f
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout-7.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5099
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+05 (C): ┌ Pane #6 ──────────────────────────────────────────────────┐┌ Pane #3 ─────────────────────────────────────────────────┐
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+10 (C): ┌ Pane #7 ──────────────────────────────────────────────────┐┌ Pane #4 ─────────────────────────────────────────────────┐
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+15 (C): ┌ Pane #8 ──────────────────────────────────────────────────┐┌ Pane #5 ─────────────────────────────────────────────────┐
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout.snap
new file mode 100644
index 00000000..71021120
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__new_pane_in_auto_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5097
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_tab_with_floating_panes.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_tab_with_floating_panes.snap
index e90a13dc..da14ad29 100644
--- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_tab_with_floating_panes.snap
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_tab_with_floating_panes.snap
@@ -1,6 +1,6 @@
---
source: zellij-server/src/tab/./unit/tab_integration_tests.rs
-assertion_line: 1371
+assertion_line: 1544
expression: snapshot
---
00 (C): ┌ Pane #1 ────────────────────┌ ┌ ┌ Pane #4 ─────────────────────────────────── SCROLL: 0/1 ┐─────┐
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_whole_tab_while_floting_pane_is_suppressed.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_whole_tab_while_floting_pane_is_suppressed.snap
index d4e106aa..2a886db7 100644
--- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_whole_tab_while_floting_pane_is_suppressed.snap
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__resize_whole_tab_while_floting_pane_is_suppressed.snap
@@ -1,6 +1,6 @@
---
source: zellij-server/src/tab/./unit/tab_integration_tests.rs
-assertion_line: 1801
+assertion_line: 2220
expression: snapshot
---
00 (C): ┌ Pane #1 ────────────────────┌ EDITING SCROLLBACK ──────────────────────────────────────┐─────────┐
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically.snap
index e6f1786c..cfa37b74 100644
--- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically.snap
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically.snap
@@ -1,6 +1,6 @@
---
source: zellij-server/src/tab/./unit/tab_integration_tests.rs
-assertion_line: 1421
+assertion_line: 1594
expression: snapshot
---
00 (C): ┌ Pane #1 ────────────────────┌ ┌ ┌ Pane #4 ── 0 ┐
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically_and_expand_back.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically_and_expand_back.snap
index a005424f..a7c0f582 100644
--- a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically_and_expand_back.snap
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__shrink_whole_tab_with_floating_panes_horizontally_and_vertically_and_expand_back.snap
@@ -1,6 +1,6 @@
---
source: zellij-server/src/tab/./unit/tab_integration_tests.rs
-assertion_line: 1475
+assertion_line: 1648
expression: snapshot
---
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__stacked_panes_can_become_fullscreen.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__stacked_panes_can_become_fullscreen.snap
new file mode 100644
index 00000000..746d110e
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__stacked_panes_can_become_fullscreen.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4667
+expression: snapshot
+---
+00 (C): ┌ Pane #5 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_command_panes_absent_from_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_command_panes_absent_from_existing_layout.snap
new file mode 100644
index 00000000..6bdd963e
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_command_panes_absent_from_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5541
+expression: snapshot
+---
+00 (C): ┌ Pane #2 ─────────────────────────────────────────────────┐────────────────────────────────────────────────────────────┐
+01 (C): │ │ │
+02 (C): │ │ │
+03 (C): │ │ │
+04 (C): │ │ │
+05 (C): │ ┌ status-bar ──────────────────────────────────────────────┐ │
+06 (C): │ │I am a │ │
+07 (C): │ │status bar │─┐ │
+08 (C): │ │ │ │ │
+09 (C): └─────────────────────────────│ │───┐ │
+10 (C): │ ┌ Pane #3 ──────────│ │ │ │
+11 (C): │ │ │ │ │ │
+12 (C): │ │ │ │ │ │
+13 (C): │ │ │ │ │ │
+14 (C): │ │ └──────────────────────────────────────────────────────────┘ │ │
+15 (C): │ │ │ │ │ │
+16 (C): │ │ └─│ │ │
+17 (C): │ │ │ │ │
+18 (C): │ │ └──────────────────────────────────────────────────────────┘ │
+19 (C): └─────────└──────────────────────────────────────────────────────────┘──────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_plugin_panes_absent_from_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_plugin_panes_absent_from_existing_layout.snap
new file mode 100644
index 00000000..2f06d931
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_including_plugin_panes_absent_from_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5672
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ ┌ Pane #2 ─────────────────────────────────────────────────┐ │
+06 (C): │ │ │ │
+07 (C): │ │ ┌ Pane #3 ─────────────────────────────────────────────────┐ │
+08 (C): │ │ │ │ │
+09 (C): │ │ │ ┌ Pane #4 ─────────────────────────────────────────────────┐ │
+10 (C): │ │ │ │ │ │
+11 (C): │ │ │ │ │ │
+12 (C): │ │ │ │ │ │
+13 (C): │ │ │ │ │ │
+14 (C): │ └─│ │ │ │
+15 (C): │ │ │ │ │
+16 (C): │ └─│ │ │
+17 (C): │ │ │ │
+18 (C): │ └──────────────────────────────────────────────────────────┘ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_command_panes_present_in_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_command_panes_present_in_existing_layout.snap
new file mode 100644
index 00000000..29553797
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_command_panes_present_in_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5614
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ ┌ command2 ────────────────────────────┐ │
+03 (C): │ │ │ │
+04 (C): │ │ ┌ tab-bar ─────────────────────────────┐ │
+05 (C): │ │ │I am a tab bar ┌ status-bar ──────────────────────────────────────────────┐ │
+06 (C): │ │ │ │I am a │ │
+07 (C): │ └─│ │status bar │─┐ │
+08 (C): │ │ │ │ │ │
+09 (C): │ └─────────────────────────│ │───┐ │
+10 (C): │ │ │ │ │
+11 (C): │ │ │ │ │
+12 (C): │ │ │ │ │
+13 (C): │ │ │ │ │
+14 (C): │ └──────────────────────────────────────────────────────────┘ │ │
+15 (C): │ │ │ <ENTER> to run, <Ctrl-c> to exit │ │
+16 (C): │ └─│ │ │
+17 (C): │ │ │ │
+18 (C): │ └──────────────────────────────────────────────────────────┘ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_plugin_panes_present_in_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_plugin_panes_present_in_existing_layout.snap
new file mode 100644
index 00000000..e6baccbe
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_floating_layouts_not_including_plugin_panes_present_in_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5734
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ ┌ Pane #2 ─────────────────────────────────────────────────┐ │
+06 (C): │ │ │ │
+07 (C): │ │ ┌ tab-bar ─────────────────────────────────────────────────┐ │
+08 (C): │ │ │I am a tab bar │ │
+09 (C): │ │ │ ┌ status-bar ──────────────────────────────────────────────┐ │
+10 (C): │ │ │ │I am a │ │
+11 (C): │ │ │ │status bar │ │
+12 (C): │ │ │ │ │ │
+13 (C): │ │ │ │ │ │
+14 (C): │ └─│ │ │ │
+15 (C): │ │ │ │ │
+16 (C): │ └─│ │ │
+17 (C): │ │ │ │
+18 (C): │ └──────────────────────────────────────────────────────────┘ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_command_panes_absent_from_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_command_panes_absent_from_existing_layout.snap
new file mode 100644
index 00000000..5b7bd24e
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_command_panes_absent_from_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4831
+expression: snapshot
+---
+00 (C): I am a
+01 (C): status bar
+02 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+08 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): │ │
+13 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+14 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+19 (C): I am a tab bar
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_plugin_panes_absent_from_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_plugin_panes_absent_from_existing_layout.snap
new file mode 100644
index 00000000..df1a8e09
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_including_plugin_panes_absent_from_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4966
+expression: snapshot
+---
+00 (C):
+01 (C):
+02 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): │ │
+10 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+11 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_command_panes_present_in_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_command_panes_present_in_existing_layout.snap
new file mode 100644
index 00000000..dd0cbbd7
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_command_panes_present_in_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 4904
+expression: snapshot
+---
+00 (C): I am a
+01 (C): status bar
+02 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+08 (C): ┌ command1 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+09 (C): │ │
+10 (C): │ Waiting to run: command1 │
+11 (C): │ │
+12 (C): │ <ENTER> to run, <Ctrl-c> to exit │
+13 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+14 (C): ┌ command2 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+15 (C): │ Waiting to run: command2 │
+16 (C): │ │
+17 (C): │ <ENTER> to run, <Ctrl-c> to exit │
+18 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+19 (C): I am a tab bar
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_plugin_panes_present_in_existing_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_plugin_panes_present_in_existing_layout.snap
new file mode 100644
index 00000000..258ea58b
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_layouts_not_including_plugin_panes_present_in_existing_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5035
+expression: snapshot
+---
+00 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+02 (C): ┌ command1 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+03 (C): │ │
+04 (C): │ Waiting to run: command1 │
+05 (C): │ │
+06 (C): │ <ENTER> to run, <Ctrl-c> to exit │
+07 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+08 (C): ┌ command2 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+09 (C): │ │
+10 (C): │ Waiting to run: command2 │
+11 (C): │ │
+12 (C): │ <ENTER> to run, <Ctrl-c> to exit │
+13 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+14 (C): ┌ status-bar ───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+15 (C): │I am a │
+16 (C): │status bar │
+17 (C): │ │
+18 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+19 (C): ┌ tab-bar ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children.snap
new file mode 100644
index 00000000..4a51d490
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3176
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ │┌ Pane #3 ─────────────────────────────────────────────────┐
+02 (C): │ │┌ Pane #4 ─────────────────────────────────────────────────┐
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children_and_no_pane_frames.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children_and_no_pane_frames.snap
new file mode 100644
index 00000000..7174f10a
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swap_tiled_layout_with_stacked_children_and_no_pane_frames.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3204
+expression: snapshot
+---
+00 (C): ├─ Pane #2 ─────────────────────────────────────────────────
+01 (C): ├─ Pane #3 ─────────────────────────────────────────────────
+02 (C): ├─ Pane #4 ─────────────────────────────────────────────────
+03 (C): │
+04 (C): │
+05 (C): │
+06 (C): │
+07 (C): │
+08 (C): │
+09 (C): │
+10 (C): │
+11 (C): │
+12 (C): │
+13 (C): │
+14 (C): │
+15 (C): │
+16 (C): │
+17 (C): │
+18 (C): │
+19 (C): │
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swapping_layouts_after_resize_snaps_to_current_layout.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swapping_layouts_after_resize_snaps_to_current_layout.snap
new file mode 100644
index 00000000..4322a975
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__swapping_layouts_after_resize_snaps_to_current_layout.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 3132
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────┐┌ Pane #2 ─────────────────────────────────────────────────┐
+01 (C): │ ││ │
+02 (C): │ ││ │
+03 (C): │ ││ │
+04 (C): │ ││ │
+05 (C): │ ││ │
+06 (C): │ ││ │
+07 (C): │ ││ │
+08 (C): │ ││ │
+09 (C): │ ││ │
+10 (C): │ ││ │
+11 (C): │ ││ │
+12 (C): │ ││ │
+13 (C): │ ││ │
+14 (C): │ ││ │
+15 (C): │ ││ │
+16 (C): │ ││ │
+17 (C): │ ││ │
+18 (C): │ ││ │
+19 (C): └───────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_floating_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_floating_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap
new file mode 100644
index 00000000..331e678b
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_floating_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 6028
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ ┌ Pane #3 ─────────────────────────────────────────────────┐ │
+06 (C): │ │ │ │
+07 (C): │ │ │─┐ │
+08 (C): │ │ │ │ │
+09 (C): │ │ │ │ │
+10 (C): │ │ │ │ │
+11 (C): │ │ │ │ │
+12 (C): │ │ │ │ │
+13 (C): │ │ │ │ │
+14 (C): │ └──────────────────────────────────────────────────────────┘ │ │
+15 (C): │ │ │ │
+16 (C): │ └──────────────────────────────────────────────────────────┘ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap
new file mode 100644
index 00000000..8f548b1d
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_closing_a_pane_in_auto_layout_the_focus_goes_to_last_focused_pane.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5333
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ │
+09 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+10 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+11 (C): │ │
+12 (C): │ │
+13 (C): │ │
+14 (C): │ │
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_resizing_whole_tab_with_auto_layout_and_floating_panes_the_layout_is_maintained.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_resizing_whole_tab_with_auto_layout_and_floating_panes_the_layout_is_maintained.snap
new file mode 100644
index 00000000..26bcb978
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_resizing_whole_tab_with_auto_layout_and_floating_panes_the_layout_is_maintained.snap
@@ -0,0 +1,36 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 6079
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): │ │
+07 (C): │ │
+08 (C): │ ┌ Pane #2 ────────────────────────────────────────────────────────────────┐ │
+09 (C): │ │ │ │
+10 (C): │ │ ┌ Pane #3 ────────────────────────────────────────────────────────────────┐ │
+11 (C): │ │ │ │ │
+12 (C): │ │ │ ┌ Pane #4 ────────────────────────────────────────────────────────────────┐ │
+13 (C): │ │ │ │ │ │
+14 (C): │ │ │ │ │ │
+15 (C): │ │ │ │ │ │
+16 (C): │ │ │ │ │ │
+17 (C): │ │ │ │ │ │
+18 (C): │ │ │ │ │ │
+19 (C): │ │ │ │ │ │
+20 (C): │ │ │ │ │ │
+21 (C): │ │ │ │ │ │
+22 (C): │ └─│ │ │ │
+23 (C): │ │ │ │ │
+24 (C): │ └─│ │ │
+25 (C): │ │ │ │
+26 (C): │ └─────────────────────────────────────────────────────────────────────────┘ │
+27 (C): │ │
+28 (C): │ │
+29 (C): └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap
new file mode 100644
index 00000000..985cb317
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5859
+expression: snapshot
+---
+00 (C): ┌ Pane #2 ─────────────────────────────────────────────────┐────────────────────────────────────────────────────────────┐
+01 (C): │ │ │
+02 (C): │ │ │
+03 (C): │ │ │
+04 (C): │ │ │
+05 (C): │ ┌ Pane #3 ─────────────────────────────────────────────────┐ │
+06 (C): │ │ │ │
+07 (C): │ │ ┌ Pane #4 ─────────────────────────────────────────────────┐ │
+08 (C): │ │ │ │ │
+09 (C): └─────────────────────────────│ │ │ │
+10 (C): │ │ │ │ │
+11 (C): │ │ │ │ │
+12 (C): │ │ │ │ │
+13 (C): │ │ │ │ │
+14 (C): │ └─│ │ │
+15 (C): │ │ │ │
+16 (C): │ └──────────────────────────────────────────────────────────┘ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap
new file mode 100644
index 00000000..c42856cd
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5915
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ ┌ Pane #4 ─────────────────────────────────────────────────┐ │
+06 (C): │ │ │ │
+07 (C): │ │ │─┐ │
+08 (C): │ │ │ │ │
+09 (C): │ │ │ │─┐ │
+10 (C): │ │ │ │ │ │
+11 (C): │ │ │ │ │ │
+12 (C): │ │ │ │ │ │
+13 (C): │ │ │ │ │ │
+14 (C): │ └──────────────────────────────────────────────────────────┘ │ │ │
+15 (C): │ │ │ │ │
+16 (C): │ └──────────────────────────────────────────────────────────┘ │ │
+17 (C): │ │ │ │
+18 (C): │ └──────────────────────────────────────────────────────────┘ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap
new file mode 100644
index 00000000..36c93e27
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_floating_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5970
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ ┌ Pane #4 ─────────────────────────────────────────────────┐ │
+06 (C): │ │ │ │
+07 (C): │ │ │─┐ │
+08 (C): │ │ │ │ │
+09 (C): │ │ ┌ Pane #2 ─────────────────────────────────────────────────┐ │
+10 (C): │ │ │ │ │
+11 (C): │ │ │ │ │
+12 (C): │ │ │ │ │
+13 (C): │ │ │ │ │
+14 (C): │ └───│ │ │
+15 (C): │ │ │ │ │
+16 (C): │ └─│ │ │
+17 (C): │ │ │ │
+18 (C): │ └──────────────────────────────────────────────────────────┘ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap
new file mode 100644
index 00000000..7124c336
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5160
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+01 (C): │ │
+02 (C): │ │
+03 (C): │ │
+04 (C): │ │
+05 (C): │ │
+06 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+07 (C): ┌ Pane #2 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+08 (C): │ │
+09 (C): │ │
+10 (C): │ │
+11 (C): │ │
+12 (C): │ │
+13 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+14 (C): ┌ Pane #3 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+15 (C): │ │
+16 (C): │ │
+17 (C): │ │
+18 (C): │ │
+19 (C): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap
new file mode 100644
index 00000000..ba1a4e3f
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_pane_focuses_on_focused_node.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5216
+expression: snapshot
+---
+00 (C): ┌ Pane #2 ──────────────────────────────┐┌ Pane #1 ─────────────────────────────┐┌ Pane #3 ─────────────────────────────┐
+01 (C): │ ││ ││ │
+02 (C): │ ││ ││ │
+03 (C): │ ││ ││ │
+04 (C): │ ││ ││ │
+05 (C): │ ││ ││ │
+06 (C): │ ││ ││ │
+07 (C): │ ││ ││ │
+08 (C): │ ││ ││ │
+09 (C): │ ││ ││ │
+10 (C): │ ││ ││ │
+11 (C): │ ││ ││ │
+12 (C): │ ││ ││ │
+13 (C): │ ││ ││ │
+14 (C): │ ││ ││ │
+15 (C): │ ││ ││ │
+16 (C): │ ││ ││ │
+17 (C): │ ││ ││ │
+18 (C): │ ││ ││ │
+19 (C): └───────────────────────────────────────┘└──────────────────────────────────────┘└──────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap
new file mode 100644
index 00000000..d5f33377
--- /dev/null
+++ b/zellij-server/src/tab/unit/snapshots/zellij_server__tab__tab_integration_tests__when_swapping_tiled_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node.snap
@@ -0,0 +1,26 @@
+---
+source: zellij-server/src/tab/./unit/tab_integration_tests.rs
+assertion_line: 5274
+expression: snapshot
+---
+00 (C): ┌ Pane #1 ──────────────────────────────┐┌ Pane #3 ─────────────────────────────┐┌ Pane #2 ─────────────────────────────┐
+01 (C): │ ││ ││ │
+02 (C): │ ││ ││ │
+03 (C): │ ││ ││ │
+04 (C): │ ││ ││ │
+05 (C): │ ││ ││ │
+06 (C): │ ││ ││ │
+07 (C): │ ││ ││ │
+08 (C): │ ││ ││ │
+09 (C): │ ││ ││ │
+10 (C): │ ││ ││ │
+11 (C): │ ││ ││ │
+12 (C): │ ││ ││ │
+13 (C): │ ││ ││ │
+14 (C): │ ││ ││ │
+15 (C): │ ││ ││ │
+16 (C): │ ││ ││ │
+17 (C): │ ││ ││ │
+18 (C): │ ││ ││ │
+19 (C): └───────────────────────────────────────┘└──────────────────────────────────────┘└──────────────────────────────────────┘
+
diff --git a/zellij-server/src/tab/unit/tab_integration_tests.rs b/zellij-server/src/tab/unit/tab_integration_tests.rs
index 63bfa3f3..3defa1e6 100644
--- a/zellij-server/src/tab/unit/tab_integration_tests.rs
+++ b/zellij-server/src/tab/unit/tab_integration_tests.rs
@@ -6,6 +6,7 @@ use crate::Mutex;
use crate::{
os_input_output::{AsyncReader, Pid, ServerOsApi},
panes::PaneId,
+ plugins::PluginInstruction,
thread_bus::ThreadSenders,
ClientId,
};
@@ -16,7 +17,11 @@ use zellij_utils::data::Resize;
use zellij_utils::data::ResizeStrategy;
use zellij_utils::envs::set_session_name;
use zellij_utils::errors::{prelude::*, ErrorContext};
-use zellij_utils::input::layout::{Layout, PaneLayout};
+use zellij_utils::input::layout::{
+ FloatingPaneLayout, Layout, RunPluginLocation, SwapFloatingLayout, SwapTiledLayout,
+ TiledPaneLayout,
+};
+use zellij_utils::input::plugins::PluginTag;
use zellij_utils::ipc::IpcReceiverWithContext;
use zellij_utils::pane_size::{Size, SizeInPixels};
use zellij_utils::position::Position;
@@ -197,6 +202,7 @@ fn create_new_tab(size: Size, default_mode: ModeInfo) -> Tab {
let mode_info = default_mode;
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -220,15 +226,17 @@ fn create_new_tab(size: Size, default_mode: ModeInfo) -> Tab {
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]),
);
tab.apply_layout(
- PaneLayout::default(),
+ TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
@@ -239,6 +247,88 @@ fn create_new_tab(size: Size, default_mode: ModeInfo) -> Tab {
tab
}
+fn create_new_tab_with_swap_layouts(
+ size: Size,
+ default_mode: ModeInfo,
+ swap_layouts: (Vec<SwapTiledLayout>, Vec<SwapFloatingLayout>),
+ base_layout_and_ids: Option<(
+ TiledPaneLayout,
+ Vec<FloatingPaneLayout>,
+ Vec<(u32, Option<RunCommand>)>,
+ Vec<(u32, Option<RunCommand>)>,
+ HashMap<RunPluginLocation, Vec<u32>>,
+ )>,
+ draw_pane_frames: bool,
+) -> Tab {
+ set_session_name("test".into());
+ let index = 0;
+ let position = 0;
+ let name = String::new();
+ let os_api = Box::new(FakeInputOutput::default());
+ let mut senders = ThreadSenders::default().silently_fail_on_send();
+ let (mock_plugin_sender, _mock_plugin_receiver): ChannelWithContext<PluginInstruction> =
+ channels::unbounded();
+ senders.replace_to_plugin(SenderWithContext::new(mock_plugin_sender));
+ let max_panes = None;
+ let mode_info = default_mode;
+ let style = Style::default();
+ let auto_layout = true;
+ let client_id = 1;
+ let session_is_mirrored = true;
+ let mut connected_clients = HashSet::new();
+ connected_clients.insert(client_id);
+ let connected_clients = Rc::new(RefCell::new(connected_clients));
+ let character_cell_info = Rc::new(RefCell::new(None));
+ let terminal_emulator_colors = Rc::new(RefCell::new(Palette::default()));
+ let copy_options = CopyOptions::default();
+ let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
+ let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
+ let mut tab = Tab::new(
+ index,
+ position,
+ name,
+ size,
+ character_cell_info,
+ sixel_image_store,
+ os_api,
+ senders,
+ max_panes,
+ style,
+ mode_info,
+ draw_pane_frames,
+ auto_layout,
+ connected_clients,
+ session_is_mirrored,
+ client_id,
+ copy_options,
+ terminal_emulator_colors,
+ terminal_emulator_color_codes,
+ swap_layouts,
+ );
+ let (
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ ) = base_layout_and_ids.unwrap_or_default();
+ let new_terminal_ids = if new_terminal_ids.is_empty() {
+ vec![(1, None)]
+ } else {
+ new_terminal_ids
+ };
+ tab.apply_layout(
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ client_id,
+ )
+ .unwrap();
+ tab
+}
+
fn create_new_tab_with_os_api(
size: Size,
default_mode: ModeInfo,
@@ -254,6 +344,7 @@ fn create_new_tab_with_os_api(
let mode_info = default_mode;
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -277,15 +368,17 @@ fn create_new_tab_with_os_api(
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]), // swap layouts
);
tab.apply_layout(
- PaneLayout::default(),
+ TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
@@ -307,6 +400,7 @@ fn create_new_tab_with_layout(size: Size, default_mode: ModeInfo, layout: &str)
let mode_info = default_mode;
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -317,7 +411,7 @@ fn create_new_tab_with_layout(size: Size, default_mode: ModeInfo, layout: &str)
let copy_options = CopyOptions::default();
let terminal_emulator_color_codes = Rc::new(RefCell::new(HashMap::new()));
let sixel_image_store = Rc::new(RefCell::new(SixelImageStore::default()));
- let layout = Layout::from_str(layout, "layout_file_name".into(), None).unwrap();
+ let layout = Layout::from_str(layout, "layout_file_name".into(), None, None).unwrap();
let (tab_layout, floating_panes_layout) = layout.new_tab();
let mut tab = Tab::new(
index,
@@ -332,12 +426,14 @@ fn create_new_tab_with_layout(size: Size, default_mode: ModeInfo, layout: &str)
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]), // swap layouts
);
let pane_ids = tab_layout
.extract_run_instructions()
@@ -378,6 +474,7 @@ fn create_new_tab_with_mock_pty_writer(
let mode_info = default_mode;
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -401,15 +498,17 @@ fn create_new_tab_with_mock_pty_writer(
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]), // swap layouts
);
tab.apply_layout(
- PaneLayout::default(),
+ TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
@@ -436,6 +535,7 @@ fn create_new_tab_with_sixel_support(
let mode_info = ModeInfo::default();
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -461,15 +561,17 @@ fn create_new_tab_with_sixel_support(
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]), // swap layouts
);
tab.apply_layout(
- PaneLayout::default(),
+ TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
@@ -609,7 +711,7 @@ fn new_floating_pane() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -637,10 +739,10 @@ fn floating_panes_persist_across_toggles() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
// here we send bytes to the pane when it's not visible to make sure they're still handled and
// we see them once we toggle the panes back
tab.handle_pty_bytes(
@@ -648,7 +750,7 @@ fn floating_panes_persist_across_toggles() {
Vec::from("\n\n\n I am scratch terminal".as_bytes()),
)
.unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
@@ -669,7 +771,7 @@ fn toggle_floating_panes_off() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -677,7 +779,7 @@ fn toggle_floating_panes_off() {
Vec::from("\n\n\n I am scratch terminal".as_bytes()),
)
.unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
@@ -698,7 +800,7 @@ fn toggle_floating_panes_on() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -706,8 +808,8 @@ fn toggle_floating_panes_on() {
Vec::from("\n\n\n I am scratch terminal".as_bytes()),
)
.unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
@@ -732,7 +834,7 @@ fn five_new_floating_panes() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -776,7 +878,7 @@ fn increase_floating_pane_size() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id_1 = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -806,7 +908,7 @@ fn decrease_floating_pane_size() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id_1 = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -836,7 +938,7 @@ fn resize_floating_pane_left() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id_1 = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -869,7 +971,7 @@ fn resize_floating_pane_right() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id_1 = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -902,7 +1004,7 @@ fn resize_floating_pane_up() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id_1 = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -935,7 +1037,7 @@ fn resize_floating_pane_down() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id_1 = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -972,7 +1074,7 @@ fn move_floating_pane_focus_left() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1027,7 +1129,7 @@ fn move_floating_pane_focus_right() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1083,7 +1185,7 @@ fn move_floating_pane_focus_up() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1138,7 +1240,7 @@ fn move_floating_pane_focus_down() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1194,7 +1296,7 @@ fn move_floating_pane_focus_with_mouse() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1252,7 +1354,7 @@ fn move_pane_focus_with_mouse_to_non_floating_pane() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1310,7 +1412,7 @@ fn drag_pane_with_mouse() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1368,7 +1470,7 @@ fn mark_text_inside_floating_pane() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1434,7 +1536,7 @@ fn resize_tab_with_floating_panes() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1488,7 +1590,7 @@ fn shrink_whole_tab_with_floating_panes_horizontally_and_vertically() {
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1538,7 +1640,7 @@ fn shrink_whole_tab_with_floating_panes_horizontally_and_vertically_and_expand_b
let new_pane_id_4 = PaneId::Terminal(5);
let new_pane_id_5 = PaneId::Terminal(6);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -1589,7 +1691,7 @@ fn embed_floating_pane() {
let mut tab = create_new_tab(size, ModeInfo::default());
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -1647,7 +1749,7 @@ fn embed_floating_pane_without_pane_frames() {
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
tab.set_pane_frames(false);
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.handle_pty_bytes(
@@ -1865,7 +1967,7 @@ fn move_floating_pane_with_sixel_image() {
})));
let mut output = Output::new(sixel_image_store.clone(), character_cell_size);
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
let fixture = read_fixture("sixel-image-500px.six");
@@ -1903,7 +2005,7 @@ fn floating_pane_above_sixel_image() {
})));
let mut output = Output::new(sixel_image_store.clone(), character_cell_size);
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
let fixture = read_fixture("sixel-image-500px.six");
@@ -1960,7 +2062,7 @@ fn suppress_floating_pane() {
let editor_pane_id = PaneId::Terminal(3);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.suppress_active_pane(editor_pane_id, client_id).unwrap();
@@ -1991,7 +2093,7 @@ fn close_suppressing_tiled_pane() {
.unwrap();
tab.handle_pty_bytes(1, Vec::from("\n\n\nI am the original pane".as_bytes()))
.unwrap();
- tab.close_pane(new_pane_id, false);
+ tab.close_pane(new_pane_id, false, None);
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
@@ -2014,7 +2116,7 @@ fn close_suppressing_floating_pane() {
let editor_pane_id = PaneId::Terminal(3);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.suppress_active_pane(editor_pane_id, client_id).unwrap();
@@ -2022,7 +2124,7 @@ fn close_suppressing_floating_pane() {
.unwrap();
tab.handle_pty_bytes(2, Vec::from("\n\n\nI am the original pane".as_bytes()))
.unwrap();
- tab.close_pane(editor_pane_id, false);
+ tab.close_pane(editor_pane_id, false, None);
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
@@ -2049,7 +2151,7 @@ fn suppress_tiled_pane_float_it_and_close() {
tab.handle_pty_bytes(1, Vec::from("\n\n\nI am the original pane".as_bytes()))
.unwrap();
tab.toggle_pane_embed_or_floating(client_id).unwrap();
- tab.close_pane(new_pane_id, false);
+ tab.close_pane(new_pane_id, false, None);
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
@@ -2072,7 +2174,7 @@ fn suppress_floating_pane_embed_it_and_close_it() {
let editor_pane_id = PaneId::Terminal(3);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.suppress_active_pane(editor_pane_id, client_id).unwrap();
@@ -2081,7 +2183,7 @@ fn suppress_floating_pane_embed_it_and_close_it() {
tab.handle_pty_bytes(2, Vec::from("\n\n\nI am the original pane".as_bytes()))
.unwrap();
tab.toggle_pane_embed_or_floating(client_id).unwrap();
- tab.close_pane(editor_pane_id, false);
+ tab.close_pane(editor_pane_id, false, None);
tab.render(&mut output, None).unwrap();
let snapshot = take_snapshot(
output.serialize().unwrap().get(&client_id).unwrap(),
@@ -2132,7 +2234,7 @@ fn resize_whole_tab_while_floting_pane_is_suppressed() {
let editor_pane_id = PaneId::Terminal(3);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
tab.suppress_active_pane(editor_pane_id, client_id).unwrap();
@@ -2233,7 +2335,7 @@ fn enter_search_floating_pane() {
let mut tab = create_new_tab(size, mode_info);
let new_pane_id = PaneId::Terminal(2);
let mut output = Output::default();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id, None, None, Some(client_id))
.unwrap();
@@ -2773,7 +2875,7 @@ fn move_floating_pane_focus_sends_tty_csi_event() {
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -2816,12 +2918,12 @@ fn toggle_floating_panes_on_sends_tty_csi_event() {
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
.unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.handle_pty_bytes(
1,
// subscribe to focus events
@@ -2840,7 +2942,7 @@ fn toggle_floating_panes_on_sends_tty_csi_event() {
Vec::from("\u{1b}[?1004h".as_bytes()),
)
.unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
assert_snapshot!(format!("{:?}", *tty_stdin_bytes.lock().unwrap()));
}
@@ -2860,7 +2962,7 @@ fn toggle_floating_panes_off_sends_tty_csi_event() {
let new_pane_id_1 = PaneId::Terminal(2);
let new_pane_id_2 = PaneId::Terminal(3);
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
tab.new_pane(new_pane_id_1, None, None, Some(client_id))
.unwrap();
tab.new_pane(new_pane_id_2, None, None, Some(client_id))
@@ -2883,6 +2985,3867 @@ fn toggle_floating_panes_off_sends_tty_csi_event() {
Vec::from("\u{1b}[?1004h".as_bytes()),
)
.unwrap();
- tab.toggle_floating_panes(client_id, None).unwrap();
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
assert_snapshot!(format!("{:?}", *tty_stdin_bytes.lock().unwrap()));
}
+
+#[test]
+fn can_swap_tiled_layout_at_runtime() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab max_panes=2 split_direction="vertical" {
+ pane
+ pane
+ }
+ }
+ swap_tiled_layout {
+ tab max_panes=2 {
+ pane
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn can_swap_floating_layout_at_runtime() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes max_panes=2 {
+ pane
+ pane
+ }
+ }
+ swap_floating_layout {
+ floating_panes max_panes=2 {
+ pane {
+ x "0%"
+ }
+ pane {
+ x "100%"
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+
+ tab.toggle_floating_panes(Some(client_id), None).unwrap();
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swapping_layouts_after_resize_snaps_to_current_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane
+ }
+ }
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane
+ pane
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.resize(client_id, ResizeStrategy::new(Resize::Increase, None))
+ .unwrap();
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_tiled_layout_with_stacked_children() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_tiled_layout_with_stacked_children_and_no_pane_frames() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ false,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn move_focus_up_with_stacked_panes() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.move_focus_up(client_id);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn move_focus_down_with_stacked_panes() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.move_focus_up(client_id);
+ tab.move_focus_down(client_id);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn move_focus_right_into_stacked_panes() {
+ // here we make sure that when we focus right into a stack,
+ // we will always focus on the "main" pane of the stack
+ // and not on one of its folds
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ for i in 0..12 {
+ let new_pane_id = i + 2;
+ tab.new_pane(PaneId::Terminal(new_pane_id), None, None, Some(client_id))
+ .unwrap();
+ }
+ tab.move_focus_left(client_id);
+ tab.horizontal_split(PaneId::Terminal(16), None, client_id)
+ .unwrap();
+
+ tab.move_focus_up(client_id);
+ tab.move_focus_right(client_id);
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((62, 12)),
+ "cursor coordinates moved to the main pane of the stack",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn move_focus_left_into_stacked_panes() {
+ // here we make sure that when we focus left into a stack,
+ // we will always focus on the "main" pane of the stack
+ // and not on one of its folds
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane { children stacked=true; }
+ pane focus=true
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ for i in 0..13 {
+ let new_pane_id = i + 2;
+ tab.new_pane(PaneId::Terminal(new_pane_id), None, None, Some(client_id))
+ .unwrap();
+ }
+ tab.move_focus_right(client_id);
+ tab.horizontal_split(PaneId::Terminal(1), None, client_id)
+ .unwrap();
+
+ tab.move_focus_up(client_id);
+ tab.move_focus_left(client_id);
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((1, 12)),
+ "cursor coordinates moved to the main pane of the stack",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn move_focus_up_into_stacked_panes() {
+ // here we make sure that when we focus up into a stack,
+ // the main pane will become the lowest pane and the sizes
+ // in the stack will be adjusted accordingly
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ for i in 0..4 {
+ let new_pane_id = i + 3;
+ tab.new_pane(PaneId::Terminal(new_pane_id), None, None, Some(client_id))
+ .unwrap();
+ }
+ tab.move_focus_right(client_id);
+ tab.move_focus_up(client_id);
+ tab.move_focus_left(client_id);
+ tab.move_focus_down(client_id);
+ tab.vertical_split(PaneId::Terminal(7), None, client_id)
+ .unwrap();
+
+ tab.move_focus_up(client_id);
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((62, 9)),
+ "cursor coordinates moved to the main pane of the stack",
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn move_focus_down_into_stacked_panes() {
+ // here we make sure that when we focus down into a stack,
+ // the main pane will become the highest pane and the sizes
+ // in the stack will be adjusted accordingly
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ for i in 0..4 {
+ let new_pane_id = i + 3;
+ tab.new_pane(PaneId::Terminal(new_pane_id), None, None, Some(client_id))
+ .unwrap();
+ }
+ tab.move_focus_left(client_id);
+ tab.move_focus_up(client_id);
+ tab.vertical_split(PaneId::Terminal(7), None, client_id)
+ .unwrap();
+
+ tab.move_focus_down(client_id);
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((62, 8)),
+ "cursor coordinates moved to the main pane of the stack",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn close_main_stacked_pane() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.close_pane(new_pane_id_2, false, None);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn close_main_stacked_pane_in_mid_stack() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.move_focus_up(client_id);
+ tab.move_focus_up(client_id);
+ tab.close_pane(new_pane_id_3, false, None);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn close_one_liner_stacked_pane_below_main_pane() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_left(client_id);
+ tab.move_focus_right(client_id);
+ tab.move_focus_up(client_id);
+ tab.move_focus_up(client_id);
+ tab.close_pane(new_pane_id_2, false, None);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn close_one_liner_stacked_pane_above_main_pane() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.move_focus_up(client_id);
+ tab.move_focus_up(client_id);
+ tab.close_pane(new_pane_id_1, false, None);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn can_increase_size_of_main_pane_in_stack_horizontally() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Left)),
+ )
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn can_increase_size_of_main_pane_in_stack_vertically() {
+ let size = Size {
+ cols: 121,
+ rows: 40,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Down)),
+ )
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn can_increase_size_of_main_pane_in_stack_non_directionally() {
+ let size = Size {
+ cols: 121,
+ rows: 40,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.resize(client_id, ResizeStrategy::new(Resize::Increase, None))
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn increasing_size_of_main_pane_in_stack_horizontally_does_not_break_stack() {
+ // here we test a situation where we're increasing the size of the main pane in a stack
+ // while adjacent to this main pane there's another pane perfectly aligned to it
+ // if the pane weren't a member of the stack, we would increase into that adjacent pane
+ // now, we increase all of the stack also into the panes above said pane
+ let size = Size {
+ cols: 121,
+ rows: 40,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane {
+ pane focus=true
+ pane
+ }
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+ let new_pane_id_6 = PaneId::Terminal(7);
+ let new_pane_id_7 = PaneId::Terminal(8);
+ let new_pane_id_8 = PaneId::Terminal(9);
+ let new_pane_id_9 = PaneId::Terminal(10);
+ let new_pane_id_10 = PaneId::Terminal(11);
+ let new_pane_id_11 = PaneId::Terminal(12);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_6, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_7, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_8, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_9, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_10, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_11, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Left)),
+ )
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn can_increase_size_into_pane_stack_horizontally() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Right)),
+ )
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn can_increase_size_into_pane_stack_vertically() {
+ let size = Size {
+ cols: 121,
+ rows: 40,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_right(client_id);
+ tab.move_focus_down(client_id);
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Up)),
+ )
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn can_increase_size_into_pane_stack_non_directionally() {
+ let size = Size {
+ cols: 121,
+ rows: 40,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_left(client_id);
+ tab.resize(client_id, ResizeStrategy::new(Resize::Increase, None))
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn increasing_size_into_main_pane_in_stack_horizontally_does_not_break_stack() {
+ // here we test a situation where we're increasing the size of the main pane in a stack
+ // while adjacent to this main pane there's another pane perfectly aligned to it
+ // if the pane weren't a member of the stack, we would increase into that adjacent pane
+ // now, we increase all of the stack also into the panes above said pane
+ let size = Size {
+ cols: 121,
+ rows: 40,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane
+ pane split_direction="vertical" {
+ pane {
+ pane focus=true
+ pane
+ }
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+ let new_pane_id_6 = PaneId::Terminal(7);
+ let new_pane_id_7 = PaneId::Terminal(8);
+ let new_pane_id_8 = PaneId::Terminal(9);
+ let new_pane_id_9 = PaneId::Terminal(10);
+ let new_pane_id_10 = PaneId::Terminal(11);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_6, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_7, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_8, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_9, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_10, None, None, Some(client_id))
+ .unwrap();
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Right)),
+ )
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn decreasing_size_of_whole_tab_treats_stacked_panes_properly() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.resize_whole_tab(Size {
+ cols: 100,
+ rows: 10,
+ });
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn increasing_size_of_whole_tab_treats_stacked_panes_properly() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.resize_whole_tab(Size {
+ cols: 100,
+ rows: 10,
+ });
+ tab.resize_whole_tab(Size {
+ cols: 121,
+ rows: 20,
+ });
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn cannot_decrease_stack_size_beyond_minimum_height() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_down(client_id);
+ for _ in 0..6 {
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Up)),
+ )
+ .unwrap();
+ }
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn focus_stacked_pane_over_flexible_pane_with_the_mouse() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.handle_left_click(&Position::new(1, 71), client_id)
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn focus_stacked_pane_under_flexible_pane_with_the_mouse() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.handle_left_click(&Position::new(1, 71), client_id)
+ .unwrap();
+ tab.handle_left_click(&Position::new(9, 71), client_id)
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn close_stacked_pane_with_previously_focused_other_pane() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.handle_left_click(&Position::new(2, 71), client_id)
+ .unwrap();
+ tab.handle_left_click(&Position::new(1, 71), client_id)
+ .unwrap();
+ tab.close_pane(PaneId::Terminal(4), false, None);
+ tab.render(&mut output, None).unwrap();
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((62, 2)),
+ "cursor coordinates moved to the main pane of the stack",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn close_pane_near_stacked_panes() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane
+ pane { children stacked=true; }
+ }
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.close_pane(PaneId::Terminal(6), false, None);
+ tab.render(&mut output, None).unwrap();
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((62, 4)),
+ "cursor coordinates moved to the main pane of the stack",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn focus_next_pane_expands_stacked_panes() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_left(client_id);
+ tab.focus_next_pane(client_id);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn stacked_panes_can_become_fullscreen() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane { children stacked=true; }
+ }
+ pane
+ }
+ }
+ }
+ "#;
+ let layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ None,
+ true,
+ );
+ let new_pane_id_1 = PaneId::Terminal(2);
+ let new_pane_id_2 = PaneId::Terminal(3);
+ let new_pane_id_3 = PaneId::Terminal(4);
+ let new_pane_id_4 = PaneId::Terminal(5);
+ let new_pane_id_5 = PaneId::Terminal(6);
+
+ tab.new_pane(new_pane_id_1, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_2, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_3, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_4, None, None, Some(client_id))
+ .unwrap();
+ tab.new_pane(new_pane_id_5, None, None, Some(client_id))
+ .unwrap();
+ tab.move_focus_up(client_id);
+ tab.toggle_active_pane_fullscreen(client_id);
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn layout_with_plugins_and_commands_swaped_properly() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ pane split_direction="vertical" {
+ pane command="command1"
+ pane
+ pane command="command2"
+ }
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ pane command="command2"
+ pane command="command1"
+ pane
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_floating_terminal_ids = vec![];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn base_layout_is_included_in_swap_layouts() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ pane split_direction="vertical" {
+ pane command="command1"
+ pane
+ pane command="command2"
+ }
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ pane command="command2"
+ pane command="command1"
+ pane
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_floating_terminal_ids = vec![];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.previous_swap_layout(Some(client_id)).unwrap(); // move back to the base layout
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_layouts_including_command_panes_absent_from_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ pane split_direction="vertical" {
+ pane
+ pane
+ pane
+ }
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ pane command="command2"
+ pane command="command1"
+ pane
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_floating_terminal_ids = vec![];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_layouts_not_including_command_panes_present_in_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ pane split_direction="vertical" {
+ pane command="command1"
+ pane
+ pane command="command2"
+ }
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ pane
+ pane
+ pane
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_floating_terminal_ids = vec![];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_layouts_including_plugin_panes_absent_from_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane size=2 borderless=true
+ pane split_direction="vertical" {
+ pane
+ pane
+ pane
+ }
+ pane size=1 borderless=true
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ pane
+ pane
+ pane
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_floating_terminal_ids = vec![];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_layouts_not_including_plugin_panes_present_in_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane size=1 borderless=true {
+ plugin location="zellij:tab-bar"
+ }
+ pane split_direction="vertical" {
+ pane command="command1"
+ pane
+ pane command="command2"
+ }
+ pane size=2 borderless=true {
+ plugin location="zellij:status-bar"
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane size=2
+ pane
+ pane
+ pane
+ pane size=1
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_floating_terminal_ids = vec![];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn new_pane_in_auto_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab max_panes=5 {
+ pane split_direction="vertical" {
+ pane
+ pane { children; }
+ }
+ }
+ tab max_panes=8 {
+ pane split_direction="vertical" {
+ pane { children; }
+ pane { pane; pane; pane; pane; }
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_floating_terminal_ids = vec![];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+
+ let mut expected_cursor_coordinates = vec![
+ (62, 1),
+ (62, 11),
+ (62, 15),
+ (62, 16),
+ (1, 11),
+ (1, 15),
+ (1, 16),
+ ];
+ for i in 0..7 {
+ let new_pane_id = i + 2;
+ tab.new_pane(PaneId::Terminal(new_pane_id), None, None, Some(client_id))
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ let (expected_x, expected_y) = expected_cursor_coordinates.remove(0);
+ assert_eq!(
+ cursor_coordinates,
+ Some((expected_x, expected_y)),
+ "cursor coordinates moved to the new pane",
+ );
+ assert_snapshot!(snapshot);
+ }
+}
+
+#[test]
+fn when_swapping_tiled_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane
+ pane
+ pane
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane
+ pane
+ pane
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_floating_terminal_ids = vec![];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.move_focus_down(client_id);
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Down)),
+ )
+ .unwrap();
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((1, 8)),
+ "cursor coordinates moved to the new pane",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn when_swapping_tiled_layouts_in_an_undamaged_state_pane_focuses_on_focused_node() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane
+ pane
+ pane
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane focus=true
+ pane
+ pane
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_floating_terminal_ids = vec![];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.move_focus_down(client_id);
+ tab.next_swap_layout(Some(client_id), true).unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((1, 1)),
+ "cursor coordinates moved to the new pane",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn when_swapping_tiled_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node(
+) {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane
+ pane
+ pane
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane
+ pane
+ pane
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_floating_terminal_ids = vec![];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.move_focus_down(client_id);
+ tab.next_swap_layout(Some(client_id), true).unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((82, 1)),
+ "cursor coordinates moved to the new pane",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn when_closing_a_pane_in_auto_layout_the_focus_goes_to_last_focused_pane() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ pane
+ pane
+ pane
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_tiled_layout {
+ tab {
+ pane split_direction="vertical" {
+ pane
+ pane
+ pane
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_floating_terminal_ids = vec![];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.move_focus_down(client_id);
+ tab.move_focus_down(client_id);
+ tab.close_pane(PaneId::Terminal(3), false, Some(client_id));
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((1, 11)),
+ "cursor coordinates moved to the new pane",
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn floating_layout_with_plugins_and_commands_swaped_properly() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane x=0 y=0 {
+ plugin location="zellij:tab-bar"
+ }
+ pane x=0 y=10 command="command1"
+ pane
+ pane x=50 y=10 command="command2"
+ pane x=50 y=0 {
+ plugin location="zellij:status-bar"
+ }
+ }
+ }
+ "#;
+ // this swap layout swaps between the location of the plugins and the commands
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane x=0 y=0 {
+ plugin location="zellij:status-bar"
+ }
+ pane x=0 y=10 command="command2"
+ pane
+ pane x=50 y=10 command="command1"
+ pane x=50 y=0 {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_floating_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_terminal_ids = vec![(4, None)];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn base_floating_layout_is_included_in_swap_layouts() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane x=0 y=0 {
+ plugin location="zellij:tab-bar"
+ }
+ pane x=0 y=10 command="command1"
+ pane
+ pane x=50 y=10 command="command2"
+ pane x=50 y=0 {
+ plugin location="zellij:status-bar"
+ }
+ }
+ }
+ "#;
+ // this swap layout swaps between the location of the plugins and the commands
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane x=0 y=0 {
+ plugin location="zellij:status-bar"
+ }
+ pane x=0 y=10 command="command2"
+ pane
+ pane x=50 y=10 command="command1"
+ pane x=50 y=0 {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_floating_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_terminal_ids = vec![(4, None)];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.previous_swap_layout(Some(client_id)).unwrap(); // move back to the base layout
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_floating_layouts_including_command_panes_absent_from_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane {
+ plugin location="zellij:tab-bar"
+ }
+ pane
+ pane
+ pane
+ pane {
+ plugin location="zellij:status-bar"
+ }
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane {
+ plugin location="zellij:status-bar"
+ }
+ pane x=0 y=0 command="command1"
+ pane x=10 y=10 command="command2"
+ pane
+ pane {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_floating_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_terminal_ids = vec![(4, None)];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_floating_layouts_not_including_command_panes_present_in_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane {
+ plugin location="zellij:tab-bar"
+ }
+ pane command="command1"
+ pane
+ pane command="command2"
+ pane {
+ plugin location="zellij:status-bar"
+ }
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane {
+ plugin location="zellij:status-bar"
+ }
+ pane
+ pane
+ pane
+ pane {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_floating_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_terminal_ids = vec![(4, None)];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_floating_layouts_including_plugin_panes_absent_from_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane
+ pane
+ pane
+ }
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane {
+ plugin location="zellij:status-bar"
+ }
+ pane
+ pane {
+ plugin location="zellij:tab-bar"
+ }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_floating_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_terminal_ids = vec![(4, None)];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn swap_floating_layouts_not_including_plugin_panes_present_in_existing_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane {
+ plugin location="zellij:tab-bar"
+ }
+ pane
+ pane {
+ plugin location="zellij:status-bar"
+ }
+ }
+ }
+ "#;
+ // this swap layout changes both the split direction of the two command panes and the location
+ // of the plugins - we want to make sure that they are all placed properly and not switched
+ // around
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane
+ pane
+ pane
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let mut command_1 = RunCommand::default();
+ command_1.command = PathBuf::from("command1");
+ let mut command_2 = RunCommand::default();
+ command_2.command = PathBuf::from("command2");
+ let new_floating_terminal_ids = vec![(1, Some(command_1)), (2, None), (3, Some(command_2))];
+ let new_terminal_ids = vec![(4, None)];
+ let mut new_plugin_ids = HashMap::new();
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("tab-bar")),
+ vec![1],
+ );
+ new_plugin_ids.insert(
+ RunPluginLocation::Zellij(PluginTag::new("status-bar")),
+ vec![2],
+ );
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let _ = tab.handle_plugin_bytes(1, 1, "I am a tab bar".as_bytes().to_vec());
+ let _ = tab.handle_plugin_bytes(2, 1, "I am a\n\rstatus bar".as_bytes().to_vec());
+ tab.next_swap_layout(Some(client_id), false).unwrap();
+ tab.render(&mut output, None).unwrap();
+ let snapshot = take_snapshot(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn new_floating_pane_in_auto_layout() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout name="spread" {
+ floating_panes max_panes=1 {
+ pane {y "50%"; x "50%"; }
+ }
+ floating_panes max_panes=2 {
+ pane { x "1%"; y "25%"; width "45%"; }
+ pane { x "50%"; y "25%"; width "45%"; }
+ }
+ floating_panes max_panes=3 {
+ pane focus=true { y "55%"; width "45%"; height "45%"; }
+ pane { x "1%"; y "1%"; width "45%"; }
+ pane { x "50%"; y "1%"; width "45%"; }
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_terminal_ids = vec![(1, None)];
+ let new_floating_terminal_ids = vec![];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+
+ let mut expected_cursor_coordinates = vec![(62, 11), (62, 6), (31, 12)];
+ for i in 0..3 {
+ let new_pane_id = i + 2;
+ let should_float = true;
+ tab.new_pane(
+ PaneId::Terminal(new_pane_id),
+ None,
+ Some(should_float),
+ Some(client_id),
+ )
+ .unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ let (expected_x, expected_y) = expected_cursor_coordinates.remove(0);
+ assert_eq!(
+ cursor_coordinates,
+ Some((expected_x, expected_y)),
+ "cursor coordinates moved to the new pane",
+ );
+ assert_snapshot!(snapshot);
+ }
+}
+
+#[test]
+fn when_swapping_floating_layouts_in_a_damaged_state_layout_and_pane_focus_are_unchanged() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane x=0 y=0
+ pane
+ pane
+ }
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane
+ pane
+ pane
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_floating_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_terminal_ids = vec![(4, None)];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.resize(
+ client_id,
+ ResizeStrategy::new(Resize::Increase, Some(Direction::Down)),
+ )
+ .unwrap();
+ tab.next_swap_layout(Some(client_id), true).unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((33, 8)),
+ "cursor coordinates moved to the new pane",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn when_swapping_floating_layouts_in_an_undamaged_state_pane_focuses_on_focused_node() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane x=0 y=0
+ pane
+ pane
+ }
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane focus=true
+ pane
+ pane
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_floating_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_terminal_ids = vec![(4, None)];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.next_swap_layout(Some(client_id), true).unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((31, 6)),
+ "cursor coordinates moved to the new pane",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn when_swapping_floating_layouts_in_an_undamaged_state_with_no_focus_node_pane_focuses_on_deepest_node(
+) {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane focus=true
+ pane
+ pane
+ }
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane
+ pane
+ pane
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_floating_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_terminal_ids = vec![(4, None)];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.next_swap_layout(Some(client_id), true).unwrap();
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((35, 10)),
+ "cursor coordinates moved to the new pane",
+ );
+
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn when_closing_a_floating_pane_in_auto_layout_the_focus_goes_to_last_focused_pane() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane
+ pane
+ pane
+ }
+ }
+ "#;
+ let swap_layouts = r#"
+ layout {
+ swap_floating_layout {
+ floating_panes {
+ pane
+ pane
+ pane
+ }
+ }
+ }
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_floating_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_terminal_ids = vec![(4, None)];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ tab.move_focus_up(client_id);
+ tab.move_focus_up(client_id);
+ tab.close_pane(PaneId::Terminal(1), false, Some(client_id));
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ size.rows,
+ size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((31, 6)),
+ "cursor coordinates moved to the new pane",
+ );
+ assert_snapshot!(snapshot);
+}
+
+#[test]
+fn when_resizing_whole_tab_with_auto_layout_and_floating_panes_the_layout_is_maintained() {
+ let size = Size {
+ cols: 121,
+ rows: 20,
+ };
+ let client_id = 1;
+ let mut output = Output::default();
+ let base_layout = r#"
+ layout {
+ floating_panes {
+ pane
+ pane
+ pane
+ }
+ }
+ "#;
+ let swap_layouts = r#"
+ layout
+ "#;
+ let (base_layout, base_floating_layout) =
+ Layout::from_kdl(base_layout, "file_name.kdl".into(), None, None)
+ .unwrap()
+ .template
+ .unwrap();
+
+ let new_floating_terminal_ids = vec![(1, None), (2, None), (3, None)];
+ let new_terminal_ids = vec![(4, None)];
+ let new_plugin_ids = HashMap::new();
+
+ let swap_layout = Layout::from_kdl(swap_layouts, "file_name.kdl".into(), None, None).unwrap();
+ let swap_tiled_layouts = swap_layout.swap_tiled_layouts.clone();
+ let swap_floating_layouts = swap_layout.swap_floating_layouts.clone();
+ let mut tab = create_new_tab_with_swap_layouts(
+ size,
+ ModeInfo::default(),
+ (swap_tiled_layouts, swap_floating_layouts),
+ Some((
+ base_layout,
+ base_floating_layout,
+ new_terminal_ids,
+ new_floating_terminal_ids,
+ new_plugin_ids,
+ )),
+ true,
+ );
+ let new_size = Size {
+ cols: 150,
+ rows: 30,
+ };
+ tab.resize_whole_tab(new_size);
+ tab.render(&mut output, None).unwrap();
+
+ let (snapshot, cursor_coordinates) = take_snapshot_and_cursor_position(
+ output.serialize().unwrap().get(&client_id).unwrap(),
+ new_size.rows,
+ new_size.cols,
+ Palette::default(),
+ );
+ assert_eq!(
+ cursor_coordinates,
+ Some((43, 13)),
+ "cursor coordinates moved to the new pane",
+ );
+ assert_snapshot!(snapshot);
+}
diff --git a/zellij-server/src/tab/unit/tab_tests.rs b/zellij-server/src/tab/unit/tab_tests.rs
index 1a87e2e1..8fbf6649 100644
--- a/zellij-server/src/tab/unit/tab_tests.rs
+++ b/zellij-server/src/tab/unit/tab_tests.rs
@@ -10,7 +10,7 @@ use crate::{
use std::path::PathBuf;
use zellij_utils::data::{Direction, Resize, ResizeStrategy};
use zellij_utils::errors::prelude::*;
-use zellij_utils::input::layout::{PaneLayout, SplitDirection, SplitSize};
+use zellij_utils::input::layout::{SplitDirection, SplitSize, TiledPaneLayout};
use zellij_utils::ipc::IpcReceiverWithContext;
use zellij_utils::pane_size::{Size, SizeInPixels};
@@ -146,6 +146,7 @@ fn create_new_tab(size: Size) -> Tab {
let mode_info = ModeInfo::default();
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -169,15 +170,17 @@ fn create_new_tab(size: Size) -> Tab {
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]), // swap layouts
);
tab.apply_layout(
- PaneLayout::default(),
+ TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
@@ -188,7 +191,7 @@ fn create_new_tab(size: Size) -> Tab {
tab
}
-fn create_new_tab_with_layout(size: Size, layout: PaneLayout) -> Tab {
+fn create_new_tab_with_layout(size: Size, layout: TiledPaneLayout) -> Tab {
let index = 0;
let position = 0;
let name = String::new();
@@ -198,6 +201,7 @@ fn create_new_tab_with_layout(size: Size, layout: PaneLayout) -> Tab {
let mode_info = ModeInfo::default();
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -221,12 +225,14 @@ fn create_new_tab_with_layout(size: Size, layout: PaneLayout) -> Tab {
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]), // swap layouts
);
let mut new_terminal_ids = vec![];
for i in 0..layout.extract_run_instructions().len() {
@@ -257,6 +263,7 @@ fn create_new_tab_with_cell_size(
let mode_info = ModeInfo::default();
let style = Style::default();
let draw_pane_frames = true;
+ let auto_layout = true;
let client_id = 1;
let session_is_mirrored = true;
let mut connected_clients = HashSet::new();
@@ -279,15 +286,17 @@ fn create_new_tab_with_cell_size(
style,
mode_info,
draw_pane_frames,
+ auto_layout,
connected_clients,
session_is_mirrored,
client_id,
copy_options,
terminal_emulator_colors,
terminal_emulator_color_codes,
+ (vec![], vec![]), // swap layouts
);
tab.apply_layout(
- PaneLayout::default(),
+ TiledPaneLayout::default(),
vec![],
vec![(1, None)],
vec![],
@@ -738,11 +747,11 @@ pub fn cannot_split_largest_pane_when_there_is_no_room() {
#[test]
pub fn cannot_split_panes_vertically_when_active_pane_has_fixed_columns() {
let size = Size { cols: 50, rows: 20 };
- let mut initial_layout = PaneLayout::default();
+ let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
- let mut fixed_child = PaneLayout::default();
+ let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(30));
- initial_layout.children = vec![fixed_child, PaneLayout::default()];
+ initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab.vertical_split(PaneId::Terminal(3), None, 1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Tab still has two panes");
@@ -751,11 +760,11 @@ pub fn cannot_split_panes_vertically_when_active_pane_has_fixed_columns() {
#[test]
pub fn cannot_split_panes_horizontally_when_active_pane_has_fixed_rows() {
let size = Size { cols: 50, rows: 20 };
- let mut initial_layout = PaneLayout::default();
+ let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
- let mut fixed_child = PaneLayout::default();
+ let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(12));
- initial_layout.children = vec![fixed_child, PaneLayout::default()];
+ initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab.horizontal_split(PaneId::Terminal(3), None, 1).unwrap();
assert_eq!(tab.tiled_panes.panes.len(), 2, "Tab still has two panes");
@@ -5948,11 +5957,11 @@ pub fn cannot_resize_down_when_pane_has_fixed_rows() {
rows: 20,
};
- let mut initial_layout = PaneLayout::default();
+ let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
- let mut fixed_child = PaneLayout::default();
+ let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(10));
- initial_layout.children = vec![fixed_child, PaneLayout::default()];
+ initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_down(&mut tab, 1);
@@ -5994,11 +6003,11 @@ pub fn cannot_resize_down_when_pane_below_has_fixed_rows() {
rows: 20,
};
- let mut initial_layout = PaneLayout::default();
+ let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
- let mut fixed_child = PaneLayout::default();
+ let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(10));
- initial_layout.children = vec![PaneLayout::default(), fixed_child];
+ initial_layout.children = vec![TiledPaneLayout::default(), fixed_child];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_down(&mut tab, 1);
@@ -6040,11 +6049,11 @@ pub fn cannot_resize_up_when_pane_below_has_fixed_rows() {
rows: 20,
};
- let mut initial_layout = PaneLayout::default();
+ let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Horizontal;
- let mut fixed_child = PaneLayout::default();
+ let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(10));
- initial_layout.children = vec![PaneLayout::default(), fixed_child];
+ initial_layout.children = vec![TiledPaneLayout::default(), fixed_child];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_up(&mut tab, 1);
@@ -11371,11 +11380,11 @@ pub fn cannot_resize_right_when_pane_has_fixed_columns() {
rows: 20,
};
- let mut initial_layout = PaneLayout::default();
+ let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
- let mut fixed_child = PaneLayout::default();
+ let mut fixed_child = TiledPaneLayout::default();
fixed_child.split_size = Some(SplitSize::Fixed(60));
- initial_layout.children = vec![fixed_child, PaneLayout::default()];
+ initial_layout.children = vec![fixed_child, TiledPaneLayout::default()];
let mut tab = create_new_tab_with_layout(size, initial_layout);
tab_resize_down(&mut tab, 1);
@@ -14377,7 +14386,7 @@ fn correctly_resize_frameless_panes_on_pane_close() {
tab.new_pane(PaneId::Terminal(2), None, None, Some(1))
.unwrap();
- tab.close_pane(PaneId::Terminal(2), true);
+ tab.close_pane(PaneId::Terminal(2), true, None);
// the size should be the same after adding and then removing a pane
let pane = tab.tiled_panes.panes.get(&PaneId::Terminal(1)).unwrap();