summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2011-04-19 21:31:33 +0000
committerNicholas Marriott <nicm@openbsd.org>2011-04-19 21:31:33 +0000
commit8738141913517ae50d71b17ec531ce9f85dceb4d (patch)
tree39260de50a4aa580a043ed1534c70969f59aecff
parent3970853febf1a371d68d27c331e81a2afe1a63bb (diff)
When mode-mouse is on (it is off by default), automatically enter copy
mode when the mouse is dragged or the mouse wheel is used. Also exit copy mode when the mouse wheel is scrolled off the bottom. Discussed with and written by hsim at gmx dot li.
-rw-r--r--input-keys.c7
-rw-r--r--server-client.c26
-rw-r--r--tmux.15
-rw-r--r--tmux.h2
-rw-r--r--window-copy.c27
5 files changed, 46 insertions, 21 deletions
diff --git a/input-keys.c b/input-keys.c
index f73ce397..dfcc8273 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -220,5 +220,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 36bce79b..ef4946a1 100644
--- a/server-client.c
+++ b/server-client.c
@@ -314,7 +314,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;
@@ -445,6 +451,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);
@@ -460,14 +467,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 45292ed9..af6b78e2 100644
--- a/tmux.1
+++ b/tmux.1
@@ -2310,8 +2310,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 82bdc296..def69db5 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1081,6 +1081,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;
@@ -1428,6 +1429,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 d21e4124..b3879f62 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -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