diff options
Diffstat (limited to 'usr.bin/tmux/window-copy.c')
-rw-r--r-- | usr.bin/tmux/window-copy.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/usr.bin/tmux/window-copy.c b/usr.bin/tmux/window-copy.c index 16c327d6924..44d9d1b5aa2 100644 --- a/usr.bin/tmux/window-copy.c +++ b/usr.bin/tmux/window-copy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window-copy.c,v 1.67 2011/03/28 19:44:31 nicm Exp $ */ +/* $OpenBSD: window-copy.c,v 1.68 2011/04/19 21:31:33 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -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 |