New option, mouse-select-pane. If on, the mouse may be used to select the

current pane.

Suggested by sthen@ and also by someone else ages ago who I have forgotten.
This commit is contained in:
Nicholas Marriott 2009-10-10 14:51:16 +00:00
parent 3a20a05a49
commit 4658c063d5
6 changed files with 42 additions and 3 deletions

View File

@ -67,6 +67,7 @@ const struct set_option_entry set_option_table[] = {
{ "message-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "message-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "message-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "mouse-select-pane", SET_OPTION_FLAG, 0, 0, NULL },
{ "prefix", SET_OPTION_KEYS, 0, 0, NULL },
{ "repeat-time", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
{ "set-remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL },

View File

@ -825,6 +825,7 @@ server_handle_client(struct client *c)
struct window *w;
struct window_pane *wp;
struct screen *s;
struct options *oo;
struct timeval tv;
struct key_binding *bd;
struct keylist *keylist;
@ -849,6 +850,7 @@ server_handle_client(struct client *c)
c->session->activity = time(NULL);
w = c->session->curw->window;
wp = w->active; /* could die */
oo = &c->session->options;
/* Special case: number keys jump to pane in identify mode. */
if (c->flags & CLIENT_IDENTIFY && key >= '0' && key <= '9') {
@ -868,6 +870,10 @@ server_handle_client(struct client *c)
/* Check for mouse keys. */
if (key == KEYC_MOUSE) {
if (options_get_number(oo, "mouse-select-pane")) {
window_set_active_at(w, mouse[1], mouse[2]);
wp = w->active;
}
window_pane_mouse(wp, c, mouse[0], mouse[1], mouse[2]);
continue;
}
@ -935,7 +941,9 @@ server_handle_client(struct client *c)
}
if (c->session == NULL)
return;
wp = c->session->curw->window->active; /* could die - do each loop */
w = c->session->curw->window;
wp = w->active;
oo = &c->session->options;
s = wp->screen;
/*
@ -948,7 +956,7 @@ server_handle_client(struct client *c)
* tty_region/tty_reset/tty_update_mode already take care of not
* resetting things that are already in their default state.
*/
status = options_get_number(&c->session->options, "status");
status = options_get_number(oo, "status");
tty_region(&c->tty, 0, c->tty.sy - 1, 0);
if (!window_pane_visible(wp) || wp->yoff + s->cy >= c->tty.sy - status)
tty_cursor(&c->tty, 0, 0, 0, 0);
@ -956,6 +964,9 @@ server_handle_client(struct client *c)
tty_cursor(&c->tty, s->cx, s->cy, wp->xoff, wp->yoff);
mode = s->mode;
if (TAILQ_NEXT(TAILQ_FIRST(&w->panes), entry) != NULL &&
options_get_number(oo, "mouse-select-pane"))
mode |= MODE_MOUSE;
tty_update_mode(&c->tty, mode);
tty_reset(&c->tty);
}

10
tmux.1
View File

@ -1292,7 +1292,7 @@ with
.Op Ic on | off
.Xc
If this option is
.Ic on
.Ic on
(the default),
instead of each session locking individually as each has been
idle for
@ -1336,6 +1336,14 @@ from the 256-colour palette, or
.Ic default .
.It Ic message-fg Ar colour
Set status line message foreground colour.
.It Xo Ic mouse-select-pane
.Op Ic on | off
.Xc
If on,
.Nm
captures the mouse and when a window is split into multiple panes the mouse may
be used to select the current pane.
The mouse click is also passed through to the application as normal.
.It Ic prefix Ar keys
Set the keys accepted as a prefix key.
.Ar keys

1
tmux.c
View File

@ -381,6 +381,7 @@ main(int argc, char **argv)
options_set_number(so, "message-attr", 0);
options_set_number(so, "message-bg", 3);
options_set_number(so, "message-fg", 0);
options_set_number(so, "mouse-select-pane", 0);
options_set_number(so, "repeat-time", 500);
options_set_number(so, "set-remain-on-exit", 0);
options_set_number(so, "set-titles", 0);

1
tmux.h
View File

@ -1648,6 +1648,7 @@ struct window *window_create(const char *, const char *, const char *,
const char *, struct environ *, struct termios *,
u_int, u_int, u_int, char **);
void window_destroy(struct window *);
void window_set_active_at(struct window *, u_int, u_int);
void window_set_active_pane(struct window *, struct window_pane *);
struct window_pane *window_add_pane(struct window *, u_int);
void window_resize(struct window *, u_int, u_int);

View File

@ -304,6 +304,23 @@ window_set_active_pane(struct window *w, struct window_pane *wp)
}
}
void
window_set_active_at(struct window *w, u_int x, u_int y)
{
struct window_pane *wp;
TAILQ_FOREACH(wp, &w->panes, entry) {
if (!window_pane_visible(wp))
continue;
if (x < wp->xoff || x >= wp->xoff + wp->sx)
continue;
if (y < wp->yoff || y >= wp->yoff + wp->sy)
continue;
window_set_active_pane(w, wp);
break;
}
}
struct window_pane *
window_add_pane(struct window *w, u_int hlimit)
{