feat(ui): break pane to new tab and move panes between tabs (#2664)

* prototype

* some tests

* break out floating pane

* break out plugin panes

* add keybind and fix some minor issues

* remove cli

* move pane to left/right tab

* update ui

* adjust ui

* style(fmt): rustfmt

* style(comment): remove commented code

* update snapshots
This commit is contained in:
Aram Drevekenin 2023-08-02 11:41:51 +02:00 committed by GitHub
parent 8fb90391c8
commit 192e6fd31e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
108 changed files with 2200 additions and 157 deletions

View File

@ -166,7 +166,12 @@ fn get_keys_and_hints(mi: &ModeInfo) -> Vec<(String, String, Vec<Key>)> {
(s("Rename"), s("Rename"),
action_key(&km, &[A::SwitchToMode(IM::RenameTab), A::TabNameInput(vec![0])])),
(s("Sync"), s("Sync"), action_key(&km, &[A::ToggleActiveSyncTab, TO_NORMAL])),
(s("Toggle"), s("Toggle"), action_key(&km, &[A::ToggleTab])),
(s("Break pane to new tab"), s("Break"), action_key(&km, &[A::BreakPane, TO_NORMAL])),
(s("Break pane to next/prev tab"), s("Break next/prev"),
action_key_group(&km, &[
&[A::BreakPaneLeft, TO_NORMAL],
&[A::BreakPaneRight, TO_NORMAL]
])),
(s("Select pane"), s("Select"), to_normal_key),
]} else if mi.mode == IM::Resize { vec![
(s("Increase/Decrease size"), s("Increase/Decrease"),

View File

@ -26,4 +26,4 @@ expression: second_runner_snapshot
│ ││ │
└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘
Ctrl + <g> LOCK  <p> PANE  <t> TAB  <n> RESIZE  <h> MOVE  <s> SEARCH  <o> SESSION  <q> QUIT 
<n> New / <←→> Change focus / <x> Close / <r> Rename / <s> Sync / <TAB> Toggle / <ENTER> Select pane
<n> New / <←→> Move / <x> Close / <r> Rename / <s> Sync / <b> Break / <[]> Break next/prev / <ENTER> Select

View File

@ -898,4 +898,18 @@ impl FloatingPanes {
}
pane_infos
}
pub fn set_geom_for_pane_with_run(&mut self, run: Option<Run>, geom: PaneGeom) {
match self
.panes
.iter_mut()
.find(|(_, p)| p.invoked_with() == &run)
{
Some((_, pane)) => {
pane.set_geom(geom);
},
None => {
log::error!("Failed to find pane with run: {:?}", run);
},
}
}
}

View File

@ -182,9 +182,13 @@ impl TiledPanes {
let has_room_for_new_pane = pane_grid
.find_room_for_new_pane(cursor_height_width_ratio)
.is_some();
has_room_for_new_pane || pane_grid.has_room_for_new_stacked_pane()
has_room_for_new_pane || pane_grid.has_room_for_new_stacked_pane() || self.panes.is_empty()
}
fn add_pane(&mut self, pane_id: PaneId, mut pane: Box<dyn Pane>, should_relayout: bool) {
if self.panes.is_empty() {
self.panes.insert(pane_id, pane);
return;
}
let cursor_height_width_ratio = self.cursor_height_width_ratio();
let mut pane_grid = TiledPaneGrid::new(
&mut self.panes,
@ -250,6 +254,19 @@ impl TiledPanes {
})
.collect()
}
pub fn non_selectable_pane_geoms_inside_viewport(&self) -> Vec<Viewport> {
self.panes
.values()
.filter_map(|p| {
let geom = p.position_and_size();
if !p.selectable() && is_inside_viewport(&self.viewport.borrow(), p) {
Some(geom.into())
} else {
None
}
})
.collect()
}
pub fn first_selectable_pane_id(&self) -> Option<PaneId> {
self.panes
.iter()
@ -587,8 +604,6 @@ impl TiledPanes {
pub fn focused_pane_id(&self, client_id: ClientId) -> Option<PaneId> {
self.active_panes.get(&client_id).copied()
}
// FIXME: Really not a fan of allowing this... Someone with more energy
// than me should clean this up someday...
#[allow(clippy::borrowed_box)]
pub fn get_pane(&self, pane_id: PaneId) -> Option<&Box<dyn Pane>> {
self.panes.get(&pane_id)
@ -735,6 +750,29 @@ impl TiledPanes {
pub fn get_panes(&self) -> impl Iterator<Item = (&PaneId, &Box<dyn Pane>)> {
self.panes.iter()
}
pub fn set_geom_for_pane_with_run(
&mut self,
run: Option<Run>,
geom: PaneGeom,
borderless: bool,
) {
match self
.panes
.iter_mut()
.find(|(_, p)| p.invoked_with() == &run)
{
Some((_, pane)) => {
pane.set_geom(geom);
pane.set_borderless(borderless);
if self.draw_pane_frames {
pane.set_content_offset(Offset::frame(1));
}
},
None => {
log::error!("Failed to find pane with run: {:?}", run);
},
}
}
pub fn resize(&mut self, new_screen_size: Size) {
// this is blocked out to appease the borrow checker
{
@ -1501,11 +1539,11 @@ impl TiledPanes {
self.set_pane_frames(self.draw_pane_frames); // recalculate pane frames and update size
closed_pane
} else {
self.panes.remove(&pane_id);
let closed_pane = self.panes.remove(&pane_id);
// this is a bit of a roundabout way to say: this is the last pane and so the tab
// should be destroyed
self.active_panes.clear(&mut self.panes);
None
closed_pane
}
}
pub fn hold_pane(

View File

@ -228,6 +228,7 @@ pub(crate) fn plugin_thread_main(
};
let mut extracted_floating_plugins: Vec<Option<Run>> = floating_panes_layout
.iter()
.filter(|f| !f.already_running)
.map(|f| f.run.clone())
.collect();
extracted_run_instructions.append(&mut extracted_floating_plugins);

View File

@ -1,6 +1,6 @@
---
source: zellij-server/src/plugins/./unit/plugin_tests.rs
assertion_line: 521
assertion_line: 735
expression: "format!(\"{:#?}\", second_new_tab_event)"
---
Some(
@ -24,6 +24,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -37,6 +38,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -47,6 +49,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
),
[],

View File

@ -1,6 +1,6 @@
---
source: zellij-server/src/plugins/./unit/plugin_tests.rs
assertion_line: 520
assertion_line: 734
expression: "format!(\"{:#?}\", first_new_tab_event)"
---
Some(
@ -24,6 +24,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -37,6 +38,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -47,6 +49,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
),
[],

View File

@ -605,8 +605,10 @@ impl Pty {
default_shell.unwrap_or_else(|| self.get_default_terminal(cwd, None));
self.fill_cwd(&mut default_shell, client_id);
let extracted_run_instructions = layout.extract_run_instructions();
let extracted_floating_run_instructions =
floating_panes_layout.iter().map(|f| f.run.clone());
let extracted_floating_run_instructions = floating_panes_layout
.iter()
.filter(|f| !f.already_running)
.map(|f| f.run.clone());
let mut new_pane_pids: Vec<(u32, bool, Option<RunCommand>, Result<RawFd>)> = vec![]; // (terminal_id,
// starts_held,
// run_command,

View File

@ -690,6 +690,25 @@ pub(crate) fn route_action(
))
.with_context(err_context)?;
},
Action::BreakPane => {
senders
.send_to_screen(ScreenInstruction::BreakPane(
default_layout.clone(),
default_shell.clone(),
client_id,
))
.with_context(err_context)?;
},
Action::BreakPaneRight => {
senders
.send_to_screen(ScreenInstruction::BreakPaneRight(client_id))
.with_context(err_context)?;
},
Action::BreakPaneLeft => {
senders
.send_to_screen(ScreenInstruction::BreakPaneLeft(client_id))
.with_context(err_context)?;
},
}
Ok(should_break)
}

View File

@ -14,12 +14,13 @@ use zellij_utils::pane_size::{Size, SizeInPixels};
use zellij_utils::{
input::command::TerminalAction,
input::layout::{
FloatingPaneLayout, PluginUserConfiguration, Run, RunPlugin, RunPluginLocation,
SwapFloatingLayout, SwapTiledLayout, TiledPaneLayout,
FloatingPaneLayout, Layout, Run, RunPlugin, RunPluginLocation, SwapFloatingLayout,
SwapTiledLayout, TiledPaneLayout,
},
position::Position,
};
use crate::background_jobs::BackgroundJob;
use crate::os_input_output::ResizeCache;
use crate::panes::alacritty_functions::xparse_color;
use crate::panes::terminal_character::AnsiCode;
@ -279,6 +280,9 @@ pub enum ScreenInstruction {
FocusPaneWithId(PaneId, bool, ClientId), // bool is should_float
RenamePane(PaneId, Vec<u8>),
RenameTab(usize, Vec<u8>),
BreakPane(Box<Layout>, Option<TerminalAction>, ClientId),
BreakPaneRight(ClientId),
BreakPaneLeft(ClientId),
}
impl From<&ScreenInstruction> for ScreenContext {
@ -446,6 +450,9 @@ impl From<&ScreenInstruction> for ScreenContext {
ScreenInstruction::FocusPaneWithId(..) => ScreenContext::FocusPaneWithId,
ScreenInstruction::RenamePane(..) => ScreenContext::RenamePane,
ScreenInstruction::RenameTab(..) => ScreenContext::RenameTab,
ScreenInstruction::BreakPane(..) => ScreenContext::BreakPane,
ScreenInstruction::BreakPaneRight(..) => ScreenContext::BreakPaneRight,
ScreenInstruction::BreakPaneLeft(..) => ScreenContext::BreakPaneLeft,
}
}
}
@ -609,6 +616,7 @@ impl Screen {
&mut self,
source_tab_index: usize,
destination_tab_index: usize,
update_mode_infos: bool,
clients_to_move: Option<Vec<ClientId>>,
) -> Result<()> {
let err_context = || {
@ -629,9 +637,11 @@ impl Screen {
destination_tab
.add_multiple_clients(client_mode_info_in_source_tab)
.with_context(err_context)?;
destination_tab
.update_input_modes()
.with_context(err_context)?;
if update_mode_infos {
destination_tab
.update_input_modes()
.with_context(err_context)?;
}
destination_tab.set_force_render();
destination_tab.visible(true).with_context(err_context)?;
}
@ -657,6 +667,7 @@ impl Screen {
&mut self,
new_tab_pos: usize,
should_change_pane_focus: Option<Direction>,
update_mode_infos: bool,
client_id: ClientId,
) -> Result<()> {
let err_context = || {
@ -676,8 +687,13 @@ impl Screen {
let current_tab_index = current_tab.index;
let new_tab_index = new_tab.index;
if self.session_is_mirrored {
self.move_clients_between_tabs(current_tab_index, new_tab_index, None)
.with_context(err_context)?;
self.move_clients_between_tabs(
current_tab_index,
new_tab_index,
update_mode_infos,
None,
)
.with_context(err_context)?;
let all_connected_clients: Vec<ClientId> =
self.connected_clients.borrow().iter().copied().collect();
for client_id in all_connected_clients {
@ -696,6 +712,7 @@ impl Screen {
self.move_clients_between_tabs(
current_tab_index,
new_tab_index,
update_mode_infos,
Some(vec![client_id]),
)
.with_context(err_context)?;
@ -736,7 +753,7 @@ impl Screen {
fn switch_active_tab_name(&mut self, name: String, client_id: ClientId) -> Result<bool> {
match self.tabs.values().find(|t| t.name == name) {
Some(new_tab) => {
self.switch_active_tab(new_tab.position, None, client_id)?;
self.switch_active_tab(new_tab.position, None, true, client_id)?;
Ok(true)
},
None => Ok(false),
@ -747,6 +764,7 @@ impl Screen {
pub fn switch_tab_next(
&mut self,
should_change_pane_focus: Option<Direction>,
update_mode_infos: bool,
client_id: ClientId,
) -> Result<()> {
let err_context = || format!("failed to switch to next tab for client {client_id}");
@ -765,6 +783,7 @@ impl Screen {
return self.switch_active_tab(
new_tab_pos,
should_change_pane_focus,
update_mode_infos,
client_id,
);
},
@ -778,6 +797,7 @@ impl Screen {
pub fn switch_tab_prev(
&mut self,
should_change_pane_focus: Option<Direction>,
update_mode_infos: bool,
client_id: ClientId,
) -> Result<()> {
let err_context = || format!("failed to switch to previous tab for client {client_id}");
@ -801,6 +821,7 @@ impl Screen {
return self.switch_active_tab(
new_tab_pos,
should_change_pane_focus,
update_mode_infos,
client_id,
);
},
@ -811,7 +832,7 @@ impl Screen {
}
pub fn go_to_tab(&mut self, tab_index: usize, client_id: ClientId) -> Result<()> {
self.switch_active_tab(tab_index.saturating_sub(1), None, client_id)
self.switch_active_tab(tab_index.saturating_sub(1), None, true, client_id)
}
pub fn go_to_tab_name(&mut self, name: String, client_id: ClientId) -> Result<bool> {
@ -1389,6 +1410,7 @@ impl Screen {
for tab in self.tabs.values_mut() {
tab.change_mode_info(mode_info.clone(), client_id);
tab.mark_active_pane_for_rerender(client_id);
tab.update_input_modes()?;
}
if let Some(os_input) = &mut self.bus.os_input {
@ -1433,7 +1455,7 @@ impl Screen {
.move_focus_left(client_id)
.and_then(|success| {
if !success {
self.switch_tab_prev(Some(Direction::Left), client_id)
self.switch_tab_prev(Some(Direction::Left), true, client_id)
.context("failed to move focus to previous tab")
} else {
Ok(())
@ -1468,7 +1490,7 @@ impl Screen {
.move_focus_right(client_id)
.and_then(|success| {
if !success {
self.switch_tab_next(Some(Direction::Right), client_id)
self.switch_tab_next(Some(Direction::Right), true, client_id)
.context("failed to move focus to next tab")
} else {
Ok(())
@ -1555,6 +1577,127 @@ impl Screen {
};
Ok(())
}
pub fn break_pane(
&mut self,
default_shell: Option<TerminalAction>,
default_layout: Box<Layout>,
client_id: ClientId,
) -> Result<()> {
let err_context = || "failed break pane out of tab".to_string();
let active_tab = self.get_active_tab_mut(client_id)?;
if active_tab.get_selectable_tiled_panes_count() > 1
|| active_tab.get_visible_selectable_floating_panes_count() > 0
{
let active_pane_id = active_tab
.get_active_pane_id(client_id)
.with_context(err_context)?;
let pane_to_break_is_floating = active_tab.are_floating_panes_visible();
let active_pane = active_tab
.close_pane(active_pane_id, false, Some(client_id))
.with_context(err_context)?;
let active_pane_run_instruction = active_pane.invoked_with().clone();
let tab_index = self.get_new_tab_index();
let swap_layouts = (
default_layout.swap_tiled_layouts.clone(),
default_layout.swap_floating_layouts.clone(),
);
self.new_tab(tab_index, swap_layouts, None, client_id)?;
let tab = self.tabs.get_mut(&tab_index).with_context(err_context)?;
let (mut tiled_panes_layout, mut floating_panes_layout) = default_layout.new_tab();
if pane_to_break_is_floating {
tab.show_floating_panes();
tab.add_floating_pane(active_pane, active_pane_id, Some(client_id))?;
if let Some(mut already_running_layout) = floating_panes_layout
.iter_mut()
.find(|i| i.run == active_pane_run_instruction)
{
already_running_layout.already_running = true;
}
} else {
tab.add_tiled_pane(active_pane, active_pane_id, Some(client_id))?;
tiled_panes_layout.ignore_run_instruction(active_pane_run_instruction.clone());
}
self.bus.senders.send_to_plugin(PluginInstruction::NewTab(
None,
default_shell,
Some(tiled_panes_layout),
floating_panes_layout,
tab_index,
client_id,
))?;
} else {
let active_pane_id = active_tab
.get_active_pane_id(client_id)
.with_context(err_context)?;
self.bus
.senders
.send_to_background_jobs(BackgroundJob::DisplayPaneError(
vec![active_pane_id],
"Cannot break single pane out!".into(),
))
.with_context(err_context)?;
self.unblock_input()?;
}
Ok(())
}
pub fn break_pane_to_new_tab(
&mut self,
direction: Direction,
client_id: ClientId,
) -> Result<()> {
let err_context = || "failed break pane out of tab".to_string();
if self.tabs.len() > 1 {
let (active_pane_id, active_pane, pane_to_break_is_floating) = {
let active_tab = self.get_active_tab_mut(client_id)?;
let active_pane_id = active_tab
.get_active_pane_id(client_id)
.with_context(err_context)?;
let pane_to_break_is_floating = active_tab.are_floating_panes_visible();
let active_pane = active_tab
.close_pane(active_pane_id, false, Some(client_id))
.with_context(err_context)?;
(active_pane_id, active_pane, pane_to_break_is_floating)
};
let update_mode_infos = false;
match direction {
Direction::Right | Direction::Down => {
self.switch_tab_next(None, update_mode_infos, client_id)?;
},
Direction::Left | Direction::Up => {
self.switch_tab_prev(None, update_mode_infos, client_id)?;
},
};
let new_active_tab = self.get_active_tab_mut(client_id)?;
if pane_to_break_is_floating {
new_active_tab.show_floating_panes();
new_active_tab.add_floating_pane(active_pane, active_pane_id, Some(client_id))?;
} else {
new_active_tab.hide_floating_panes();
new_active_tab.add_tiled_pane(active_pane, active_pane_id, Some(client_id))?;
}
self.report_tab_state()?;
self.report_pane_state()?;
} else {
let active_pane_id = {
let active_tab = self.get_active_tab_mut(client_id)?;
active_tab
.get_active_pane_id(client_id)
.with_context(err_context)?
};
self.bus
.senders
.send_to_background_jobs(BackgroundJob::DisplayPaneError(
vec![active_pane_id],
"No other tabs to add pane to!".into(),
))
.with_context(err_context)?;
}
self.unblock_input()?;
self.render()?;
Ok(())
}
fn unblock_input(&self) -> Result<()> {
self.bus
@ -2234,12 +2377,12 @@ pub(crate) fn screen_thread_main(
screen.report_pane_state()?;
},
ScreenInstruction::SwitchTabNext(client_id) => {
screen.switch_tab_next(None, client_id)?;
screen.switch_tab_next(None, true, client_id)?;
screen.unblock_input()?;
screen.render()?;
},
ScreenInstruction::SwitchTabPrev(client_id) => {
screen.switch_tab_prev(None, client_id)?;
screen.switch_tab_prev(None, true, client_id)?;
screen.unblock_input()?;
screen.render()?;
},
@ -2815,6 +2958,15 @@ pub(crate) fn screen_thread_main(
}
screen.report_tab_state()?;
},
ScreenInstruction::BreakPane(default_layout, default_shell, client_id) => {
screen.break_pane(default_shell, default_layout, client_id)?;
},
ScreenInstruction::BreakPaneRight(client_id) => {
screen.break_pane_to_new_tab(Direction::Right, client_id)?;
},
ScreenInstruction::BreakPaneLeft(client_id) => {
screen.break_pane_to_new_tab(Direction::Left, client_id)?;
},
}
}
Ok(())

View File

@ -180,6 +180,11 @@ impl<'a> LayoutApplier<'a> {
}
}
pane_focuser.focus_tiled_pane(&mut self.tiled_panes);
LayoutApplier::offset_viewport(
self.viewport.clone(),
self.tiled_panes,
self.draw_pane_frames,
);
},
Err(e) => {
Err::<(), _>(anyError::msg(e))
@ -200,6 +205,7 @@ impl<'a> LayoutApplier<'a> {
let free_space = self.total_space_for_tiled_panes();
match layout.position_panes_in_space(&free_space, None) {
Ok(positions_in_layout) => {
let mut run_instructions_to_ignore = layout.run_instructions_to_ignore.clone();
let positions_and_size = positions_in_layout.iter();
let mut new_terminal_ids = new_terminal_ids.iter();
@ -211,8 +217,17 @@ impl<'a> LayoutApplier<'a> {
};
for (layout, position_and_size) in positions_and_size {
// A plugin pane
if let Some(Run::Plugin(run)) = layout.run.clone() {
if let Some(position) = run_instructions_to_ignore
.iter()
.position(|r| r == &layout.run)
{
let run = run_instructions_to_ignore.remove(position);
self.tiled_panes.set_geom_for_pane_with_run(
run,
*position_and_size,
layout.borderless,
);
} else if let Some(Run::Plugin(run)) = layout.run.clone() {
let pane_title = run.location.to_string();
let pid = new_plugin_ids
.get_mut(&run.location)
@ -320,10 +335,15 @@ impl<'a> LayoutApplier<'a> {
let mut new_floating_terminal_ids = new_floating_terminal_ids.iter();
for floating_pane_layout in floating_panes_layout {
layout_has_floating_panes = true;
if let Some(Run::Plugin(run)) = floating_pane_layout.run.clone() {
let position_and_size = self
.floating_panes
.position_floating_pane_layout(&floating_pane_layout);
let position_and_size = self
.floating_panes
.position_floating_pane_layout(&floating_pane_layout);
if floating_pane_layout.already_running {
self.floating_panes.set_geom_for_pane_with_run(
floating_pane_layout.run.clone(),
position_and_size,
);
} else if let Some(Run::Plugin(run)) = floating_pane_layout.run.clone() {
let pane_title = run.location.to_string();
let pid = new_plugin_ids
.get_mut(&run.location)
@ -363,9 +383,6 @@ impl<'a> LayoutApplier<'a> {
focused_floating_pane = Some(PaneId::Plugin(pid));
}
} else if let Some((pid, hold_for_command)) = new_floating_terminal_ids.next() {
let position_and_size = self
.floating_panes
.position_floating_pane_layout(&floating_pane_layout);
let next_terminal_position =
get_next_terminal_position(&self.tiled_panes, &self.floating_panes);
let initial_title = match &floating_pane_layout.run {
@ -504,28 +521,43 @@ impl<'a> LayoutApplier<'a> {
self.tiled_panes.resize(new_screen_size);
Ok(())
}
fn offset_viewport(&mut self, position_and_size: &Viewport) {
let mut viewport = self.viewport.borrow_mut();
if position_and_size.x == viewport.x
&& position_and_size.x + position_and_size.cols == viewport.x + viewport.cols
pub fn offset_viewport(
viewport: Rc<RefCell<Viewport>>,
tiled_panes: &mut TiledPanes,
draw_pane_frames: bool,
) {
let boundary_geoms = tiled_panes.non_selectable_pane_geoms_inside_viewport();
{
if position_and_size.y == viewport.y {
viewport.y += position_and_size.rows;
viewport.rows -= position_and_size.rows;
} else if position_and_size.y + position_and_size.rows == viewport.y + viewport.rows {
viewport.rows -= position_and_size.rows;
}
}
if position_and_size.y == viewport.y
&& position_and_size.y + position_and_size.rows == viewport.y + viewport.rows
{
if position_and_size.x == viewport.x {
viewport.x += position_and_size.cols;
viewport.cols -= position_and_size.cols;
} else if position_and_size.x + position_and_size.cols == viewport.x + viewport.cols {
viewport.cols -= position_and_size.cols;
// curly braces here is so that we free viewport immediately when we're done
let mut viewport = viewport.borrow_mut();
for position_and_size in boundary_geoms {
if position_and_size.x == viewport.x
&& position_and_size.x + position_and_size.cols == viewport.x + viewport.cols
{
if position_and_size.y == viewport.y {
viewport.y += position_and_size.rows;
viewport.rows -= position_and_size.rows;
} else if position_and_size.y + position_and_size.rows
== viewport.y + viewport.rows
{
viewport.rows -= position_and_size.rows;
}
}
if position_and_size.y == viewport.y
&& position_and_size.y + position_and_size.rows == viewport.y + viewport.rows
{
if position_and_size.x == viewport.x {
viewport.x += position_and_size.cols;
viewport.cols -= position_and_size.cols;
} else if position_and_size.x + position_and_size.cols
== viewport.x + viewport.cols
{
viewport.cols -= position_and_size.cols;
}
}
}
}
tiled_panes.set_pane_frames(draw_pane_frames);
}
fn adjust_viewport(&mut self) -> Result<()> {
// here we offset the viewport after applying a tiled panes layout
@ -541,11 +573,11 @@ impl<'a> LayoutApplier<'a> {
*display_area
};
self.resize_whole_tab(display_area).context(err_context)?;
let boundary_geoms = self.tiled_panes.borderless_pane_geoms();
for geom in boundary_geoms {
self.offset_viewport(&geom)
}
self.tiled_panes.set_pane_frames(self.draw_pane_frames);
LayoutApplier::offset_viewport(
self.viewport.clone(),
self.tiled_panes,
self.draw_pane_frames,
);
Ok(())
}
fn set_focused_tiled_pane(&mut self, focus_pane_id: Option<PaneId>, client_id: ClientId) {

View File

@ -1780,9 +1780,25 @@ impl Tab {
fn get_tiled_panes(&self) -> impl Iterator<Item = (&PaneId, &Box<dyn Pane>)> {
self.tiled_panes.get_panes()
}
fn get_floating_panes(&self) -> impl Iterator<Item = (&PaneId, &Box<dyn Pane>)> {
self.floating_panes.get_panes()
}
fn get_selectable_tiled_panes(&self) -> impl Iterator<Item = (&PaneId, &Box<dyn Pane>)> {
self.get_tiled_panes().filter(|(_, p)| p.selectable())
}
fn get_selectable_floating_panes(&self) -> impl Iterator<Item = (&PaneId, &Box<dyn Pane>)> {
self.get_floating_panes().filter(|(_, p)| p.selectable())
}
pub fn get_selectable_tiled_panes_count(&self) -> usize {
self.get_selectable_tiled_panes().count()
}
pub fn get_visible_selectable_floating_panes_count(&self) -> usize {
if self.are_floating_panes_visible() {
self.get_selectable_floating_panes().count()
} else {
0
}
}
fn get_next_terminal_position(&self) -> usize {
let tiled_panes_count = self
.tiled_panes
@ -2142,6 +2158,13 @@ impl Tab {
self.tiled_panes.move_clients_out_of_pane(id);
}
}
// we do this here because if there is a non-selectable pane on the edge, we consider it
// outside the viewport (a ui-pane, eg. the status-bar and tab-bar) and need to adjust for it
LayoutApplier::offset_viewport(
self.viewport.clone(),
&mut self.tiled_panes,
self.draw_pane_frames,
);
}
pub fn close_pane(
&mut self,
@ -3137,6 +3160,7 @@ impl Tab {
pub fn set_pane_frames(&mut self, should_set_pane_frames: bool) {
self.tiled_panes.set_pane_frames(should_set_pane_frames);
self.draw_pane_frames = should_set_pane_frames;
self.should_clear_display_before_rendering = true;
self.set_force_render();
}
@ -3278,13 +3302,13 @@ impl Tab {
plugin_pane.progress_animation_offset();
}
}
fn show_floating_panes(&mut self) {
pub fn show_floating_panes(&mut self) {
// this function is to be preferred to directly invoking floating_panes.toggle_show_panes(true)
self.floating_panes.toggle_show_panes(true);
self.tiled_panes.unfocus_all_panes();
}
fn hide_floating_panes(&mut self) {
pub fn hide_floating_panes(&mut self) {
// this function is to be preferred to directly invoking
// floating_panes.toggle_show_panes(false)
self.floating_panes.toggle_show_panes(false);
@ -3355,7 +3379,7 @@ impl Tab {
}
pane_info
}
fn add_floating_pane(
pub fn add_floating_pane(
&mut self,
mut pane: Box<dyn Pane>,
pane_id: PaneId,
@ -3380,7 +3404,7 @@ impl Tab {
}
Ok(())
}
fn add_tiled_pane(
pub fn add_tiled_pane(
&mut self,
mut pane: Box<dyn Pane>,
pane_id: PaneId,

View File

@ -15,7 +15,7 @@ use zellij_utils::errors::{prelude::*, ErrorContext};
use zellij_utils::input::actions::Action;
use zellij_utils::input::command::{RunCommand, TerminalAction};
use zellij_utils::input::layout::{
Layout, Run, RunPlugin, RunPluginLocation, SplitDirection, TiledPaneLayout,
FloatingPaneLayout, Layout, Run, RunPlugin, RunPluginLocation, SplitDirection, TiledPaneLayout,
};
use zellij_utils::input::options::Options;
use zellij_utils::ipc::IpcReceiverWithContext;
@ -271,7 +271,11 @@ struct MockScreen {
}
impl MockScreen {
pub fn run(&mut self, initial_layout: Option<TiledPaneLayout>) -> std::thread::JoinHandle<()> {
pub fn run(
&mut self,
initial_layout: Option<TiledPaneLayout>,
initial_floating_panes_layout: Vec<FloatingPaneLayout>,
) -> std::thread::JoinHandle<()> {
let config_options = self.config_options.clone();
let client_attributes = self.client_attributes.clone();
let screen_bus = Bus::new(
@ -302,7 +306,9 @@ impl MockScreen {
.unwrap();
let pane_layout = initial_layout.unwrap_or_default();
let pane_count = pane_layout.extract_run_instructions().len();
let floating_pane_count = initial_floating_panes_layout.len();
let mut pane_ids = vec![];
let mut floating_pane_ids = vec![];
let mut plugin_ids = HashMap::new();
plugin_ids.insert(
RunPluginLocation::File(PathBuf::from("/path/to/fake/plugin")),
@ -311,6 +317,9 @@ impl MockScreen {
for i in 0..pane_count {
pane_ids.push((i as u32, None));
}
for i in 0..floating_pane_count {
floating_pane_ids.push((i as u32, None));
}
let default_shell = None;
let tab_name = None;
let tab_index = self.last_opened_tab_index.map(|l| l + 1).unwrap_or(0);
@ -318,16 +327,19 @@ impl MockScreen {
None,
default_shell,
Some(pane_layout.clone()),
vec![], // floating_panes_layout
initial_floating_panes_layout.clone(),
// vec![], // floating_panes_layout
tab_name,
(vec![], vec![]), // swap layouts
self.main_client_id,
));
let _ = self.to_screen.send(ScreenInstruction::ApplyLayout(
pane_layout,
vec![], // floating panes layout
initial_floating_panes_layout,
// vec![], // floating panes layout
pane_ids,
vec![], // floating pane ids
floating_pane_ids,
// vec![], // floating pane ids
plugin_ids,
tab_index,
self.main_client_id,
@ -547,7 +559,7 @@ pub fn switch_to_prev_tab() {
new_tab(&mut screen, 1, 1);
new_tab(&mut screen, 2, 2);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
assert_eq!(
screen.get_active_tab(1).unwrap().position,
@ -566,8 +578,8 @@ pub fn switch_to_next_tab() {
new_tab(&mut screen, 1, 1);
new_tab(&mut screen, 2, 2);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_next(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
screen.switch_tab_next(None, true, 1).expect("TEST");
assert_eq!(
screen.get_active_tab(1).unwrap().position,
@ -641,7 +653,7 @@ pub fn close_the_middle_tab() {
new_tab(&mut screen, 1, 1);
new_tab(&mut screen, 2, 2);
new_tab(&mut screen, 3, 3);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
screen.close_tab(1).expect("TEST");
assert_eq!(screen.tabs.len(), 2, "Two tabs left");
@ -663,7 +675,7 @@ fn move_focus_left_at_left_screen_edge_changes_tab() {
new_tab(&mut screen, 1, 1);
new_tab(&mut screen, 2, 2);
new_tab(&mut screen, 3, 3);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
screen.move_focus_left_or_previous_tab(1).expect("TEST");
assert_eq!(
@ -684,7 +696,7 @@ fn move_focus_right_at_right_screen_edge_changes_tab() {
new_tab(&mut screen, 1, 1);
new_tab(&mut screen, 2, 2);
new_tab(&mut screen, 3, 3);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
screen.move_focus_right_or_next_tab(1).expect("TEST");
assert_eq!(
@ -820,7 +832,7 @@ pub fn toggle_to_previous_tab_delete() {
"Active tab toggler to previous tab"
);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
assert_eq!(
screen.tab_history.get(&1).unwrap(),
&[0, 1, 3],
@ -831,7 +843,7 @@ pub fn toggle_to_previous_tab_delete() {
2,
"Active tab toggler to previous tab"
);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
assert_eq!(
screen.tab_history.get(&1).unwrap(),
&[0, 3, 2],
@ -886,7 +898,7 @@ fn switch_to_tab_with_fullscreen() {
}
new_tab(&mut screen, 2, 2);
screen.switch_tab_prev(None, 1).expect("TEST");
screen.switch_tab_prev(None, true, 1).expect("TEST");
assert_eq!(
screen.get_active_tab(1).unwrap().position,
@ -1023,7 +1035,7 @@ pub fn send_cli_write_chars_action_to_screen() {
let mut mock_screen = MockScreen::new(size);
let pty_writer_receiver = mock_screen.pty_writer_receiver.take().unwrap();
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(None);
let screen_thread = mock_screen.run(None, vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_writer_thread = log_actions_in_thread!(
received_pty_instructions,
@ -1049,7 +1061,7 @@ pub fn send_cli_write_action_to_screen() {
let mut mock_screen = MockScreen::new(size);
let pty_writer_receiver = mock_screen.pty_writer_receiver.take().unwrap();
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(None);
let screen_thread = mock_screen.run(None, vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_writer_thread = log_actions_in_thread!(
received_pty_instructions,
@ -1074,7 +1086,7 @@ pub fn send_cli_resize_action_to_screen() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let pty_writer_thread = log_actions_in_thread!(
@ -1108,7 +1120,7 @@ pub fn send_cli_focus_next_pane_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1141,7 +1153,7 @@ pub fn send_cli_focus_previous_pane_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1174,7 +1186,7 @@ pub fn send_cli_move_focus_pane_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1209,7 +1221,7 @@ pub fn send_cli_move_focus_or_tab_pane_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1244,7 +1256,7 @@ pub fn send_cli_move_pane_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1278,7 +1290,7 @@ pub fn send_cli_dump_screen_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
@ -1312,7 +1324,7 @@ pub fn send_cli_edit_scrollback_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_receiver = mock_screen.pty_receiver.take().unwrap();
let pty_thread = log_actions_in_thread!(
@ -1360,7 +1372,7 @@ pub fn send_cli_scroll_up_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1404,7 +1416,7 @@ pub fn send_cli_scroll_down_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1454,7 +1466,7 @@ pub fn send_cli_scroll_to_bottom_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1507,7 +1519,7 @@ pub fn send_cli_scroll_to_top_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1549,7 +1561,7 @@ pub fn send_cli_page_scroll_up_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1590,7 +1602,7 @@ pub fn send_cli_page_scroll_down_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1638,7 +1650,7 @@ pub fn send_cli_half_page_scroll_up_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1679,7 +1691,7 @@ pub fn send_cli_half_page_scroll_down_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1735,7 +1747,7 @@ pub fn send_cli_toggle_full_screen_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1767,7 +1779,7 @@ pub fn send_cli_toggle_pane_frames_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -1803,7 +1815,7 @@ pub fn send_cli_toggle_active_tab_sync_action() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_writer_thread = log_actions_in_thread!(
received_pty_instructions,
@ -1838,7 +1850,7 @@ pub fn send_cli_new_pane_action_with_default_parameters() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_thread = log_actions_in_thread!(
received_pty_instructions,
@ -1875,7 +1887,7 @@ pub fn send_cli_new_pane_action_with_split_direction() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_thread = log_actions_in_thread!(
received_pty_instructions,
@ -1912,7 +1924,7 @@ pub fn send_cli_new_pane_action_with_command_and_cwd() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_thread = log_actions_in_thread!(
received_pty_instructions,
@ -1949,7 +1961,7 @@ pub fn send_cli_edit_action_with_default_parameters() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_thread = log_actions_in_thread!(
received_pty_instructions,
@ -1982,7 +1994,7 @@ pub fn send_cli_edit_action_with_line_number() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_thread = log_actions_in_thread!(
received_pty_instructions,
@ -2015,7 +2027,7 @@ pub fn send_cli_edit_action_with_split_direction() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_pty_instructions = Arc::new(Mutex::new(vec![]));
let pty_thread = log_actions_in_thread!(
received_pty_instructions,
@ -2047,7 +2059,7 @@ pub fn send_cli_switch_mode_action() {
let mut initial_layout = TiledPaneLayout::default();
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let cli_switch_mode = CliAction::SwitchMode {
input_mode: InputMode::Locked,
};
@ -2073,7 +2085,7 @@ pub fn send_cli_toggle_pane_embed_or_float() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -2117,7 +2129,7 @@ pub fn send_cli_toggle_floating_panes() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -2157,7 +2169,7 @@ pub fn send_cli_close_pane_action() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_instruction = log_actions_in_thread!(
@ -2189,7 +2201,7 @@ pub fn send_cli_new_tab_action_default_params() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_plugin_instructions = Arc::new(Mutex::new(vec![]));
let plugin_receiver = mock_screen.plugin_receiver.take().unwrap();
let plugin_thread = log_actions_in_thread!(
@ -2226,7 +2238,7 @@ pub fn send_cli_new_tab_action_with_name_and_layout() {
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_plugin_instructions = Arc::new(Mutex::new(vec![]));
let plugin_receiver = mock_screen.plugin_receiver.take().unwrap();
let plugin_thread = log_actions_in_thread!(
@ -2276,7 +2288,7 @@ pub fn send_cli_next_tab_action() {
let mut mock_screen = MockScreen::new(size);
mock_screen.new_tab(second_tab_layout);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
@ -2312,7 +2324,7 @@ pub fn send_cli_previous_tab_action() {
let mut mock_screen = MockScreen::new(size);
mock_screen.new_tab(second_tab_layout);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
@ -2348,7 +2360,7 @@ pub fn send_cli_goto_tab_action() {
let mut mock_screen = MockScreen::new(size);
mock_screen.new_tab(second_tab_layout);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
@ -2384,7 +2396,7 @@ pub fn send_cli_close_tab_action() {
let mut mock_screen = MockScreen::new(size);
mock_screen.new_tab(second_tab_layout);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
@ -2420,7 +2432,7 @@ pub fn send_cli_rename_tab() {
let mut mock_screen = MockScreen::new(size);
mock_screen.new_tab(second_tab_layout);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_plugin_instructions = Arc::new(Mutex::new(vec![]));
let plugin_receiver = mock_screen.plugin_receiver.take().unwrap();
let plugin_thread = log_actions_in_thread!(
@ -2465,7 +2477,7 @@ pub fn send_cli_undo_rename_tab() {
let mut mock_screen = MockScreen::new(size);
mock_screen.new_tab(second_tab_layout);
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_plugin_instructions = Arc::new(Mutex::new(vec![]));
let plugin_receiver = mock_screen.plugin_receiver.take().unwrap();
let plugin_thread = log_actions_in_thread!(
@ -2509,7 +2521,7 @@ pub fn send_cli_query_tab_names_action() {
let mut mock_screen = MockScreen::new(size);
mock_screen.new_tab(TiledPaneLayout::default());
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(Some(TiledPaneLayout::default()));
let screen_thread = mock_screen.run(Some(TiledPaneLayout::default()), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
@ -2543,7 +2555,7 @@ pub fn send_cli_launch_or_focus_plugin_action() {
let mut mock_screen = MockScreen::new(size);
let plugin_receiver = mock_screen.plugin_receiver.take().unwrap();
let session_metadata = mock_screen.clone_session_metadata();
let screen_thread = mock_screen.run(None);
let screen_thread = mock_screen.run(None, vec![]);
let received_plugin_instructions = Arc::new(Mutex::new(vec![]));
let plugin_thread = log_actions_in_thread!(
received_plugin_instructions,
@ -2593,7 +2605,7 @@ pub fn send_cli_launch_or_focus_plugin_action_when_plugin_is_already_loaded() {
};
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), existing_plugin_pane];
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_plugin_instructions = Arc::new(Mutex::new(vec![]));
let plugin_thread = log_actions_in_thread!(
received_plugin_instructions,
@ -2653,7 +2665,7 @@ pub fn screen_can_suppress_pane() {
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![TiledPaneLayout::default(), TiledPaneLayout::default()];
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout));
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
@ -2677,3 +2689,403 @@ pub fn screen_can_suppress_pane() {
}
assert_snapshot!(format!("{}", snapshot_count));
}
#[test]
pub fn screen_can_break_pane_to_a_new_tab() {
let size = Size { cols: 80, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
let mut pane_to_break_free = TiledPaneLayout::default();
pane_to_break_free.name = Some("pane_to_break_free".to_owned());
let mut pane_to_stay = TiledPaneLayout::default();
pane_to_stay.name = Some("pane_to_stay".to_owned());
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![pane_to_break_free, pane_to_stay];
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
received_server_instructions,
ServerInstruction::KillSession,
server_receiver
);
let _ = mock_screen.to_screen.send(ScreenInstruction::BreakPane(
Box::new(Layout::default()),
Default::default(),
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// we send ApplyLayout, because in prod this is eventually received after the message traverses
// through the plugin and pty threads (to open extra stuff we need in the layout, eg. the
// default plugins)
let _ = mock_screen.to_screen.send(ScreenInstruction::ApplyLayout(
TiledPaneLayout::default(),
vec![], // floating_panes_layout
Default::default(),
vec![], // floating panes ids
Default::default(),
1,
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// move back to make sure the other pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusLeftOrPreviousTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
// move forward to make sure the broken pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusRightOrNextTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
mock_screen.teardown(vec![server_thread, screen_thread]);
let snapshots = take_snapshots_and_cursor_coordinates_from_render_events(
received_server_instructions.lock().unwrap().iter(),
size,
);
let snapshot_count = snapshots.len();
for (_cursor_coordinates, snapshot) in snapshots {
assert_snapshot!(format!("{}", snapshot));
}
assert_snapshot!(format!("{}", snapshot_count));
}
#[test]
pub fn screen_cannot_break_last_selectable_pane_to_a_new_tab() {
let size = Size { cols: 80, rows: 20 };
let initial_layout = TiledPaneLayout::default();
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
received_server_instructions,
ServerInstruction::KillSession,
server_receiver
);
let _ = mock_screen.to_screen.send(ScreenInstruction::BreakPane(
Box::new(Layout::default()),
Default::default(),
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
mock_screen.teardown(vec![server_thread, screen_thread]);
let snapshots = take_snapshots_and_cursor_coordinates_from_render_events(
received_server_instructions.lock().unwrap().iter(),
size,
);
let snapshot_count = snapshots.len();
for (_cursor_coordinates, snapshot) in snapshots {
assert_snapshot!(format!("{}", snapshot));
}
assert_snapshot!(format!("{}", snapshot_count));
}
#[test]
pub fn screen_can_break_floating_pane_to_a_new_tab() {
let size = Size { cols: 80, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
let mut pane_to_break_free = TiledPaneLayout::default();
pane_to_break_free.name = Some("tiled_pane".to_owned());
let mut floating_pane = FloatingPaneLayout::default();
floating_pane.name = Some("floating_pane_to_eject".to_owned());
let mut floating_panes_layout = vec![floating_pane];
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![pane_to_break_free];
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout), floating_panes_layout.clone());
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
received_server_instructions,
ServerInstruction::KillSession,
server_receiver
);
let _ = mock_screen.to_screen.send(ScreenInstruction::BreakPane(
Box::new(Layout::default()),
Default::default(),
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// we send ApplyLayout, because in prod this is eventually received after the message traverses
// through the plugin and pty threads (to open extra stuff we need in the layout, eg. the
// default plugins)
floating_panes_layout.get_mut(0).unwrap().already_running = true;
let _ = mock_screen.to_screen.send(ScreenInstruction::ApplyLayout(
TiledPaneLayout::default(),
floating_panes_layout,
vec![(1, None)], // tiled pane ids - send these because one needs to be created under the
// ejected floating pane, lest the tab be closed as having no tiled panes
// (this happens in prod in the pty thread)
vec![], // floating panes ids
Default::default(),
1,
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// move back to make sure the other pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusLeftOrPreviousTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
// move forward to make sure the broken pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusRightOrNextTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
mock_screen.teardown(vec![server_thread, screen_thread]);
let snapshots = take_snapshots_and_cursor_coordinates_from_render_events(
received_server_instructions.lock().unwrap().iter(),
size,
);
let snapshot_count = snapshots.len();
for (_cursor_coordinates, snapshot) in snapshots {
assert_snapshot!(format!("{}", snapshot));
}
assert_snapshot!(format!("{}", snapshot_count));
}
#[test]
pub fn screen_can_break_plugin_pane_to_a_new_tab() {
let size = Size { cols: 80, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
let mut pane_to_break_free = TiledPaneLayout::default();
pane_to_break_free.name = Some("plugin_pane_to_break_free".to_owned());
pane_to_break_free.run = Some(Run::Plugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::File(PathBuf::from("/path/to/fake/plugin")),
configuration: Default::default(),
}));
let mut pane_to_stay = TiledPaneLayout::default();
pane_to_stay.name = Some("pane_to_stay".to_owned());
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![pane_to_break_free, pane_to_stay];
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
received_server_instructions,
ServerInstruction::KillSession,
server_receiver
);
let _ = mock_screen.to_screen.send(ScreenInstruction::BreakPane(
Box::new(Layout::default()),
Default::default(),
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// we send ApplyLayout, because in prod this is eventually received after the message traverses
// through the plugin and pty threads (to open extra stuff we need in the layout, eg. the
// default plugins)
let _ = mock_screen.to_screen.send(ScreenInstruction::ApplyLayout(
TiledPaneLayout::default(),
vec![], // floating_panes_layout
Default::default(),
vec![], // floating panes ids
Default::default(),
1,
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// move back to make sure the other pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusLeftOrPreviousTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
// move forward to make sure the broken pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusRightOrNextTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
mock_screen.teardown(vec![server_thread, screen_thread]);
let snapshots = take_snapshots_and_cursor_coordinates_from_render_events(
received_server_instructions.lock().unwrap().iter(),
size,
);
let snapshot_count = snapshots.len();
for (_cursor_coordinates, snapshot) in snapshots {
assert_snapshot!(format!("{}", snapshot));
}
assert_snapshot!(format!("{}", snapshot_count));
}
#[test]
pub fn screen_can_break_floating_plugin_pane_to_a_new_tab() {
let size = Size { cols: 80, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
let mut pane_to_break_free = TiledPaneLayout::default();
pane_to_break_free.name = Some("tiled_pane".to_owned());
let mut floating_pane = FloatingPaneLayout::default();
floating_pane.name = Some("floating_plugin_pane_to_eject".to_owned());
floating_pane.run = Some(Run::Plugin(RunPlugin {
_allow_exec_host_cmd: false,
location: RunPluginLocation::File(PathBuf::from("/path/to/fake/plugin")),
configuration: Default::default(),
}));
let mut floating_panes_layout = vec![floating_pane];
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![pane_to_break_free];
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout), floating_panes_layout.clone());
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
received_server_instructions,
ServerInstruction::KillSession,
server_receiver
);
let _ = mock_screen.to_screen.send(ScreenInstruction::BreakPane(
Box::new(Layout::default()),
Default::default(),
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// we send ApplyLayout, because in prod this is eventually received after the message traverses
// through the plugin and pty threads (to open extra stuff we need in the layout, eg. the
// default plugins)
floating_panes_layout.get_mut(0).unwrap().already_running = true;
let _ = mock_screen.to_screen.send(ScreenInstruction::ApplyLayout(
TiledPaneLayout::default(),
floating_panes_layout,
vec![(1, None)], // tiled pane ids - send these because one needs to be created under the
// ejected floating pane, lest the tab be closed as having no tiled panes
// (this happens in prod in the pty thread)
vec![], // floating panes ids
Default::default(),
1,
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
// move back to make sure the other pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusLeftOrPreviousTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
// move forward to make sure the broken pane is in the previous tab
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusRightOrNextTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
mock_screen.teardown(vec![server_thread, screen_thread]);
let snapshots = take_snapshots_and_cursor_coordinates_from_render_events(
received_server_instructions.lock().unwrap().iter(),
size,
);
let snapshot_count = snapshots.len();
for (_cursor_coordinates, snapshot) in snapshots {
assert_snapshot!(format!("{}", snapshot));
}
assert_snapshot!(format!("{}", snapshot_count));
}
#[test]
pub fn screen_can_move_pane_to_a_new_tab_right() {
let size = Size { cols: 80, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
let mut pane_to_break_free = TiledPaneLayout::default();
pane_to_break_free.name = Some("pane_to_break_free".to_owned());
let mut pane_to_stay = TiledPaneLayout::default();
pane_to_stay.name = Some("pane_to_stay".to_owned());
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![pane_to_break_free, pane_to_stay];
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
received_server_instructions,
ServerInstruction::KillSession,
server_receiver
);
let _ = mock_screen.to_screen.send(ScreenInstruction::BreakPane(
Box::new(Layout::default()),
Default::default(),
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusLeftOrPreviousTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
let _ = mock_screen
.to_screen
.send(ScreenInstruction::BreakPaneRight(1));
std::thread::sleep(std::time::Duration::from_millis(100));
mock_screen.teardown(vec![server_thread, screen_thread]);
let snapshots = take_snapshots_and_cursor_coordinates_from_render_events(
received_server_instructions.lock().unwrap().iter(),
size,
);
let snapshot_count = snapshots.len();
for (_cursor_coordinates, snapshot) in snapshots {
assert_snapshot!(format!("{}", snapshot));
}
assert_snapshot!(format!("{}", snapshot_count));
}
#[test]
pub fn screen_can_move_pane_to_a_new_tab_left() {
let size = Size { cols: 80, rows: 20 };
let mut initial_layout = TiledPaneLayout::default();
let mut pane_to_break_free = TiledPaneLayout::default();
pane_to_break_free.name = Some("pane_to_break_free".to_owned());
let mut pane_to_stay = TiledPaneLayout::default();
pane_to_stay.name = Some("pane_to_stay".to_owned());
initial_layout.children_split_direction = SplitDirection::Vertical;
initial_layout.children = vec![pane_to_break_free, pane_to_stay];
let mut mock_screen = MockScreen::new(size);
let screen_thread = mock_screen.run(Some(initial_layout), vec![]);
let received_server_instructions = Arc::new(Mutex::new(vec![]));
let server_receiver = mock_screen.server_receiver.take().unwrap();
let server_thread = log_actions_in_thread!(
received_server_instructions,
ServerInstruction::KillSession,
server_receiver
);
let _ = mock_screen.to_screen.send(ScreenInstruction::BreakPane(
Box::new(Layout::default()),
Default::default(),
1,
));
std::thread::sleep(std::time::Duration::from_millis(100));
let _ = mock_screen
.to_screen
.send(ScreenInstruction::MoveFocusLeftOrPreviousTab(1));
std::thread::sleep(std::time::Duration::from_millis(100));
let _ = mock_screen
.to_screen
.send(ScreenInstruction::BreakPaneLeft(1));
std::thread::sleep(std::time::Duration::from_millis(100));
mock_screen.teardown(vec![server_thread, screen_thread]);
let snapshots = take_snapshots_and_cursor_coordinates_from_render_events(
received_server_instructions.lock().unwrap().iter(),
size,
);
let snapshot_count = snapshots.len();
for (_cursor_coordinates, snapshot) in snapshots {
assert_snapshot!(format!("{}", snapshot));
}
assert_snapshot!(format!("{}", snapshot_count));
}

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2849
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ Pane #2 ─────────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ │
06 (C): │ │
07 (C): │ ┌ floating_pane_to_eject ──────────────┐ │
08 (C): │ │ │ │
09 (C): │ │ │ │
10 (C): │ │ │ │
11 (C): │ │ │ │
12 (C): │ │ │ │
13 (C): │ │ │ │
14 (C): │ │ │ │
15 (C): │ │ │ │
16 (C): │ └──────────────────────────────────────┘ │
17 (C): │ │
18 (C): │ │
19 (C): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2849
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ tiled_pane ──────────────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2849
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ Pane #2 ─────────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ │
06 (C): │ │
07 (C): │ ┌ floating_pane_to_eject ──────────────┐ │
08 (C): │ │ │ │
09 (C): │ │ │ │
10 (C): │ │ │ │
11 (C): │ │ │ │
12 (C): │ │ │ │
13 (C): │ │ │ │
14 (C): │ │ │ │
15 (C): │ │ │ │
16 (C): │ └──────────────────────────────────────┘ │
17 (C): │ │
18 (C): │ │
19 (C): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2851
expression: "format!(\"{}\", snapshot_count)"
---
4

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2849
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ tiled_pane ──────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ ┌ floating_pane_to_eject ──────────────┐ │
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2986
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ tiled_pane ──────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ ┌ /path/to/fake/plugin ────────────────┐ │
06 (C): │ │Loading /path/to/fake/plugin │ │
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2986
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ Pane #1 ─────────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ │
06 (C): │ │
07 (C): │ ┌ /path/to/fake/plugin ────────────────┐ │
08 (C): │ │Loading /path/to/fake/plugin │ │
09 (C): │ │ │ │
10 (C): │ │ │ │
11 (C): │ │ │ │
12 (C): │ │ │ │
13 (C): │ │ │ │
14 (C): │ │ │ │
15 (C): │ │ │ │
16 (C): │ └──────────────────────────────────────┘ │
17 (C): │ │
18 (C): │ │
19 (C): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2986
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ Pane #1 ─────────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ │
06 (C): │ │
07 (C): │ ┌ /path/to/fake/plugin ────────────────┐ │
08 (C): │ │Loading /path/to/fake/plugin │ │
09 (C): │ │ │ │
10 (C): │ │ │ │
11 (C): │ │ │ │
12 (C): │ │ │ │
13 (C): │ │ │ │
14 (C): │ │ │ │
15 (C): │ │ │ │
16 (C): │ └──────────────────────────────────────┘ │
17 (C): │ │
18 (C): │ │
19 (C): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2986
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ tiled_pane ──────────────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2986
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ Pane #1 ─────────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ │
06 (C): │ │
07 (C): │ ┌ /path/to/fake/plugin ────────────────┐ │
08 (C): │ │Loading /path/to/fake/plugin │ │
09 (C): │ │ │ │
10 (C): │ │ │ │
11 (C): │ │ │ │
12 (C): │ │ │ │
13 (C): │ │ │ │
14 (C): │ │ │ │
15 (C): │ │ │ │
16 (C): │ └──────────────────────────────────────┘ │
17 (C): │ │
18 (C): │ │
19 (C): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2986
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ Pane #1 ─────────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ │
06 (C): │ │
07 (C): │ ┌ /path/to/fake/plugin ────────────────┐ │
08 (C): │ │Loading /path/to/fake/plugin │ │
09 (C): │ │ │ │
10 (C): │ │ │ │
11 (C): │ │ │ │
12 (C): │ │ │ │
13 (C): │ │ │ │
14 (C): │ │ │ │
15 (C): │ │ │ │
16 (C): │ └──────────────────────────────────────┘ │
17 (C): │ │
18 (C): │ │
19 (C): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2988
expression: "format!(\"{}\", snapshot_count)"
---
7

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2986
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ tiled_pane ──────────────────────────────────────────────────────────────────┐
01 (C): │ │
02 (C): │ │
03 (C): │ │
04 (C): │ │
05 (C): │ ┌ /path/to/fake/plugin ────────────────┐ │
06 (C): │ │Loading /path/to/fake/plugin │ │
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2739
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_break_free ──────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2739
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_stay ────────────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2739
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_break_free ──────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2741
expression: "format!(\"{}\", snapshot_count)"
---
4

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2739
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_break_free ──────────────────┐┌ pane_to_stay ────────────────────────┐
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): └──────────────────────────────────────┘└──────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2914
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_stay ────────────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2914
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ plugin_pane_to_break_free ───────────────────────────────────────────────────┐
01 (C): │Loading /path/to/fake/plugin │
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2914
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ plugin_pane_to_break_free ───────────────────────────────────────────────────┐
01 (C): │Loading /path/to/fake/plugin │
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2914
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_stay ────────────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2916
expression: "format!(\"{}\", snapshot_count)"
---
5

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2914
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ plugin_pane_to_break_free ───────────┐┌ pane_to_stay ────────────────────────┐
01 (C): │Loading /path/to/fake/plugin ││ │
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): └──────────────────────────────────────┘└──────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3079
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_break_free ──────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3079
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_stay ────────────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3079
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_stay ────────────────────────┐┌ pane_to_break_free ──────────────────┐
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): └──────────────────────────────────────┘└──────────────────────────────────────┘

View File

@ -0,0 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3081
expression: "format!(\"{}\", snapshot_count)"
---
4

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3079
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_break_free ──────────────────┐┌ pane_to_stay ────────────────────────┐
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): └──────────────────────────────────────┘└──────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3032
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_break_free ──────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3032
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_stay ────────────────────────────────────────────────────────────────┐
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): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3032
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_stay ────────────────────────┐┌ pane_to_break_free ──────────────────┐
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): └──────────────────────────────────────┘└──────────────────────────────────────┘

View File

@ -0,0 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3034
expression: "format!(\"{}\", snapshot_count)"
---
4

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 3032
expression: "format!(\"{}\", snapshot)"
---
00 (C): ┌ pane_to_break_free ──────────────────┐┌ pane_to_stay ────────────────────────┐
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): └──────────────────────────────────────┘└──────────────────────────────────────┘

View File

@ -0,0 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2775
expression: "format!(\"{}\", snapshot_count)"
---
1

View File

@ -0,0 +1,26 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2773
expression: "format!(\"{}\", 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): │ │
14 (C): │ │
15 (C): │ │
16 (C): │ │
17 (C): │ │
18 (C): │ │
19 (C): └──────────────────────────────────────────────────────────────────────────────┘

View File

@ -1,5 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2217
expression: "format!(\"{:#?}\", new_tab_action)"
---
Some(
@ -23,6 +24,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -36,6 +38,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +49,7 @@ Some(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
),
[],

View File

@ -1,6 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2448
assertion_line: 2263
expression: "format!(\"{:#?}\", new_tab_instruction)"
---
NewTab(
@ -27,6 +27,7 @@ NewTab(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -44,6 +45,7 @@ NewTab(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -61,6 +63,7 @@ NewTab(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -71,6 +74,7 @@ NewTab(
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
),
[],

View File

@ -54,6 +54,9 @@ keybinds {
bind "n" { NewTab; SwitchToMode "Normal"; }
bind "x" { CloseTab; SwitchToMode "Normal"; }
bind "s" { ToggleActiveSyncTab; SwitchToMode "Normal"; }
bind "b" { BreakPane; SwitchToMode "Normal"; }
bind "]" { BreakPaneRight; SwitchToMode "Normal"; }
bind "[" { BreakPaneLeft; SwitchToMode "Normal"; }
bind "1" { GoToTab 1; SwitchToMode "Normal"; }
bind "2" { GoToTab 2; SwitchToMode "Normal"; }
bind "3" { GoToTab 3; SwitchToMode "Normal"; }

View File

@ -338,6 +338,9 @@ pub enum ScreenContext {
FocusPaneWithId,
RenamePane,
RenameTab,
BreakPane,
BreakPaneRight,
BreakPaneLeft,
}
/// Stack call representations corresponding to the different types of [`PtyInstruction`]s.

View File

@ -240,6 +240,9 @@ pub enum Action {
RenameTerminalPane(u32, Vec<u8>),
RenamePluginPane(u32, Vec<u8>),
RenameTab(u32, Vec<u8>),
BreakPane,
BreakPaneRight,
BreakPaneLeft,
}
impl Action {

View File

@ -401,6 +401,7 @@ pub struct FloatingPaneLayout {
pub y: Option<PercentOrFixed>,
pub run: Option<Run>,
pub focus: Option<bool>,
pub already_running: bool,
}
impl FloatingPaneLayout {
@ -438,6 +439,7 @@ pub struct TiledPaneLayout {
pub children_are_stacked: bool,
pub is_expanded_in_stack: bool,
pub exclude_from_sync: Option<bool>,
pub run_instructions_to_ignore: Vec<Option<Run>>,
}
impl TiledPaneLayout {
@ -559,8 +561,36 @@ impl TiledPaneLayout {
let mut child_run_instructions = child.extract_run_instructions();
run_instructions.append(&mut child_run_instructions);
}
let mut successfully_ignored = 0;
for instruction_to_ignore in &self.run_instructions_to_ignore {
if let Some(position) = run_instructions
.iter()
.position(|i| i == instruction_to_ignore)
{
run_instructions.remove(position);
successfully_ignored += 1;
}
}
// we need to do this because if we have an ignored instruction that does not match any
// running instruction, we'll have an extra pane and our state will be messed up and we'll
// crash (this can happen for example when breaking a plugin pane into a new tab that does
// not have room for it but has a terminal instead)
if successfully_ignored < self.run_instructions_to_ignore.len() {
for _ in 0..self
.run_instructions_to_ignore
.len()
.saturating_sub(successfully_ignored)
{
if let Some(position) = run_instructions.iter().position(|i| i == &None) {
run_instructions.remove(position);
}
}
}
run_instructions
}
pub fn ignore_run_instruction(&mut self, run_instruction: Option<Run>) {
self.run_instructions_to_ignore.push(run_instruction);
}
pub fn with_one_pane() -> Self {
let mut default_layout = TiledPaneLayout::default();
default_layout.children = vec![TiledPaneLayout::default()];

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1322
assertion_line: 1352
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -34,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -60,6 +61,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -70,6 +72,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1287
assertion_line: 1317
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -37,6 +37,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -63,6 +64,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -73,6 +75,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,5 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1926
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -40,6 +42,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: true,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -53,6 +56,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -63,6 +67,7 @@ Layout {
children_are_stacked: true,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -73,6 +78,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1864
assertion_line: 1894
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -41,6 +42,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -51,6 +53,7 @@ Layout {
children_are_stacked: true,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -61,6 +64,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1881
assertion_line: 1911
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -32,6 +32,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -45,6 +46,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -55,6 +57,7 @@ Layout {
children_are_stacked: true,
is_expanded_in_stack: true,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -65,6 +68,7 @@ Layout {
children_are_stacked: true,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -75,6 +79,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1863
assertion_line: 1880
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -24,6 +24,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -34,6 +35,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -78,6 +80,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -99,6 +102,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -114,6 +118,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -124,6 +129,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -134,6 +140,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -165,6 +172,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -175,6 +183,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
MaxPanes(
8,
@ -212,6 +221,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -235,6 +245,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -252,6 +263,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -265,6 +277,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -278,6 +291,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -291,6 +305,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -301,6 +316,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -311,6 +327,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -321,6 +338,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -352,6 +370,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -362,6 +381,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
MaxPanes(
12,
@ -399,6 +419,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -422,6 +443,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -439,6 +461,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -452,6 +475,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -465,6 +489,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -478,6 +503,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -488,6 +514,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -505,6 +532,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -518,6 +546,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -531,6 +560,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -544,6 +574,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -554,6 +585,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -564,6 +596,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -574,6 +607,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -605,6 +639,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -615,6 +650,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
},
Some(

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 956
assertion_line: 975
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -34,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -51,6 +52,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -64,6 +66,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -74,6 +77,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -84,6 +88,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -97,6 +102,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -107,6 +113,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -128,6 +135,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -140,6 +148,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -153,6 +162,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -163,6 +173,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -173,6 +184,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 908
assertion_line: 927
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -29,6 +29,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -59,6 +61,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -69,6 +72,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -79,6 +83,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -92,6 +97,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -102,6 +108,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -127,6 +134,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -139,6 +147,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -152,6 +161,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -162,6 +172,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -181,6 +192,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1339
assertion_line: 1369
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -34,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -57,6 +58,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -67,6 +69,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1305
assertion_line: 1335
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -34,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -57,6 +58,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -67,6 +69,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1008
assertion_line: 1027
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -29,6 +29,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -48,6 +49,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -58,6 +60,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -71,6 +74,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -81,6 +85,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -98,6 +103,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -111,6 +117,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -121,6 +128,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -131,6 +139,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -156,6 +165,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -175,6 +185,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -185,6 +196,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -198,6 +210,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -208,6 +221,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -221,6 +235,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -231,6 +246,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -250,6 +266,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1374
assertion_line: 1404
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -34,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -59,6 +60,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -69,6 +71,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1357
assertion_line: 1387
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -61,6 +62,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -71,6 +73,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 2116
assertion_line: 2141
expression: "format!(\"{layout:#?}\")"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -45,6 +46,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -62,6 +64,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -79,6 +82,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -104,6 +108,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -125,6 +130,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -146,6 +152,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -171,6 +178,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -192,6 +200,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -202,6 +211,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1759
assertion_line: 1789
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -52,6 +53,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -66,6 +68,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -85,6 +88,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1780
assertion_line: 1810
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -31,6 +31,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -56,6 +57,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -77,6 +79,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -91,6 +94,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -105,6 +109,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -119,6 +124,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -138,6 +144,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1799
assertion_line: 1829
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -52,6 +53,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -73,6 +75,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -87,6 +90,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -101,6 +105,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -120,6 +125,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1644
assertion_line: 1674
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -53,6 +54,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -63,6 +65,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1677
assertion_line: 1707
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -53,6 +54,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -63,6 +65,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1698
assertion_line: 1728
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -53,6 +54,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -63,6 +65,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1657
assertion_line: 1687
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -53,6 +54,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -63,6 +65,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1714
assertion_line: 1744
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -52,6 +53,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -66,6 +68,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -85,6 +88,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -34,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -44,6 +45,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -34,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -44,6 +45,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 767
assertion_line: 786
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +25,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Vertical,
@ -42,6 +43,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -55,6 +57,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -65,6 +68,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -78,6 +82,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -88,6 +93,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -111,6 +117,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -128,6 +135,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -141,6 +149,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -151,6 +160,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -164,6 +174,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -174,6 +185,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -195,6 +207,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -208,6 +221,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -221,6 +235,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -231,6 +246,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -254,6 +270,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -267,6 +284,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -280,6 +298,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -290,6 +309,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 862
assertion_line: 881
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -41,6 +42,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -58,6 +60,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -71,6 +74,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -81,6 +85,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -98,6 +103,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -111,6 +117,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -124,6 +131,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -134,6 +142,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -144,6 +153,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -154,6 +164,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 836
assertion_line: 855
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -41,6 +42,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -58,6 +60,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -71,6 +74,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -81,6 +85,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -94,6 +99,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -104,6 +110,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -114,6 +121,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,5 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1038
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +26,7 @@ Layout {
exclude_from_sync: Some(
true,
),
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -35,6 +37,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 794
assertion_line: 813
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -45,6 +46,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -55,6 +57,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -68,6 +71,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -78,6 +82,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Vertical,
@ -95,6 +100,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -112,6 +118,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -125,6 +132,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -135,6 +143,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -148,6 +157,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -158,6 +168,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Vertical,
@ -175,6 +186,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Vertical,
@ -192,6 +204,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -205,6 +218,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -215,6 +229,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -228,6 +243,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -238,6 +254,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Vertical,
@ -255,6 +272,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -268,6 +286,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -281,6 +300,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -291,6 +311,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -301,6 +322,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 815
assertion_line: 834
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -54,6 +55,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -64,6 +66,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -77,6 +80,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -87,6 +91,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -97,6 +102,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -116,6 +122,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -23,6 +23,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -33,6 +34,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[
FloatingPaneLayout {
@ -43,6 +45,7 @@ Layout {
y: None,
run: None,
focus: None,
already_running: false,
},
],
),
@ -64,6 +67,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -74,6 +78,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[
FloatingPaneLayout {
@ -84,6 +89,7 @@ Layout {
y: None,
run: None,
focus: None,
already_running: false,
},
FloatingPaneLayout {
name: None,
@ -93,6 +99,7 @@ Layout {
y: None,
run: None,
focus: None,
already_running: false,
},
],
),
@ -112,6 +119,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1528
assertion_line: 1558
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1474
assertion_line: 1504
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1491
assertion_line: 1521
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1509
assertion_line: 1539
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1546
assertion_line: 1576
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1564
assertion_line: 1594
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -38,6 +39,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1598
assertion_line: 1628
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1580
assertion_line: 1610
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -36,6 +36,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -46,6 +47,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,5 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1644
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -31,6 +32,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -41,6 +43,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,5 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1660
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -31,6 +32,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -41,6 +43,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1729
assertion_line: 1759
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -52,6 +53,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -66,6 +68,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -85,6 +88,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1744
assertion_line: 1774
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
TiledPaneLayout {
children_split_direction: Horizontal,
@ -52,6 +53,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
],
split_size: None,
@ -66,6 +68,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),
@ -85,6 +88,7 @@ Layout {
children_are_stacked: false,
is_expanded_in_stack: false,
exclude_from_sync: None,
run_instructions_to_ignore: [],
},
[],
),

View File

@ -915,6 +915,9 @@ impl TryFrom<(&KdlNode, &Options)> for Action {
},
"PreviousSwapLayout" => Ok(Action::PreviousSwapLayout),
"NextSwapLayout" => Ok(Action::NextSwapLayout),
"BreakPane" => Ok(Action::BreakPane),
"BreakPaneRight" => Ok(Action::BreakPaneRight),
"BreakPaneLeft" => Ok(Action::BreakPaneLeft),
_ => Err(ConfigError::new_kdl_error(
format!("Unsupported action: {}", action_name).into(),
kdl_action.span().offset(),

View File

@ -22,6 +22,12 @@ pub struct Viewport {
pub cols: usize,
}
impl Viewport {
pub fn has_positive_size(&self) -> bool {
self.rows > 0 && self.cols > 0
}
}
#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct Offset {
pub top: usize,

Some files were not shown because too many files have changed in this diff Show More