aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 03:42:43 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 03:42:43 +0300
commit510f56e1ce3f671a6a2457032a44188997ef0764 (patch)
treeafc117177aa1969de598d4746012a558ad8a83cf /src
parentc115dbd0510200371dc033c208c0c3c09131c797 (diff)
fix: show border around zoomed multi-pane tabs
refs #115
Diffstat (limited to 'src')
-rw-r--r--src/ui/panes.rs44
1 files changed, 41 insertions, 3 deletions
diff --git a/src/ui/panes.rs b/src/ui/panes.rs
index e149362c..971901bd 100644
--- a/src/ui/panes.rs
+++ b/src/ui/panes.rs
@@ -55,6 +55,14 @@ fn stable_terminal_inner_rect(pane_inner: Rect) -> Rect {
)
}
+fn pane_inner_rect(area: Rect, framed: bool) -> Rect {
+ if framed {
+ Block::default().borders(Borders::ALL).inner(area)
+ } else {
+ area
+ }
+}
+
fn runtime_for_tab_pane<'a>(
app: &'a AppState,
tab: &'a crate::workspace::Tab,
@@ -101,7 +109,8 @@ pub(super) fn resize_tab_panes(
if tab.zoomed {
let focused_id = tab.layout.focused();
if let Some((terminal_id, rt)) = runtime_for_tab_pane(app, tab, focused_id) {
- let inner_rect = stable_terminal_inner_rect(area);
+ let pane_inner = pane_inner_rect(area, multi_pane);
+ let inner_rect = stable_terminal_inner_rect(pane_inner);
if !app.direct_attach_resize_locks.contains(terminal_id) {
rt.resize(
inner_rect.height,
@@ -154,10 +163,11 @@ pub(super) fn compute_pane_infos(
if ws.zoomed {
let focused_id = ws.layout.focused();
- let mut inner_rect = area;
+ let pane_inner = pane_inner_rect(area, multi_pane);
+ let mut inner_rect = pane_inner;
let mut scrollbar_rect = None;
if let Some(rt) = app.runtime_for_pane_in_workspace(ws_idx, focused_id) {
- (inner_rect, scrollbar_rect) = stable_scrollbar_gutter(rt, area);
+ (inner_rect, scrollbar_rect) = stable_scrollbar_gutter(rt, pane_inner);
if resize_panes
&& ws.terminal_id(focused_id).is_some_and(|terminal_id| {
!app.direct_attach_resize_locks.contains(terminal_id)
@@ -459,6 +469,34 @@ mod tests {
}
#[tokio::test]
+ async fn zoomed_multi_pane_keeps_border_space() {
+ let mut app = AppState::test_new();
+ let mut workspace = Workspace::test_new("test");
+ let focused_pane = workspace.test_split(ratatui::layout::Direction::Horizontal);
+ workspace.zoomed = true;
+ workspace.tabs[0].runtimes.insert(
+ focused_pane,
+ TerminalRuntime::test_with_scrollback_bytes(40, 8, 1024, b"ready\n"),
+ );
+ app.workspaces = vec![workspace];
+ app.active = Some(0);
+
+ let area = Rect::new(10, 3, 40, 8);
+ let infos = compute_pane_infos(
+ &app,
+ area,
+ false,
+ crate::kitty_graphics::HostCellSize::default(),
+ );
+ let info = &infos[0];
+
+ assert_eq!(info.id, focused_pane);
+ assert_eq!(info.rect, area);
+ assert_eq!(info.scrollbar_rect, None);
+ assert_eq!(info.inner_rect, Rect::new(11, 4, 37, 6));
+ }
+
+ #[tokio::test]
async fn tiny_pane_does_not_reserve_scrollbar_gutter() {
let mut app = AppState::test_new();
let mut workspace = Workspace::test_new("test");