aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src/panes/tiled_panes
diff options
context:
space:
mode:
authorBrooks Rady <b.j.rady@gmail.com>2025-03-10 16:21:10 +0000
committerGitHub <noreply@github.com>2025-03-10 17:21:10 +0100
commit4fd0bac675f910e8a7feb6664e64840dedcfa5bd (patch)
tree05f320be4b22fd809001355f2537ff7443e637de /zellij-server/src/panes/tiled_panes
parentdocs(changelog): add 3 recent PRs (diff)
downloadsl0ppij-4fd0bac675f910e8a7feb6664e64840dedcfa5bd.tar.gz
sl0ppij-4fd0bac675f910e8a7feb6664e64840dedcfa5bd.tar.xz
sl0ppij-4fd0bac675f910e8a7feb6664e64840dedcfa5bd.zip
fix(stacked): stacked panes can't resize status-bar (#4051)
* fix(typo): fix a typo in error message * fix(typo): fix typo in Tip #6 * fix(logging): silence filesystem error This `Option` chain already ends with `.unwrap_or_else(Default::default)` so it's clearly expected that prior operations in the chain may fail. I didn't have the default `layout_dir` on my computer, and it would fill my logfile with unhelpful spam — on every pane creation, resize, etc. * fix(stacked): stacked panes can't resize status-bar * fix(e2e): race in multiple users test --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
Diffstat (limited to 'zellij-server/src/panes/tiled_panes')
-rw-r--r--zellij-server/src/panes/tiled_panes/pane_resizer.rs30
-rw-r--r--zellij-server/src/panes/tiled_panes/stacked_panes.rs2
2 files changed, 30 insertions, 2 deletions
diff --git a/zellij-server/src/panes/tiled_panes/pane_resizer.rs b/zellij-server/src/panes/tiled_panes/pane_resizer.rs
index 24d5df4f..506481d4 100644
--- a/zellij-server/src/panes/tiled_panes/pane_resizer.rs
+++ b/zellij-server/src/panes/tiled_panes/pane_resizer.rs
@@ -54,7 +54,10 @@ impl<'a> PaneResizer<'a> {
let spans = self
.discretize_spans(grid, space)
.map_err(|err| anyhow!("{}", err))?;
- self.apply_spans(spans)?;
+
+ if self.is_layout_valid(&spans) {
+ self.apply_spans(spans)?;
+ }
Ok(())
}
@@ -128,6 +131,31 @@ impl<'a> PaneResizer<'a> {
Ok(grid.into_iter().flatten().collect())
}
+ // HACK: This whole function is a bit of a hack — it's here to stop us from breaking the layout if we've been given
+ // a bad state to start with. If this function returns false, nothing is resized.
+ fn is_layout_valid(&self, spans: &[Span]) -> bool {
+ // If pane stacks are too tall to fit on the screen, abandon ship before the status bar gets caught up in
+ // any erroneous resizing...
+ for span in spans {
+ let pane_is_stacked = self
+ .panes
+ .borrow()
+ .get(&span.pid)
+ .unwrap()
+ .current_geom()
+ .is_stacked();
+ if pane_is_stacked && span.direction == SplitDirection::Vertical {
+ let min_stack_height = StackedPanes::new(self.panes.clone())
+ .min_stack_height(&span.pid)
+ .unwrap();
+ if span.size.as_usize() < min_stack_height {
+ return false;
+ }
+ }
+ }
+ true
+ }
+
fn apply_spans(&mut self, spans: Vec<Span>) -> Result<()> {
let err_context = || format!("Failed to apply spans");
let mut geoms_changed = false;
diff --git a/zellij-server/src/panes/tiled_panes/stacked_panes.rs b/zellij-server/src/panes/tiled_panes/stacked_panes.rs
index a8640489..8044b0b0 100644
--- a/zellij-server/src/panes/tiled_panes/stacked_panes.rs
+++ b/zellij-server/src/panes/tiled_panes/stacked_panes.rs
@@ -309,7 +309,7 @@ impl<'a> StackedPanes<'a> {
Ok(())
}
fn pane_is_one_liner(&self, id: &PaneId) -> Result<bool> {
- let err_context = || format!("Cannot determin if pane is one liner or not");
+ let err_context = || format!("Cannot determine if pane is one liner or not");
let panes = self.panes.borrow();
let pane_to_close = panes.get(id).with_context(err_context)?;
Ok(pane_to_close.position_and_size().rows.is_fixed())