=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/server-client.c,v retrieving revision 1.208 retrieving revision 1.209 diff -u -r1.208 -r1.209 --- src/usr.bin/tmux/server-client.c 2017/01/13 11:56:43 1.208 +++ src/usr.bin/tmux/server-client.c 2017/02/01 09:55:07 1.209 @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.208 2017/01/13 11:56:43 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.209 2017/02/01 09:55:07 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -335,14 +335,27 @@ int flag; key_code key; struct timeval tv; - enum { NOTYPE, DOWN, UP, DRAG, WHEEL, DOUBLE, TRIPLE } type = NOTYPE; - enum { NOWHERE, PANE, STATUS, BORDER } where = NOWHERE; + enum { NOTYPE, MOVE, DOWN, UP, DRAG, WHEEL, DOUBLE, TRIPLE } type; + enum { NOWHERE, PANE, STATUS, BORDER } where; + type = NOTYPE; + where = NOWHERE; + log_debug("mouse %02x at %u,%u (last %u,%u) (%d)", m->b, m->x, m->y, m->lx, m->ly, c->tty.mouse_drag_flag); /* What type of event is this? */ - if (MOUSE_DRAG(m->b)) { + if ((m->sgr_type != ' ' && + MOUSE_DRAG(m->sgr_b) && + MOUSE_BUTTONS(m->sgr_b) == 3) || + (m->sgr_type == ' ' && + MOUSE_DRAG(m->b) && + MOUSE_BUTTONS(m->b) == 3 && + MOUSE_BUTTONS(m->lb) == 3)) { + type = MOVE; + x = m->x, y = m->y, b = 0; + log_debug("move at %u,%u", x, y); + } else if (MOUSE_DRAG(m->b)) { type = DRAG; if (c->tty.mouse_drag_flag) { x = m->x, y = m->y, b = m->b; @@ -500,6 +513,14 @@ switch (type) { case NOTYPE: break; + case MOVE: + if (where == PANE) + key = KEYC_MOUSEMOVE_PANE; + if (where == STATUS) + key = KEYC_MOUSEMOVE_STATUS; + if (where == BORDER) + key = KEYC_MOUSEMOVE_BORDER; + break; case DRAG: if (c->tty.mouse_drag_update != NULL) key = KEYC_DRAGGING; @@ -1055,7 +1076,7 @@ server_client_reset_state(struct client *c) { struct window *w = c->session->curw->window; - struct window_pane *wp = w->active; + struct window_pane *wp = w->active, *loop; struct screen *s = wp->screen; struct options *oo = c->session->options; int status, mode, o; @@ -1079,8 +1100,15 @@ * mode. */ mode = s->mode; - if (options_get_number(oo, "mouse")) - mode = (mode & ~ALL_MOUSE_MODES) | MODE_MOUSE_BUTTON; + if (options_get_number(oo, "mouse")) { + mode &= ~ALL_MOUSE_MODES; + TAILQ_FOREACH(loop, &w->panes, entry) { + if (loop->screen->mode & MODE_MOUSE_ALL) + mode |= MODE_MOUSE_ALL; + } + if (~mode & MODE_MOUSE_ALL) + mode |= MODE_MOUSE_BUTTON; + } /* Set the terminal mode and reset attributes. */ tty_update_mode(&c->tty, mode, s);