From 7463aafd2095ad0c7acff134fb5a2ec97853f766 Mon Sep 17 00:00:00 2001 From: Michael Grant Date: Mon, 8 Jun 2026 18:56:32 +0200 Subject: [PATCH] Add new -h arg to choose-tree and choose-client to hide current pane from preview. --- cmd-choose-tree.c | 8 ++++---- window-client.c | 14 ++++++++++++-- window-tree.c | 16 +++++++++++++++- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c index 186672f4..5478050b 100644 --- a/cmd-choose-tree.c +++ b/cmd-choose-tree.c @@ -33,8 +33,8 @@ const struct cmd_entry cmd_choose_tree_entry = { .name = "choose-tree", .alias = NULL, - .args = { "F:f:GK:NO:rst:wyZ", 0, 1, cmd_choose_tree_args_parse }, - .usage = "[-GNrswZ] [-F format] [-f filter] [-K key-format] " + .args = { "F:f:GhK:NO:rst:wyZ", 0, 1, cmd_choose_tree_args_parse }, + .usage = "[-GhNrswZ] [-F format] [-f filter] [-K key-format] " "[-O sort-order] " CMD_TARGET_PANE_USAGE " [template]", .target = { 't', CMD_FIND_PANE, 0 }, @@ -47,8 +47,8 @@ const struct cmd_entry cmd_choose_client_entry = { .name = "choose-client", .alias = NULL, - .args = { "F:f:K:NO:rt:yZ", 0, 1, cmd_choose_tree_args_parse }, - .usage = "[-NrZ] [-F format] [-f filter] [-K key-format] " + .args = { "F:f:hK:NO:rt:yZ", 0, 1, cmd_choose_tree_args_parse }, + .usage = "[-hNrZ] [-F format] [-f filter] [-K key-format] " "[-O sort-order] " CMD_TARGET_PANE_USAGE " [template]", .target = { 't', CMD_FIND_PANE, 0 }, diff --git a/window-client.c b/window-client.c index be1fd5fa..6f1123bf 100644 --- a/window-client.c +++ b/window-client.c @@ -77,6 +77,7 @@ struct window_client_itemdata { struct window_client_modedata { struct window_pane *wp; + int hide_preview_this_pane; struct mode_tree_data *data; char *format; @@ -162,9 +163,10 @@ window_client_build(void *modedata, struct sort_criteria *sort_crit, } static void -window_client_draw(__unused void *modedata, void *itemdata, +window_client_draw(void *modedata, void *itemdata, struct screen_write_ctx *ctx, u_int sx, u_int sy) { + struct window_client_modedata *data = modedata; struct window_client_itemdata *item = itemdata; struct client *c = item->c; struct screen *s = ctx->s; @@ -174,6 +176,12 @@ window_client_draw(__unused void *modedata, void *itemdata, if (c->session == NULL || (c->flags & CLIENT_UNATTACHEDFLAGS)) return; wp = c->session->curw->window->active; + if (data->hide_preview_this_pane && wp == data->wp) { + if (!TAILQ_EMPTY(&c->session->curw->window->last_panes)) + wp = TAILQ_FIRST(&c->session->curw->window->last_panes); + else + wp = NULL; + } lines = status_line_size(c); if (lines >= sy) @@ -184,7 +192,8 @@ window_client_draw(__unused void *modedata, void *itemdata, at = 0; screen_write_cursormove(ctx, cx, cy + at, 0); - screen_write_preview(ctx, &wp->base, sx, sy - 2 - lines); + if (wp != NULL) + screen_write_preview(ctx, &wp->base, sx, sy - 2 - lines); if (at != 0) screen_write_cursormove(ctx, cx, cy + 2, 0); @@ -270,6 +279,7 @@ window_client_init(struct window_mode_entry *wme, wme->data = data = xcalloc(1, sizeof *data); data->wp = wp; + data->hide_preview_this_pane = args != NULL && args_has(args, 'h'); if (args == NULL || !args_has(args, 'F')) data->format = xstrdup(WINDOW_CLIENT_DEFAULT_FORMAT); diff --git a/window-tree.c b/window-tree.c index 3508ddb8..2e97194a 100644 --- a/window-tree.c +++ b/window-tree.c @@ -107,6 +107,7 @@ struct window_tree_modedata { struct window_pane *wp; int dead; int references; + int hide_preview_this_pane; struct mode_tree_data *data; char *format; @@ -289,6 +290,8 @@ window_tree_build_window(struct session *s, struct winlink *wl, if (n == 0) goto empty; for (i = 0; i < n; i++) { + if (data->hide_preview_this_pane && l[i] == data->wp) + continue; if (window_tree_filter_pane(s, wl, l[i], filter)) window_tree_build_pane(s, wl, l[i], modedata, mti); } @@ -580,6 +583,10 @@ window_tree_draw_window(struct window_tree_modedata *data, struct session *s, struct options *oo; total = window_count_panes(w, 1); + if (data->hide_preview_this_pane && data->wp->window == w) + total--; + if (total == 0) + return; if (sx / total < 24) { visible = sx / 24; @@ -590,6 +597,8 @@ window_tree_draw_window(struct window_tree_modedata *data, struct session *s, current = 0; TAILQ_FOREACH(wp, &w->panes, entry) { + if (data->hide_preview_this_pane && wp == data->wp) + continue; if (wp == w->active) break; current++; @@ -653,6 +662,8 @@ window_tree_draw_window(struct window_tree_modedata *data, struct session *s, i = loop = 0; TAILQ_FOREACH(wp, &w->panes, entry) { + if (data->hide_preview_this_pane && wp == data->wp) + continue; if (loop == end) break; if (loop < start) { @@ -704,6 +715,7 @@ static void window_tree_draw(void *modedata, void *itemdata, struct screen_write_ctx *ctx, u_int sx, u_int sy) { + struct window_tree_modedata *data = modedata; struct window_tree_itemdata *item = itemdata; struct session *sp; struct winlink *wl; @@ -723,7 +735,8 @@ window_tree_draw(void *modedata, void *itemdata, struct screen_write_ctx *ctx, window_tree_draw_window(modedata, sp, wl, ctx, sx, sy); break; case WINDOW_TREE_PANE: - screen_write_preview(ctx, &wp->base, sx, sy); + if (!data->hide_preview_this_pane || wp != data->wp) + screen_write_preview(ctx, &wp->base, sx, sy); break; } } @@ -932,6 +945,7 @@ window_tree_init(struct window_mode_entry *wme, struct cmd_find_state *fs, else data->command = xstrdup(args_string(args, 0)); data->squash_groups = !args_has(args, 'G'); + data->hide_preview_this_pane = args_has(args, 'h'); if (args_has(args, 'y')) data->prompt_flags = PROMPT_ACCEPT;