aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--key-string.c4
-rw-r--r--server-client.c100
-rw-r--r--status.c4
-rw-r--r--tmux.15
-rw-r--r--tmux.h19
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. */