diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2010-05-31 19:51:29 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2010-05-31 19:51:29 +0000 |
commit | 43fa9a9ba60f0fba1f5c7985ed9c65cea304d2c4 (patch) | |
tree | 89dc06ea00452e3f6e440d6875016ee9d0910c66 /window-copy.c | |
parent | e1e120de1c4fc5f37940ba3a6567acc914f1692c (diff) | |
download | rtmux-43fa9a9ba60f0fba1f5c7985ed9c65cea304d2c4.tar.gz rtmux-43fa9a9ba60f0fba1f5c7985ed9c65cea304d2c4.tar.bz2 rtmux-43fa9a9ba60f0fba1f5c7985ed9c65cea304d2c4.zip |
When the mode-mouse option is on, support dragging to make a selection
in copy mode.
Also support the scroll wheel, although xterm strangely does not ignore
it in application mouse mode, causing redraw artifacts when scrolling up
(other terminals appear to be better behaved).
Diffstat (limited to 'window-copy.c')
-rw-r--r-- | window-copy.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/window-copy.c b/window-copy.c index 3b42c456..66402eca 100644 --- a/window-copy.c +++ b/window-copy.c @@ -760,17 +760,61 @@ window_copy_mouse( { struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; + u_int i; + + /* + * xterm mouse mode is fairly silly. Buttons are in the bottom two + * bits: 0 button 1; 1 button 2; 2 button 3; 3 buttons released. + * + * Bit 3 is shift; bit 4 is meta; bit 5 control. + * + * Bit 6 is added for mouse buttons 4 and 5. + */ - if ((m->b & 3) == 3) - return; if (m->x >= screen_size_x(s)) return; if (m->y >= screen_size_y(s)) return; - window_copy_update_cursor(wp, m->x, m->y); - if (window_copy_update_selection(wp)) + /* If mouse wheel (buttons 4 and 5), scroll. */ + if ((m->b & 64) == 64) { + if ((m->b & 3) == 0) { + for (i = 0; i < 5; i++) + window_copy_cursor_up(wp, 0); + } else if ((m->b & 3) == 1) { + for (i = 0; i < 5; i++) + window_copy_cursor_down(wp, 0); + } + return; + } + + /* + * If already reading motion, move the cursor while buttons are still + * pressed, or stop the selection on their release. + */ + if (s->mode & MODE_MOUSEMOTION) { + if ((m->b & 3) != 3) { + window_copy_update_cursor(wp, m->x, m->y); + if (window_copy_update_selection(wp)) + window_copy_redraw_screen(wp); + } else { + s->mode &= ~MODE_MOUSEMOTION; + if (sess != NULL) { + window_copy_copy_selection(wp, sess); + window_pane_reset_mode(wp); + } + } + return; + } + + /* Otherwise i other buttons pressed, start selection and motion. */ + if ((m->b & 3) != 3) { + s->mode |= MODE_MOUSEMOTION; + + window_copy_update_cursor(wp, m->x, m->y); + window_copy_start_selection(wp); window_copy_redraw_screen(wp); + } } void |