From 55db3623bf7084a161d457f0c0b891a46a444a77 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 22 Aug 2018 20:06:14 +0000 Subject: [PATCH] Add StatusLeft and StatusRight mouse key modifiers for the left and right parts of the status line. --- key-string.c | 4 ++ server-client.c | 100 +++++++++++++++++++++++++++++++++++++++++++----- status.c | 4 ++ tmux.1 | 5 ++- tmux.h | 19 ++++++--- 5 files changed, 116 insertions(+), 16 deletions(-) diff --git a/key-string.c b/key-string.c index 45073efd..bb49b59f 100644 --- a/key-string.c +++ b/key-string.c @@ -271,6 +271,10 @@ key_string_lookup_key(key_code key) return ("MouseMovePane"); if (key == KEYC_MOUSEMOVE_STATUS) return ("MouseMoveStatus"); + if (key == KEYC_MOUSEMOVE_STATUS_LEFT) + return ("MouseMoveStatusLeft"); + if (key == KEYC_MOUSEMOVE_STATUS_RIGHT) + return ("MouseMoveStatusRight"); if (key == KEYC_MOUSEMOVE_BORDER) return ("MouseMoveBorder"); if (key >= KEYC_USER && key < KEYC_USER + KEYC_NUSER) { diff --git a/server-client.c b/server-client.c index 418af648..596b12e7 100644 --- a/server-client.c +++ b/server-client.c @@ -416,7 +416,7 @@ server_client_check_mouse(struct client *c) key_code key; struct timeval tv; enum { NOTYPE, MOVE, DOWN, UP, DRAG, WHEEL, DOUBLE, TRIPLE } type; - enum { NOWHERE, PANE, STATUS, BORDER } where; + enum { NOWHERE, PANE, STATUS, STATUS_LEFT, STATUS_RIGHT, BORDER } where; type = NOTYPE; where = NOWHERE; @@ -495,19 +495,25 @@ have_event: if (type == NOTYPE) return (KEYC_UNKNOWN); - /* Always save the session. */ + /* Save the session. */ m->s = s->id; + m->w = -1; /* Is this on the status line? */ m->statusat = status_at_line(c); if (m->statusat != -1 && y == (u_int)m->statusat) { - w = status_get_window_at(c, x); - if (w == NULL) - return (KEYC_UNKNOWN); - m->w = w->id; - where = STATUS; - } else - m->w = -1; + if (x < c->status.left_size) + where = STATUS_LEFT; + else if (x > c->tty.sx - c->status.right_size) + where = STATUS_RIGHT; + else { + w = status_get_window_at(c, x); + if (w == NULL) + return (KEYC_UNKNOWN); + m->w = w->id; + where = STATUS; + } + } /* Not on status line. Adjust position and check for border or pane. */ if (where == NOWHERE) { @@ -560,6 +566,10 @@ have_event: key = KEYC_MOUSEDRAGEND1_PANE; if (where == STATUS) key = KEYC_MOUSEDRAGEND1_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDRAGEND1_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDRAGEND1_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDRAGEND1_BORDER; break; @@ -568,6 +578,10 @@ have_event: key = KEYC_MOUSEDRAGEND2_PANE; if (where == STATUS) key = KEYC_MOUSEDRAGEND2_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDRAGEND2_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDRAGEND2_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDRAGEND2_BORDER; break; @@ -576,6 +590,10 @@ have_event: key = KEYC_MOUSEDRAGEND3_PANE; if (where == STATUS) key = KEYC_MOUSEDRAGEND3_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDRAGEND3_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDRAGEND3_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDRAGEND3_BORDER; break; @@ -611,6 +629,10 @@ have_event: key = KEYC_MOUSEDRAG1_PANE; if (where == STATUS) key = KEYC_MOUSEDRAG1_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDRAG1_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDRAG1_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDRAG1_BORDER; break; @@ -619,6 +641,10 @@ have_event: key = KEYC_MOUSEDRAG2_PANE; if (where == STATUS) key = KEYC_MOUSEDRAG2_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDRAG2_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDRAG2_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDRAG2_BORDER; break; @@ -627,6 +653,10 @@ have_event: key = KEYC_MOUSEDRAG3_PANE; if (where == STATUS) key = KEYC_MOUSEDRAG3_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDRAG3_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDRAG3_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDRAG3_BORDER; break; @@ -645,6 +675,10 @@ have_event: key = KEYC_WHEELUP_PANE; if (where == STATUS) key = KEYC_WHEELUP_STATUS; + if (where == STATUS_LEFT) + key = KEYC_WHEELUP_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_WHEELUP_STATUS_RIGHT; if (where == BORDER) key = KEYC_WHEELUP_BORDER; } else { @@ -663,6 +697,10 @@ have_event: key = KEYC_MOUSEUP1_PANE; if (where == STATUS) key = KEYC_MOUSEUP1_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEUP1_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEUP1_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEUP1_BORDER; break; @@ -671,6 +709,10 @@ have_event: key = KEYC_MOUSEUP2_PANE; if (where == STATUS) key = KEYC_MOUSEUP2_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEUP2_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEUP2_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEUP2_BORDER; break; @@ -679,6 +721,10 @@ have_event: key = KEYC_MOUSEUP3_PANE; if (where == STATUS) key = KEYC_MOUSEUP3_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEUP3_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEUP3_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEUP3_BORDER; break; @@ -691,6 +737,10 @@ have_event: key = KEYC_MOUSEDOWN1_PANE; if (where == STATUS) key = KEYC_MOUSEDOWN1_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDOWN1_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDOWN1_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDOWN1_BORDER; break; @@ -699,6 +749,10 @@ have_event: key = KEYC_MOUSEDOWN2_PANE; if (where == STATUS) key = KEYC_MOUSEDOWN2_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDOWN2_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDOWN2_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDOWN2_BORDER; break; @@ -707,6 +761,10 @@ have_event: key = KEYC_MOUSEDOWN3_PANE; if (where == STATUS) key = KEYC_MOUSEDOWN3_STATUS; + if (where == STATUS_LEFT) + key = KEYC_MOUSEDOWN3_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_MOUSEDOWN3_STATUS_RIGHT; if (where == BORDER) key = KEYC_MOUSEDOWN3_BORDER; break; @@ -719,6 +777,10 @@ have_event: key = KEYC_DOUBLECLICK1_PANE; if (where == STATUS) key = KEYC_DOUBLECLICK1_STATUS; + if (where == STATUS_LEFT) + key = KEYC_DOUBLECLICK1_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_DOUBLECLICK1_STATUS_RIGHT; if (where == BORDER) key = KEYC_DOUBLECLICK1_BORDER; break; @@ -727,6 +789,10 @@ have_event: key = KEYC_DOUBLECLICK2_PANE; if (where == STATUS) key = KEYC_DOUBLECLICK2_STATUS; + if (where == STATUS_LEFT) + key = KEYC_DOUBLECLICK2_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_DOUBLECLICK2_STATUS_RIGHT; if (where == BORDER) key = KEYC_DOUBLECLICK2_BORDER; break; @@ -735,6 +801,10 @@ have_event: key = KEYC_DOUBLECLICK3_PANE; if (where == STATUS) key = KEYC_DOUBLECLICK3_STATUS; + if (where == STATUS_LEFT) + key = KEYC_DOUBLECLICK3_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_DOUBLECLICK3_STATUS_RIGHT; if (where == BORDER) key = KEYC_DOUBLECLICK3_BORDER; break; @@ -747,6 +817,10 @@ have_event: key = KEYC_TRIPLECLICK1_PANE; if (where == STATUS) key = KEYC_TRIPLECLICK1_STATUS; + if (where == STATUS_LEFT) + key = KEYC_TRIPLECLICK1_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_TRIPLECLICK1_STATUS_RIGHT; if (where == BORDER) key = KEYC_TRIPLECLICK1_BORDER; break; @@ -755,6 +829,10 @@ have_event: key = KEYC_TRIPLECLICK2_PANE; if (where == STATUS) key = KEYC_TRIPLECLICK2_STATUS; + if (where == STATUS_LEFT) + key = KEYC_TRIPLECLICK2_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_TRIPLECLICK2_STATUS_RIGHT; if (where == BORDER) key = KEYC_TRIPLECLICK2_BORDER; break; @@ -763,6 +841,10 @@ have_event: key = KEYC_TRIPLECLICK3_PANE; if (where == STATUS) key = KEYC_TRIPLECLICK3_STATUS; + if (where == STATUS_LEFT) + key = KEYC_TRIPLECLICK3_STATUS_LEFT; + if (where == STATUS_RIGHT) + key = KEYC_TRIPLECLICK3_STATUS_RIGHT; if (where == BORDER) key = KEYC_TRIPLECLICK3_BORDER; break; diff --git a/status.c b/status.c index 63bd47a4..a2c28d45 100644 --- a/status.c +++ b/status.c @@ -511,6 +511,10 @@ draw: screen_write_fast_copy(&ctx, &window_list, wlstart, 0, wlwidth, 1); screen_free(&window_list); + /* Save left and right size. */ + c->status.left_size = llen; + c->status.right_size = rlen; + screen_write_stop(&ctx); out: diff --git a/tmux.1 b/tmux.1 index c6c6b3fa..f84f1282 100644 --- a/tmux.1 +++ b/tmux.1 @@ -3504,7 +3504,10 @@ and a location suffix (one of for the contents of a pane, .Ql Border for a pane border or -.Ql Status +.Ql Status , +.Ql StatusLeft , +or +.Ql StatusRight for the status line). The following mouse events are available: .Bl -column "MouseDown1" "MouseDrag1" "WheelDown" -offset indent diff --git a/tmux.h b/tmux.h index 3a45dd08..62170215 100644 --- a/tmux.h +++ b/tmux.h @@ -116,13 +116,17 @@ struct tmuxproc; #define KEYC_CLICK_TIMEOUT 300 /* Mouse key codes. */ -#define KEYC_MOUSE_KEY(name) \ - KEYC_ ## name ## _PANE, \ - KEYC_ ## name ## _STATUS, \ +#define KEYC_MOUSE_KEY(name) \ + KEYC_ ## name ## _PANE, \ + KEYC_ ## name ## _STATUS, \ + KEYC_ ## name ## _STATUS_LEFT, \ + KEYC_ ## name ## _STATUS_RIGHT, \ KEYC_ ## name ## _BORDER -#define KEYC_MOUSE_STRING(name, s) \ - { #s "Pane", KEYC_ ## name ## _PANE }, \ - { #s "Status", KEYC_ ## name ## _STATUS }, \ +#define KEYC_MOUSE_STRING(name, s) \ + { #s "Pane", KEYC_ ## name ## _PANE }, \ + { #s "Status", KEYC_ ## name ## _STATUS }, \ + { #s "StatusLeft", KEYC_ ## name ## _STATUS_LEFT }, \ + { #s "StatusRight", KEYC_ ## name ## _STATUS_RIGHT }, \ { #s "Border", KEYC_ ## name ## _BORDER } /* @@ -1283,6 +1287,9 @@ struct status_line { struct screen *old_status; int window_list_offset; + + u_int left_size; + u_int right_size; }; /* Client connection. */