(+ 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users