Do not allow drags started on status line to trigger pane key bindings,

GitHub issue 5692.
This commit is contained in:
nicm
2026-10-06 10:55:55 +00:00
committed by tmux update bot
parent 50160131a8
commit b4f7b85e86
2 changed files with 21 additions and 6 deletions

View File

@@ -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 <nicholas.marriott@gmail.com> * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -796,9 +796,14 @@ server_client_check_mouse(struct client *c, struct key_event *event)
x = m->x, y = m->y, b = m->b; x = m->x, y = m->y, b = m->b;
if (x == m->lx && y == m->ly) if (x == m->lx && y == m->ly)
return (KEYC_UNKNOWN); 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); log_debug("drag update at %u,%u", x, y);
} else { } else {
x = m->lx, y = m->ly, b = m->lb; x = m->lx, y = m->ly, b = m->lb;
c->tty.mouse_drag_status = 0;
log_debug("drag start at %u,%u", x, y); log_debug("drag start at %u,%u", x, y);
} }
} else if (MOUSE_WHEEL(m->b)) { } else if (MOUSE_WHEEL(m->b)) {
@@ -856,6 +861,8 @@ have_event:
if (m->statusat != -1 && if (m->statusat != -1 &&
y >= (u_int)m->statusat && y >= (u_int)m->statusat &&
y < m->statusat + m->statuslines) { 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); sr = status_get_range(c, x, y - m->statusat);
if (sr == NULL) { if (sr == NULL) {
loc = KEYC_MOUSE_LOCATION_STATUS_DEFAULT; loc = KEYC_MOUSE_LOCATION_STATUS_DEFAULT;
@@ -1087,17 +1094,24 @@ have_event:
* where the user grabbed. * where the user grabbed.
*/ */
if (c->tty.mouse_drag_flag == 0) { if (c->tty.mouse_drag_flag == 0) {
c->tty.mouse_drag_x = px; if (c->tty.mouse_drag_status) {
c->tty.mouse_drag_y = py; 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; c->tty.mouse_drag_flag = MOUSE_BUTTONS(b) + 1;
/* Only change pane if not already dragging a pane border. */ /* Change the pane if the drag did not start on status line. */
if (lwp == NULL) { if (!c->tty.mouse_drag_status && lwp == NULL) {
lwp = wp = window_get_active_at(w, px, py); lwp = wp = window_get_active_at(w, px, py);
if (wp != NULL) if (wp != NULL)
c->tty.mouse_last_pane = wp->id; c->tty.mouse_last_pane = wp->id;
} }
/* Change scrollbar position if needed. */
if (c->tty.mouse_scrolling_flag == 0 && if (c->tty.mouse_scrolling_flag == 0 &&
loc == KEYC_MOUSE_LOCATION_SCROLLBAR_SLIDER) { loc == KEYC_MOUSE_LOCATION_SCROLLBAR_SLIDER) {
c->tty.mouse_scrolling_flag = 1; c->tty.mouse_scrolling_flag = 1;

3
tmux.h
View File

@@ -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 <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1807,6 +1807,7 @@ struct tty {
u_int mouse_last_y; u_int mouse_last_y;
u_int mouse_last_b; u_int mouse_last_b;
int mouse_drag_flag; int mouse_drag_flag;
int mouse_drag_status;
u_int mouse_drag_x; u_int mouse_drag_x;
u_int mouse_drag_y; u_int mouse_drag_y;
int mouse_scrolling_flag; int mouse_scrolling_flag;