aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 16:44:05 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 16:44:05 +0300
commit8007c9202ce1f90f95bd3442bc59148e33d13620 (patch)
tree2ad9f63a1e195370810fa0c701a49cea7ff7ec11 /src/ui
parent9663028a82aeef9722adaac34d2fcb8c19fc3a53 (diff)
fix: resize background tabs on terminal resize
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/panes.rs42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/ui/panes.rs b/src/ui/panes.rs
index c4ba0c54..20ac9165 100644
--- a/src/ui/panes.rs
+++ b/src/ui/panes.rs
@@ -13,17 +13,24 @@ use crate::app::{AppState, Mode};
use crate::layout::PaneInfo;
use crate::pane::PaneRuntime;
-fn stable_scrollbar_gutter(rt: &PaneRuntime, pane_inner: Rect) -> (Rect, Option<Rect>) {
+fn stable_terminal_inner_rect(pane_inner: Rect) -> Rect {
if pane_inner.width <= 4 {
- return (pane_inner, None);
+ return pane_inner;
}
- let inner_rect = Rect::new(
+ Rect::new(
pane_inner.x,
pane_inner.y,
pane_inner.width.saturating_sub(1),
pane_inner.height,
- );
+ )
+}
+
+fn stable_scrollbar_gutter(rt: &PaneRuntime, pane_inner: Rect) -> (Rect, Option<Rect>) {
+ let inner_rect = stable_terminal_inner_rect(pane_inner);
+ if inner_rect == pane_inner {
+ return (inner_rect, None);
+ }
let gutter = Rect::new(
pane_inner.x + pane_inner.width.saturating_sub(1),
pane_inner.y,
@@ -38,6 +45,33 @@ fn stable_scrollbar_gutter(rt: &PaneRuntime, pane_inner: Rect) -> (Rect, Option<
(inner_rect, scrollbar_rect)
}
+/// Resize every visible runtime in a tab to the geometry it would receive if the tab were selected.
+pub(super) fn resize_tab_panes(tab: &crate::workspace::Tab, area: Rect) {
+ let multi_pane = tab.layout.pane_count() > 1;
+
+ if tab.zoomed {
+ let focused_id = tab.layout.focused();
+ if let Some(rt) = tab.runtimes.get(&focused_id) {
+ let inner_rect = stable_terminal_inner_rect(area);
+ rt.resize(inner_rect.height, inner_rect.width);
+ }
+ return;
+ }
+
+ for info in tab.layout.panes(area) {
+ let pane_inner = if multi_pane {
+ Block::default().borders(Borders::ALL).inner(info.rect)
+ } else {
+ area
+ };
+
+ if let Some(rt) = tab.runtimes.get(&info.id) {
+ let inner_rect = stable_terminal_inner_rect(pane_inner);
+ rt.resize(inner_rect.height, inner_rect.width);
+ }
+ }
+}
+
/// Compute pane layout info and optionally resize pane runtimes to match.
pub(super) fn compute_pane_infos(app: &AppState, area: Rect, resize_panes: bool) -> Vec<PaneInfo> {
let Some(ws_idx) = app.active else {