diff --git a/input-keys.c b/input-keys.c index d18c4041..f799f09f 100644 --- a/input-keys.c +++ b/input-keys.c @@ -1,4 +1,4 @@ -/* $Id: input-keys.c,v 1.48 2011-01-07 14:34:45 tcunha Exp $ */ +/* $Id: input-keys.c,v 1.49 2011-04-25 20:33:42 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -219,5 +219,12 @@ input_mouse(struct window_pane *wp, struct mouse_event *m) buf[len++] = m->y + 33; } bufferevent_write(wp->event, buf, len); + } else if ((m->b & MOUSE_BUTTON) != MOUSE_2) { + if (options_get_number(&wp->window->options, "mode-mouse") && + window_pane_set_mode(wp, &window_copy_mode) == 0) { + window_copy_init_from_pane(wp); + if (wp->mode->mouse != NULL) + wp->mode->mouse(wp, NULL, m); + } } } diff --git a/server-client.c b/server-client.c index f29dd314..1e567152 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $Id: server-client.c,v 1.56 2011-04-18 21:07:58 nicm Exp $ */ +/* $Id: server-client.c,v 1.57 2011-04-25 20:33:42 tcunha Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -313,7 +313,13 @@ server_client_handle_key(int key, struct mouse_event *mouse, void *data) if (key == KEYC_MOUSE) { if (c->flags & CLIENT_READONLY) return; - if (options_get_number(oo, "mouse-select-pane")) { + if (options_get_number(oo, "mouse-select-pane") && + ((!(mouse->b & MOUSE_DRAG) && mouse->b != MOUSE_UP) || + wp->mode != &window_copy_mode)) { + /* + * Allow pane switching in copy mode only by mouse down + * (click). + */ window_set_active_at(w, mouse->x, mouse->y); server_redraw_window_borders(w); wp = w->active; @@ -444,6 +450,7 @@ server_client_reset_state(struct client *c) struct window_pane *wp = w->active; struct screen *s = wp->screen; struct options *oo = &c->session->options; + struct options *wo = &w->options; int status, mode; tty_region(&c->tty, 0, c->tty.sy - 1); @@ -459,14 +466,15 @@ server_client_reset_state(struct client *c) * none. */ mode = s->mode; - if (TAILQ_NEXT(TAILQ_FIRST(&w->panes), entry) != NULL && - options_get_number(oo, "mouse-select-pane") && - (mode & ALL_MOUSE_MODES) == 0) - mode |= MODE_MOUSE_STANDARD; - - if (options_get_number(oo, "mouse-select-window") && - (mode & ALL_MOUSE_MODES) == 0) - mode |= MODE_MOUSE_STANDARD; + if ((mode & ALL_MOUSE_MODES) == 0) { + if (TAILQ_NEXT(TAILQ_FIRST(&w->panes), entry) != NULL && + options_get_number(oo, "mouse-select-pane") == 0) + mode |= MODE_MOUSE_STANDARD; + else if (options_get_number(oo, "mouse-select-window")) + mode |= MODE_MOUSE_STANDARD; + else if (options_get_number(wo, "mode-mouse")) + mode |= MODE_MOUSE_STANDARD; + } /* * Set UTF-8 mouse input if required. If the terminal is UTF-8, the diff --git a/tmux.1 b/tmux.1 index e5f2af56..e353beb4 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $Id: tmux.1,v 1.308 2011-04-18 21:07:58 nicm Exp $ +.\" $Id: tmux.1,v 1.309 2011-04-25 20:33:42 tcunha Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: April 18 2011 $ +.Dd $Mdocdate: April 19 2011 $ .Dt TMUX 1 .Os .Sh NAME @@ -2314,8 +2314,9 @@ contains .Op Ic on | off .Xc Mouse state in modes. -If on, the mouse may be used to copy a selection by dragging in copy mode, or -to select an option in choice mode. +If on, the mouse may be used to enter copy mode and copy a selection by +dragging, to enter copy mode and scroll with the mouse wheel, or to select an +option in choice mode. .Pp .It Xo Ic monitor-activity .Op Ic on | off diff --git a/tmux.h b/tmux.h index c860b6ac..a2e11151 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.620 2011-04-18 21:07:58 nicm Exp $ */ +/* $Id: tmux.h,v 1.621 2011-04-25 20:33:42 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1077,6 +1077,7 @@ struct mouse_event { #define MOUSE_3 2 #define MOUSE_UP 3 #define MOUSE_BUTTON 3 +#define MOUSE_DRAG 32 #define MOUSE_45 64 u_int x; u_int y; @@ -1424,6 +1425,7 @@ void tty_cmd_clearstartofline(struct tty *, const struct tty_ctx *); void tty_cmd_clearstartofscreen(struct tty *, const struct tty_ctx *); void tty_cmd_deletecharacter(struct tty *, const struct tty_ctx *); void tty_cmd_deleteline(struct tty *, const struct tty_ctx *); +void tty_cmd_erasecharacter(struct tty *, const struct tty_ctx *); void tty_cmd_insertcharacter(struct tty *, const struct tty_ctx *); void tty_cmd_insertline(struct tty *, const struct tty_ctx *); void tty_cmd_linefeed(struct tty *, const struct tty_ctx *); diff --git a/window-copy.c b/window-copy.c index 6d21d5f0..d31c744b 100644 --- a/window-copy.c +++ b/window-copy.c @@ -1,4 +1,4 @@ -/* $Id: window-copy.c,v 1.128 2011-04-06 22:18:56 nicm Exp $ */ +/* $Id: window-copy.c,v 1.129 2011-04-25 20:33:42 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -760,11 +760,11 @@ window_copy_key_numeric_prefix(struct window_pane *wp, int key) /* ARGSUSED */ void window_copy_mouse( - struct window_pane *wp, unused struct session *sess, struct mouse_event *m) + struct window_pane *wp, struct session *sess, struct mouse_event *m) { struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; - u_int i; + u_int i, old_cy; if (m->x >= screen_size_x(s)) return; @@ -777,8 +777,11 @@ window_copy_mouse( for (i = 0; i < 5; i++) window_copy_cursor_up(wp, 0); } else if ((m->b & MOUSE_BUTTON) == MOUSE_2) { + old_cy = data->cy; for (i = 0; i < 5; i++) window_copy_cursor_down(wp, 0); + if (old_cy == data->cy) + goto reset_mode; } return; } @@ -792,15 +795,9 @@ window_copy_mouse( window_copy_update_cursor(wp, m->x, m->y); if (window_copy_update_selection(wp)) window_copy_redraw_screen(wp); - } else { - s->mode &= ~MODE_MOUSE_ANY; - s->mode |= MODE_MOUSE_STANDARD; - if (sess != NULL) { - window_copy_copy_selection(wp); - window_pane_reset_mode(wp); - } + return; } - return; + goto reset_mode; } /* Otherwise if other buttons pressed, start selection and motion. */ @@ -812,6 +809,16 @@ window_copy_mouse( window_copy_start_selection(wp); window_copy_redraw_screen(wp); } + + return; + +reset_mode: + s->mode &= ~MODE_MOUSE_ANY; + s->mode |= MODE_MOUSE_STANDARD; + if (sess != NULL) { + window_copy_copy_selection(wp); + window_pane_reset_mode(wp); + } } void