never mind, this was the latest, i'd just tweaked it. found it in a git rather than a cvs tree.
i've applied all of this except the emulation-in-cup-mode bit so far which i'm not entirely convinced about right now thanks! On Wed, Apr 02, 2014 at 07:29:06PM +0100, Nicholas Marriott wrote: > Hi > > Did you send me a later version of this? I can't find it :-/. > > Cheers > > > > On Thu, Mar 06, 2014 at 12:46:28PM +0000, Nicholas Marriott wrote: > > Some changes, notably: > > > > - Broke the define changes into separate diffs and applied them. > > > > - I don't like it assuming that if m->scroll != 0 the wheel is in use, > > it is more understandable if it checks the event. > > > > - In window-choose.c the return was in the wrong place. > > > > Originally the idea of having m->b and m->wheel was to make things > > simpler but I'm not sure they are actually helping, it might be better > > if everything just looked at m->xb again :-/. But not now. > > > > Not sure this should be on just for mouse-select-pane/window... need to > > think about it. > > > > > > diff --git a/input-keys.c b/input-keys.c > > index 7582a63..29de5ea 100644 > > --- a/input-keys.c > > +++ b/input-keys.c > > @@ -204,6 +204,22 @@ input_mouse(struct window_pane *wp, struct session *s, > > struct mouse_event *m) > > char buf[40]; > > size_t len; > > struct paste_buffer *pb; > > + u_int i; > > + > > + /* > > + * Mouse wheel used while alternate screen is active and not mouse > > + * aware, or shift is pressed. > > + */ > > + if (((wp->saved_grid != NULL && !(wp->screen->mode & ALL_MOUSE_MODES)) > > || > > + m->xb & MOUSE_MASK_SHIFT)) { > > + for (i = 0; i < m->scroll; i++) { > > + if (m->wheel == MOUSE_WHEEL_UP) > > + input_key(wp, KEYC_UP); > > + else > > + input_key(wp, KEYC_DOWN); > > + } > > + return; > > + } > > > > if (wp->screen->mode & ALL_MOUSE_MODES) { > > /* > > @@ -244,7 +260,7 @@ input_mouse(struct window_pane *wp, struct session *s, > > struct mouse_event *m) > > paste_send_pane(pb, wp, "\r", > > wp->screen->mode & MODE_BRACKETPASTE); > > } > > - } else if ((m->xb & 3) != 1 && > > + } else if (m->button != 1 && > > options_get_number(&wp->window->options, "mode-mouse") == 1) { > > if (window_pane_set_mode(wp, &window_copy_mode) == 0) { > > window_copy_init_from_pane(wp); > > diff --git a/tmux.h b/tmux.h > > index fe6bad2..82c79f0 100644 > > --- a/tmux.h > > +++ b/tmux.h > > @@ -1175,6 +1175,7 @@ struct mouse_event { > > > > u_int button; > > u_int clicks; > > + u_int scroll; > > > > int wheel; > > int event; > > diff --git a/tty-keys.c b/tty-keys.c > > index 9dbe450..42f2da4 100644 > > --- a/tty-keys.c > > +++ b/tty-keys.c > > @@ -749,6 +749,15 @@ tty_keys_mouse(struct tty *tty, const char *buf, > > size_t len, size_t *size) > > m->x = x; > > m->y = y; > > if (b & MOUSE_MASK_WHEEL) { > > + if (b & MOUSE_MASK_SHIFT) > > + m->scroll = 1; > > + else > > + m->scroll = 3; > > + if (b & MOUSE_MASK_META) > > + m->scroll *= 3; > > + if (b & MOUSE_MASK_CTRL) > > + m->scroll *= 3; > > + > > b &= MOUSE_MASK_BUTTONS; > > if (b == 0) > > m->wheel = MOUSE_WHEEL_UP; > > @@ -756,9 +765,9 @@ tty_keys_mouse(struct tty *tty, const char *buf, size_t > > len, size_t *size) > > m->wheel = MOUSE_WHEEL_DOWN; > > m->event = MOUSE_EVENT_WHEEL; > > } else if ((b & MOUSE_MASK_BUTTONS) == 3) { > > - if (~m->event & MOUSE_EVENT_DRAG && x == m->x && y == m->y) { > > + if (~m->event & MOUSE_EVENT_DRAG && x == m->x && y == m->y) > > m->event = MOUSE_EVENT_CLICK; > > - } else > > + else > > m->event = MOUSE_EVENT_DRAG; > > m->event |= MOUSE_EVENT_UP; > > } else { > > diff --git a/window-choose.c b/window-choose.c > > index e7578fe..e75858e 100644 > > --- a/window-choose.c > > +++ b/window-choose.c > > @@ -721,7 +721,17 @@ window_choose_mouse( > > struct window_choose_mode_data *data = wp->modedata; > > struct screen *s = &data->screen; > > struct window_choose_mode_item *item; > > - u_int idx; > > + u_int i, idx; > > + > > + if (m->event == MOUSE_EVENT_WHEEL) { > > + for (i = 0; i < m->scroll; i++) { > > + if (m->wheel == MOUSE_WHEEL_UP) > > + window_choose_key(wp, sess, KEYC_UP); > > + else > > + window_choose_key(wp, sess, KEYC_DOWN); > > + } > > + return; > > + } > > > > if (~m->event & MOUSE_EVENT_CLICK) > > return; > > diff --git a/window-copy.c b/window-copy.c > > index e3164f6..9aaf554 100644 > > --- a/window-copy.c > > +++ b/window-copy.c > > @@ -871,18 +871,19 @@ window_copy_mouse( > > > > /* If mouse wheel (buttons 4 and 5), scroll. */ > > if (m->event == MOUSE_EVENT_WHEEL) { > > - if (m->wheel == MOUSE_WHEEL_UP) { > > - for (i = 0; i < 5; i++) > > + for (i = 0; i < m->scroll; i++) { > > + if (m->wheel == MOUSE_WHEEL_UP) > > window_copy_cursor_up(wp, 1); > > - } else if (m->wheel == MOUSE_WHEEL_DOWN) { > > - for (i = 0; i < 5; i++) > > + else { > > window_copy_cursor_down(wp, 1); > > - /* > > - * We reached the bottom, leave copy mode, > > - * but only if no selection is in progress. > > - */ > > - if (data->oy == 0 && !s->sel.flag) > > - goto reset_mode; > > + > > + /* > > + * We reached the bottom, leave copy mode, but > > + * only if no selection is in progress. > > + */ > > + if (data->oy == 0 && !s->sel.flag) > > + goto reset_mode; > > + } > > } > > return; > > } > > . > > > > > > > > On Wed, Mar 05, 2014 at 11:50:09AM +0100, Marcel Partap wrote: > > > (+ some other changes regarding mouse implementation) > > > - is u_int for i ok? > > > - was there a valid reason to use bit shifts for MOUSE_EVENT_* > > > constants? > > > - ... > > > --- > > > input-keys.c | 18 +++++++++++++++++- > > > server-fn.c | 1 + > > > tmux.h | 23 +++++++++++++++++------ > > > tty-keys.c | 27 ++++++++++++++++++--------- > > > window-choose.c | 10 +++++++++- > > > window-copy.c | 12 +++++------- > > > 6 files changed, 67 insertions(+), 24 deletions(-) > > > > > > diff --git a/input-keys.c b/input-keys.c > > > index 7582a63..b76dd6c 100644 > > > --- a/input-keys.c > > > +++ b/input-keys.c > > > @@ -204,6 +204,22 @@ input_mouse(struct window_pane *wp, struct session > > > *s, struct mouse_event *m) > > > char buf[40]; > > > size_t len; > > > struct paste_buffer *pb; > > > + u_int i; > > > + > > > + /* > > > + * Mouse wheel used while alternate screen is active and not mouse > > > + * aware, or shift is pressed. > > > + */ > > > + if (((wp->saved_grid != NULL && !(wp->screen->mode & ALL_MOUSE_MODES)) > > > || > > > + m->xb & MOUSE_SHIFT)) { > > > + for (i = 0; i < m->scroll; i++) { > > > + if (m->wheel == MOUSE_WHEEL_UP) > > > + input_key(wp, KEYC_UP); > > > + else > > > + input_key(wp, KEYC_DOWN); > > > + } > > > + return; > > > + } > > > > > > if (wp->screen->mode & ALL_MOUSE_MODES) { > > > /* > > > @@ -244,7 +260,7 @@ input_mouse(struct window_pane *wp, struct session > > > *s, struct mouse_event *m) > > > paste_send_pane(pb, wp, "\r", > > > wp->screen->mode & MODE_BRACKETPASTE); > > > } > > > - } else if ((m->xb & 3) != 1 && > > > + } else if (m->button != 1 && > > > options_get_number(&wp->window->options, "mode-mouse") == 1) { > > > if (window_pane_set_mode(wp, &window_copy_mode) == 0) { > > > window_copy_init_from_pane(wp); > > > diff --git a/server-fn.c b/server-fn.c > > > index 3062698..47e1cee 100644 > > > --- a/server-fn.c > > > +++ b/server-fn.c > > > @@ -609,3 +609,4 @@ server_unzoom_window(struct window *w) > > > server_redraw_window(w); > > > server_status_window(w); > > > } > > > + > > > diff --git a/tmux.h b/tmux.h > > > index 23b1b46..41be9f8 100644 > > > --- a/tmux.h > > > +++ b/tmux.h > > > @@ -1118,19 +1118,29 @@ struct tty_term { > > > }; > > > LIST_HEAD(tty_terms, tty_term); > > > > > > +/* Mouse event masks. */ > > > +#define MOUSE_MASK_BUTTON 3 > > > +#define MOUSE_MASK_DRAG 32 > > > +#define MOUSE_MASK_WHEEL 64 > > > + > > > +/* Mouse modifier key states. */ > > > +#define MOUSE_SHIFT 4 > > > +#define MOUSE_META 8 > > > +#define MOUSE_CTRL 16 > > > + > > > /* Mouse wheel states. */ > > > #define MOUSE_WHEEL_UP 0 > > > #define MOUSE_WHEEL_DOWN 1 > > > > > > /* Mouse events. */ > > > -#define MOUSE_EVENT_DOWN (1 << 0) > > > -#define MOUSE_EVENT_DRAG (1 << 1) > > > -#define MOUSE_EVENT_UP (1 << 2) > > > -#define MOUSE_EVENT_CLICK (1 << 3) > > > -#define MOUSE_EVENT_WHEEL (1 << 4) > > > +#define MOUSE_EVENT_DOWN 1 > > > +#define MOUSE_EVENT_DRAG 2 > > > +#define MOUSE_EVENT_UP 4 > > > +#define MOUSE_EVENT_CLICK 8 > > > +#define MOUSE_EVENT_WHEEL 16 > > > > > > /* Mouse flags. */ > > > -#define MOUSE_RESIZE_PANE (1 << 0) > > > +#define MOUSE_RESIZE_PANE 1 > > > > > > /* > > > * Mouse input. When sent by xterm: > > > @@ -1160,6 +1170,7 @@ struct mouse_event { > > > > > > u_int button; > > > u_int clicks; > > > + u_int scroll; > > > > > > int wheel; > > > int event; > > > diff --git a/tty-keys.c b/tty-keys.c > > > index 7fb91a8..1a5053a 100644 > > > --- a/tty-keys.c > > > +++ b/tty-keys.c > > > @@ -748,21 +748,30 @@ tty_keys_mouse(struct tty *tty, const char *buf, > > > size_t len, size_t *size) > > > m->sgr_rel = sgr_rel; > > > m->x = x; > > > m->y = y; > > > - if (b & 64) { /* wheel button */ > > > - b &= 3; > > > - if (b == 0) > > > - m->wheel = MOUSE_WHEEL_UP; > > > - else if (b == 1) > > > - m->wheel = MOUSE_WHEEL_DOWN; > > > + m->scroll = 0; > > > + if (b & MOUSE_MASK_WHEEL) { > > > m->event = MOUSE_EVENT_WHEEL; > > > - } else if ((b & 3) == 3) { > > > + /* Figure out number of lines to scroll, shift is a single > > > + * line, meta and ctrl multiply exponentially. */ > > > + if (b & MOUSE_SHIFT) > > > + m->scroll = 1; > > > + else > > > + m->scroll = 3; > > > + > > > + if (b & MOUSE_META) > > > + m->scroll *= 3; > > > + if (b & MOUSE_CTRL) > > > + m->scroll *= 3; > > > + > > > + m->wheel = (b & MOUSE_MASK_BUTTON); > > > + } else if ((b & MOUSE_MASK_BUTTON) == 3) { > > > if (~m->event & MOUSE_EVENT_DRAG && x == m->x && y == m->y) { > > > m->event = MOUSE_EVENT_CLICK; > > > } else > > > m->event = MOUSE_EVENT_DRAG; > > > m->event |= MOUSE_EVENT_UP; > > > } else { > > > - if (b & 32) /* drag motion */ > > > + if (b & MOUSE_MASK_DRAG) > > > m->event = MOUSE_EVENT_DRAG; > > > else { > > > if (m->event & MOUSE_EVENT_UP && x == m->x && y == m->y) > > > @@ -773,7 +782,7 @@ tty_keys_mouse(struct tty *tty, const char *buf, > > > size_t len, size_t *size) > > > m->sy = y; > > > m->event = MOUSE_EVENT_DOWN; > > > } > > > - m->button = (b & 3); > > > + m->button = (b & MOUSE_MASK_BUTTON); > > > } > > > > > > return (0); > > > diff --git a/window-choose.c b/window-choose.c > > > index 7b2b32b..9d91994 100644 > > > --- a/window-choose.c > > > +++ b/window-choose.c > > > @@ -698,7 +698,15 @@ window_choose_mouse( > > > struct window_choose_mode_data *data = wp->modedata; > > > struct screen *s = &data->screen; > > > struct window_choose_mode_item *item; > > > - u_int idx; > > > + u_int i, idx; > > > + > > > + for (i = 0; i < m->scroll; i++) { > > > + if (m->wheel == MOUSE_WHEEL_UP) > > > + window_choose_key(wp, sess, KEYC_UP); > > > + else > > > + window_choose_key(wp, sess, KEYC_DOWN); > > > + return; > > > + } > > > > > > if (~m->event & MOUSE_EVENT_CLICK) > > > return; > > > diff --git a/window-copy.c b/window-copy.c > > > index 527c95c..7471ef2 100644 > > > --- a/window-copy.c > > > +++ b/window-copy.c > > > @@ -862,13 +862,11 @@ window_copy_mouse( > > > return; > > > > > > /* If mouse wheel (buttons 4 and 5), scroll. */ > > > - if (m->event == MOUSE_EVENT_WHEEL) { > > > - if (m->wheel == MOUSE_WHEEL_UP) { > > > - for (i = 0; i < 5; i++) > > > - window_copy_cursor_up(wp, 1); > > > - } else if (m->wheel == MOUSE_WHEEL_DOWN) { > > > - for (i = 0; i < 5; i++) > > > - window_copy_cursor_down(wp, 1); > > > + for (i = 0; i < m->scroll; i++) { > > > + if (m->wheel == MOUSE_WHEEL_UP) > > > + window_copy_cursor_up(wp, 1); > > > + else { > > > + window_copy_cursor_down(wp, 1); > > > /* > > > * We reached the bottom, leave copy mode, > > > * but only if no selection is in progress. > > > -- > > > 1.9.0 > > > > > > > > > ------------------------------------------------------------------------------ > > > Subversion Kills Productivity. Get off Subversion & Make the Move to > > > Perforce. > > > With Perforce, you get hassle-free workflows. Merge that actually works. > > > Faster operations. Version large binaries. Built-in WAN optimization and > > > the > > > freedom to use Git, Perforce or both. Make the move to Perforce. > > > http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk > > > _______________________________________________ > > > tmux-users mailing list > > > tmux-users@lists.sourceforge.net > > > https://lists.sourceforge.net/lists/listinfo/tmux-users ------------------------------------------------------------------------------ _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users