diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-11 16:44:05 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-11 16:44:05 +0300 |
| commit | 8007c9202ce1f90f95bd3442bc59148e33d13620 (patch) | |
| tree | 2ad9f63a1e195370810fa0c701a49cea7ff7ec11 /src/ui | |
| parent | 9663028a82aeef9722adaac34d2fcb8c19fc3a53 (diff) | |
fix: resize background tabs on terminal resize
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/panes.rs | 42 |
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 { |
