diff options
Diffstat (limited to 'server-client.c')
-rw-r--r-- | server-client.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/server-client.c b/server-client.c index fe79163f..eee5dff5 100644 --- a/server-client.c +++ b/server-client.c @@ -411,12 +411,13 @@ server_client_check_mouse(struct client *c) { struct session *s = c->session; struct mouse_event *m = &c->tty.mouse; - struct window *w; + struct winlink *wl; struct window_pane *wp; u_int x, y, b, sx, sy, px, py; int flag; key_code key; struct timeval tv; + struct style_range *sr; enum { NOTYPE, MOVE, DOWN, UP, DRAG, WHEEL, DOUBLE, TRIPLE } type; enum { NOWHERE, PANE, STATUS, STATUS_LEFT, STATUS_RIGHT, BORDER } where; @@ -503,17 +504,29 @@ have_event: /* Is this on the status line? */ m->statusat = status_at_line(c); - if (m->statusat != -1 && y == (u_int)m->statusat) { - if (x < c->status.left_size) + if (m->statusat != -1 && + y >= (u_int)m->statusat && + y < m->statusat + status_line_size(c)) + sr = status_get_range(c, x, y - m->statusat); + else + sr = NULL; + if (sr != NULL) { + switch (sr->type) { + case STYLE_RANGE_NONE: + break; + case STYLE_RANGE_LEFT: where = STATUS_LEFT; - else if (x > c->tty.sx - c->status.right_size) + break; + case STYLE_RANGE_RIGHT: where = STATUS_RIGHT; - else { - w = status_get_window_at(c, x); - if (w == NULL) - return (KEYC_UNKNOWN); - m->w = w->id; - where = STATUS; + break; + case STYLE_RANGE_WINDOW: + wl = winlink_find_by_index(&s->windows, sr->argument); + if (wl != NULL) { + m->w = wl->window->id; + where = STATUS; + } + break; } } |