From fd10db5a6212a1db54a7762b099d1cc17f2062e7 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 8 Jun 2026 23:06:21 +0000 Subject: [PATCH] Fix mouse events on tiled pane status line - when panes share a border, prefer the pane for which the border is the status line. With Dane Jensen. --- server-client.c | 8 ++------ window.c | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/server-client.c b/server-client.c index a819e6f9..280e9afa 100644 --- a/server-client.c +++ b/server-client.c @@ -699,12 +699,8 @@ server_client_check_mouse_in_pane(struct window_pane *wp, int px, int py, bdr_bottom = fwp->yoff + fwp->sy; if (py == bdr_bottom) break; - if (window_pane_is_floating(wp)) { - /* Floating pane, check top border. */ - bdr_top = fwp->yoff - 1; - if (py == bdr_top) - break; - } + if (py == bdr_top) + break; } } if (fwp != NULL) diff --git a/window.c b/window.c index ddd1d6f0..10adaa45 100644 --- a/window.c +++ b/window.c @@ -621,12 +621,32 @@ window_get_active_at(struct window *w, u_int x, u_int y) pane_status = options_get_number(w->options, "pane-border-status"); + if (pane_status == PANE_STATUS_TOP) { + /* + * Prefer a pane's top border status line over the pane above's + * bottom border. + */ + TAILQ_FOREACH(wp, &w->z_index, zentry) { + if (!window_pane_visible(wp) || window_pane_is_floating(wp)) + continue; + + window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy); + if ((int)x < xoff || x > xoff + sx) + continue; + if ((int)y == yoff - 1) + return (wp); + } + } + TAILQ_FOREACH(wp, &w->z_index, zentry) { if (!window_pane_visible(wp)) continue; window_pane_full_size_offset(wp, &xoff, &yoff, &sx, &sy); if (!window_pane_is_floating(wp)) { - /* Tiled - to and including bottom or right border. */ + /* + * Tiled - to and including the right border, excluding + * the bottom border. + */ if ((int)x < xoff || x > xoff + sx) continue; if (pane_status == PANE_STATUS_TOP) {