If a mouse event has no key binding, pass it through to the pane it
authornicm <nicm@openbsd.org>
Mon, 26 Oct 2015 23:16:18 +0000 (23:16 +0000)
committernicm <nicm@openbsd.org>
Mon, 26 Oct 2015 23:16:18 +0000 (23:16 +0000)
happened in, not the active pane like normal key presses. Fixes problems
seen by Enrico Ghirardi.

usr.bin/tmux/server-client.c

index 67028ee..a5c1fd6 100644 (file)
@@ -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 <nicm@users.sourceforge.net>
@@ -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);
 }