From b4f7b85e864894d562b7a8c631555f441a696bc2 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 6 Oct 2026 10:55:55 +0000 Subject: [PATCH 1/2] Do not allow drags started on status line to trigger pane key bindings, GitHub issue 5692. --- server-client.c | 24 +++++++++++++++++++----- tmux.h | 3 ++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/server-client.c b/server-client.c index c57bf2651..62b2bdb02 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.517 2026/10/02 12:48:52 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.518 2026/10/06 10:55:55 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -796,9 +796,14 @@ server_client_check_mouse(struct client *c, struct key_event *event) x = m->x, y = m->y, b = m->b; if (x == m->lx && y == m->ly) return (KEYC_UNKNOWN); + if (c->tty.mouse_drag_status) { + x = c->tty.mouse_drag_x; + y = c->tty.mouse_drag_y; + } log_debug("drag update at %u,%u", x, y); } else { x = m->lx, y = m->ly, b = m->lb; + c->tty.mouse_drag_status = 0; log_debug("drag start at %u,%u", x, y); } } else if (MOUSE_WHEEL(m->b)) { @@ -856,6 +861,8 @@ have_event: if (m->statusat != -1 && y >= (u_int)m->statusat && y < m->statusat + m->statuslines) { + if (type == KEYC_TYPE_MOUSEDRAG && c->tty.mouse_drag_flag == 0) + c->tty.mouse_drag_status = 1; sr = status_get_range(c, x, y - m->statusat); if (sr == NULL) { loc = KEYC_MOUSE_LOCATION_STATUS_DEFAULT; @@ -1087,17 +1094,24 @@ have_event: * where the user grabbed. */ if (c->tty.mouse_drag_flag == 0) { - c->tty.mouse_drag_x = px; - c->tty.mouse_drag_y = py; + if (c->tty.mouse_drag_status) { + c->tty.mouse_drag_x = x; + c->tty.mouse_drag_y = y; + } else { + c->tty.mouse_drag_x = px; + c->tty.mouse_drag_y = py; + } } c->tty.mouse_drag_flag = MOUSE_BUTTONS(b) + 1; - /* Only change pane if not already dragging a pane border. */ - if (lwp == NULL) { + /* Change the pane if the drag did not start on status line. */ + if (!c->tty.mouse_drag_status && lwp == NULL) { lwp = wp = window_get_active_at(w, px, py); if (wp != NULL) c->tty.mouse_last_pane = wp->id; } + + /* Change scrollbar position if needed. */ if (c->tty.mouse_scrolling_flag == 0 && loc == KEYC_MOUSE_LOCATION_SCROLLBAR_SLIDER) { c->tty.mouse_scrolling_flag = 1; diff --git a/tmux.h b/tmux.h index fe49d66d4..66a671f63 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.1451 2026/10/02 12:48:52 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.1452 2026/10/06 10:55:55 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1807,6 +1807,7 @@ struct tty { u_int mouse_last_y; u_int mouse_last_b; int mouse_drag_flag; + int mouse_drag_status; u_int mouse_drag_x; u_int mouse_drag_y; int mouse_scrolling_flag; From e21f5e2d63df587a9ab0e886127e4a4450ab732c Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 6 Oct 2026 11:30:31 +0000 Subject: [PATCH 2/2] Add table for destroy-unattached. --- tmux.1 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tmux.1 b/tmux.1 index c94737f6c..255044394 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.1175 2026/10/06 08:01:54 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.1176 2026/10/06 11:30:31 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -5283,6 +5283,13 @@ If .Ic keep\-group , destroy the session unless it is in a group and is the only session in that group. +A session without attached clients is destroyed or kept as follows: +.Bl -column "in group, NOT last" "keep" "destroy" "keep\-last" "keep\-group" +.It Sy "Session" Ta Sy "off" Ta Sy "on" Ta Sy "keep\-last" Ta Sy "keep\-group" +.It Li "NOT in group" Ta keep Ta destroy Ta keep Ta destroy +.It Li "in group, NOT last" Ta keep Ta destroy Ta destroy Ta destroy +.It Li "last in group" Ta keep Ta destroy Ta keep Ta keep +.El .It Xo Ic detach\-on\-destroy .Op Ic off | on | no\-detached | previous | next .Xc