From a8e46e1c37e1d163d3d5316251f983e4f3f06489 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 26 Oct 2015 23:16:18 +0000 Subject: [PATCH] If a mouse event has no key binding, pass it through to the pane it happened in, not the active pane like normal key presses. Fixes problems seen by Enrico Ghirardi. --- usr.bin/tmux/server-client.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index 67028ee10b7..a5c1fd662a5 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.160 2015/10/26 17:17:06 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.161 2015/10/26 23:16:18 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -551,7 +551,6 @@ server_client_handle_key(struct client *c, int key) if (s == NULL || (c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0) return; w = s->curw->window; - wp = w->active; /* Update the activity timer. */ if (gettimeofday(&c->activity_time, NULL) != 0) @@ -592,19 +591,14 @@ server_client_handle_key(struct client *c, int key) m->valid = 1; m->key = key; - if (!options_get_number(&s->options, "mouse")) { - window_pane_key(wp, c, s, key, m); - return; - } + if (!options_get_number(&s->options, "mouse")) + goto forward; } else m->valid = 0; /* Treat everything as a regular key when pasting is detected. */ - if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s)) { - if (!(c->flags & CLIENT_READONLY)) - window_pane_key(wp, c, s, key, m); - return; - } + if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s)) + goto forward; retry: /* Try to see if there is a key binding in the current table. */ @@ -680,7 +674,17 @@ retry: key == options_get_number(&s->options, "prefix2")) { server_client_key_table(c, "prefix"); server_status_client(c); - } else if (!(c->flags & CLIENT_READONLY)) + return; + } + +forward: + if (c->flags & CLIENT_READONLY) + return; + if (KEYC_IS_MOUSE(key)) + wp = cmd_mouse_pane(m, NULL, NULL); + else + wp = w->active; + if (wp != NULL) window_pane_key(wp, c, s, key, m); } -- 2.20.1