Hotfix: Resize with plugin panes (#2019)

* server/panes/tiled/grid: Fix area calculation

for debug assertions. Now also considers fixed-size panes correctly.

* server/panes/tiled/grid: Refactor function

to make it more readable and remove some implicitly handled "special"
cases.

* server/panes/tiled/grid: Handle plugins panes

like any other pane type and only check whether they are fixed-size
panes, too.

* changelog: Add PR #2019
This commit is contained in:
har7an 2022-12-13 09:49:41 +00:00 committed by GitHub
parent bb2b8ddc82
commit 685e39bd9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 38 deletions

View File

@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
## [Unreleased] ## [Unreleased]
* hotfix: fix panics when resizing with flexible plugin panes in layout (https://github.com/zellij-org/zellij/pull/2019)
## [0.34.3] - 2022-12-09 ## [0.34.3] - 2022-12-09
* (BREAKING CHANGE) performance: change plugin data flow to improve render speed (https://github.com/zellij-org/zellij/pull/1934) * (BREAKING CHANGE) performance: change plugin data flow to improve render speed (https://github.com/zellij-org/zellij/pull/1934)

View File

@ -4,7 +4,7 @@ use crate::tab::{MIN_TERMINAL_HEIGHT, MIN_TERMINAL_WIDTH};
use crate::{panes::PaneId, tab::Pane}; use crate::{panes::PaneId, tab::Pane};
use std::cmp::Reverse; use std::cmp::Reverse;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use zellij_utils::data::{Direction, ResizeStrategy}; use zellij_utils::data::{Direction, Resize, ResizeStrategy};
use zellij_utils::{ use zellij_utils::{
errors::prelude::*, errors::prelude::*,
input::layout::SplitDirection, input::layout::SplitDirection,
@ -57,15 +57,11 @@ impl<'a> TiledPaneGrid<'a> {
let mut summed_area: f64 = 0.0; let mut summed_area: f64 = 0.0;
for pane in self.panes.clone().borrow().values() { for pane in self.panes.clone().borrow().values() {
if let PaneId::Terminal(_id) = pane.pid() {
let geom = pane.current_geom(); let geom = pane.current_geom();
summed_area += match (geom.rows.as_percent(), geom.cols.as_percent()) { summed_area += match (geom.rows.as_percent(), geom.cols.as_percent()) {
(Some(rows), Some(cols)) => rows * cols, (Some(rows), Some(cols)) => rows * cols,
_ => continue, _ => continue,
}; };
} else {
continue;
}
} }
summed_area / (100.0 * 100.0) summed_area / (100.0 * 100.0)
@ -103,23 +99,19 @@ impl<'a> TiledPaneGrid<'a> {
) -> Result<bool> { ) -> Result<bool> {
let err_context = || format!("failed to determine if pane {pane_id:?} can {strategy}"); let err_context = || format!("failed to determine if pane {pane_id:?} can {strategy}");
let pane_ids = if let Some(direction) = strategy.direction { if let Some(direction) = strategy.direction {
let mut vec = self let mut pane_ids = self
.pane_ids_directly_next_to(pane_id, &direction) .pane_ids_directly_next_to(pane_id, &direction)
.with_context(err_context)?; .with_context(err_context)?;
vec.retain(|id| self.pane_is_flexible(direction.into(), id).unwrap_or(false)); pane_ids.retain(|id| self.pane_is_flexible(direction.into(), id).unwrap_or(false));
vec
} else {
return Ok(true);
};
use zellij_utils::data::Resize::Decrease as Dec; if pane_ids.is_empty() {
use zellij_utils::data::Resize::Increase as Inc; return Ok(false);
}
if !pane_ids.is_empty() { if direction.is_horizontal() {
if strategy.direction_horizontal() {
match strategy.resize { match strategy.resize {
Inc => { Resize::Increase => {
for id in pane_ids { for id in pane_ids {
if !self if !self
.can_reduce_pane_width(&id, change_by.0 as f64) .can_reduce_pane_width(&id, change_by.0 as f64)
@ -130,13 +122,13 @@ impl<'a> TiledPaneGrid<'a> {
} }
Ok(true) Ok(true)
}, },
Dec => self Resize::Decrease => self
.can_reduce_pane_width(pane_id, change_by.0 as f64) .can_reduce_pane_width(pane_id, change_by.0 as f64)
.with_context(err_context), .with_context(err_context),
} }
} else if strategy.direction_vertical() { } else {
match strategy.resize { match strategy.resize {
Inc => { Resize::Increase => {
for id in pane_ids { for id in pane_ids {
if !self if !self
.can_reduce_pane_height(&id, change_by.1 as f64) .can_reduce_pane_height(&id, change_by.1 as f64)
@ -147,15 +139,14 @@ impl<'a> TiledPaneGrid<'a> {
} }
Ok(true) Ok(true)
}, },
Dec => self Resize::Decrease => self
.can_reduce_pane_height(pane_id, change_by.1 as f64) .can_reduce_pane_height(pane_id, change_by.1 as f64)
.with_context(err_context), .with_context(err_context),
} }
} else {
unimplemented!();
} }
} else { } else {
Ok(false) // Undirected resize, this is checked elsewhere
Ok(true)
} }
} }
@ -181,10 +172,10 @@ impl<'a> TiledPaneGrid<'a> {
.direction .direction
.and_then(|direction| { .and_then(|direction| {
// Only invert if there are no neighbor IDs in the given direction // Only invert if there are no neighbor IDs in the given direction
self.pane_ids_directly_next_to(pane_id, &direction) let mut neighbors = self.pane_ids_directly_next_to(pane_id, &direction)
.unwrap_or_default() .unwrap_or_default();
.is_empty() neighbors.retain(|pane_id| self.pane_is_flexible(direction.into(), pane_id).unwrap_or(false));
.then_some(true) neighbors.is_empty().then_some(true)
}) })
.unwrap_or(false) .unwrap_or(false)
{ {
@ -518,11 +509,6 @@ impl<'a> TiledPaneGrid<'a> {
.with_context(err_context)?; .with_context(err_context)?;
for (&pid, terminal) in panes.iter() { for (&pid, terminal) in panes.iter() {
// We cannot resize plugin panes, so we do not even bother trying.
if let PaneId::Plugin(_) = pid {
continue;
}
if match direction { if match direction {
Direction::Left => (terminal.x() + terminal.cols()) == terminal_to_check.x(), Direction::Left => (terminal.x() + terminal.cols()) == terminal_to_check.x(),
Direction::Down => { Direction::Down => {