From 102d5185c18334996186068e118dea642ce30d14 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 21 Sep 2026 10:33:16 +0000 Subject: [PATCH] Do not unzoom when resizing a floating pane that was created with -A. Similarly, skip hidden floating panes when changing Z order. Reported by Clark Wang. --- cmd-join-pane.c | 19 ++++++++++++++----- cmd-resize-pane.c | 5 +++-- tmux.h | 3 ++- window.c | 14 +++++++++++++- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/cmd-join-pane.c b/cmd-join-pane.c index 34bc95c8e..44d79cafb 100644 --- a/cmd-join-pane.c +++ b/cmd-join-pane.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-join-pane.c,v 1.74 2026/08/03 20:29:52 nicm Exp $ */ +/* $OpenBSD: cmd-join-pane.c,v 1.75 2026/09/21 10:33:16 nicm Exp $ */ /* * Copyright (c) 2011 George Nachman @@ -133,7 +133,7 @@ cmd_join_pane_place(struct cmdq_item *item, struct winlink *wl, } else if (strcmp(position, "back") == 0) { TAILQ_REMOVE(&w->z_index, wp, zentry); TAILQ_FOREACH(owp, &w->z_index, zentry) { - if (!window_pane_is_floating(owp)) + if (!window_pane_is_floating_with_hidden(owp)) break; } if (owp != NULL) @@ -142,24 +142,30 @@ cmd_join_pane_place(struct cmdq_item *item, struct winlink *wl, TAILQ_INSERT_TAIL(&w->z_index, wp, zentry); } else if (strcmp(position, "forward") == 0) { owp = TAILQ_PREV(wp, window_panes_zindex, zentry); + while (owp != NULL && owp->layout_cell == NULL) + owp = TAILQ_PREV(owp, window_panes_zindex, zentry); if (owp != NULL) { TAILQ_REMOVE(&w->z_index, wp, zentry); TAILQ_INSERT_BEFORE(owp, wp, zentry); } } else if (strcmp(position, "backward") == 0) { owp = TAILQ_NEXT(wp, zentry); + while (owp != NULL && owp->layout_cell == NULL) + owp = TAILQ_NEXT(owp, zentry); if (owp != NULL && window_pane_is_floating(owp)) { TAILQ_REMOVE(&w->z_index, wp, zentry); TAILQ_INSERT_AFTER(&w->z_index, owp, wp, zentry); } } else if (strcmp(position, "forward-loop") == 0) { owp = TAILQ_PREV(wp, window_panes_zindex, zentry); + while (owp != NULL && owp->layout_cell == NULL) + owp = TAILQ_PREV(owp, window_panes_zindex, zentry); TAILQ_REMOVE(&w->z_index, wp, zentry); if (owp != NULL) TAILQ_INSERT_BEFORE(owp, wp, zentry); else { TAILQ_FOREACH(owp, &w->z_index, zentry) { - if (!window_pane_is_floating(owp)) + if (!window_pane_is_floating_with_hidden(owp)) break; } if (owp != NULL) @@ -169,6 +175,8 @@ cmd_join_pane_place(struct cmdq_item *item, struct winlink *wl, } } else if (strcmp(position, "backward-loop") == 0) { owp = TAILQ_NEXT(wp, zentry); + while (owp != NULL && owp->layout_cell == NULL) + owp = TAILQ_NEXT(owp, zentry); if (owp != NULL && window_pane_is_floating(owp)) { TAILQ_REMOVE(&w->z_index, wp, zentry); TAILQ_INSERT_AFTER(&w->z_index, owp, wp, zentry); @@ -347,8 +355,10 @@ cmd_join_pane_zindex(struct cmdq_item *item, struct winlink *wl, n = 0; TAILQ_FOREACH(owp, &w->z_index, zentry) { - if (!window_pane_is_floating(owp)) + if (!window_pane_is_floating_with_hidden(owp)) break; + if (owp->layout_cell == NULL) + continue; if (n >= z) break; n++; @@ -443,7 +453,6 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "pane is not floating"); return (CMD_RETURN_ERROR); } - server_unzoom_window(dst_w); if ((s = args_get(args, 'P')) != NULL) return (cmd_join_pane_place(item, dst_wl, dst_wp, s)); if ((s = args_get(args, 'z')) != NULL) diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c index fc5062ab4..c644dd783 100644 --- a/cmd-resize-pane.c +++ b/cmd-resize-pane.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-resize-pane.c,v 1.68 2026/08/31 07:44:39 nicm Exp $ */ +/* $OpenBSD: cmd-resize-pane.c,v 1.69 2026/09/21 10:33:16 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -91,7 +91,8 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item) server_redraw_window(w); return (CMD_RETURN_NORMAL); } - server_unzoom_window(w); + if (!window_pane_is_floating(wp)) + server_unzoom_window(w); lc = wp->layout_cell; /* may have been replaced by unzoom */ if (args_has(args, 'x')) { diff --git a/tmux.h b/tmux.h index ce7afe95d..e9dffc814 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.1439 2026/09/10 11:02:18 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.1443 2026/09/21 10:33:16 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -3833,6 +3833,7 @@ int window_pane_get_pane_status(struct window_pane *); struct style_range *window_pane_status_get_range(struct window_pane *, u_int, u_int); int window_pane_is_floating(struct window_pane *); +int window_pane_is_floating_with_hidden(struct window_pane *); /* window-border.c */ void window_set_fill_cells(struct window *); diff --git a/window.c b/window.c index bf6346788..bb0bd6756 100644 --- a/window.c +++ b/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.375 2026/09/20 07:35:06 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.377 2026/09/21 10:33:16 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -2914,3 +2914,15 @@ window_pane_is_floating(struct window_pane *wp) return (0); return (1); } + +int +window_pane_is_floating_with_hidden(struct window_pane *wp) +{ + struct layout_cell *lc = wp->layout_cell; + + if (lc == NULL) + lc = wp->saved_layout_cell; + if (lc == NULL || (lc->flags & LAYOUT_CELL_FLOATING) == 0) + return (0); + return (1); +}