Sync OpenBSD patchset 373:

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:
Tiago Cunha 2009-10-11 23:46:02 +00:00
parent 2486a36af3
commit ea1721bcb0
6 changed files with 48 additions and 9 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-set-option.c,v 1.82 2009-10-11 23:30:28 tcunha Exp $ */
/* $Id: cmd-set-option.c,v 1.83 2009-10-11 23:46:02 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -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

@ -1,4 +1,4 @@
/* $Id: server.c,v 1.198 2009-10-11 23:38:16 tcunha Exp $ */
/* $Id: server.c,v 1.199 2009-10-11 23:46:02 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -828,6 +828,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;
@ -852,6 +853,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') {
@ -871,6 +873,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;
}
@ -938,7 +944,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;
/*
@ -951,7 +959,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);
@ -959,6 +967,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);
}

12
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.183 2009-10-11 23:38:16 tcunha Exp $
.\" $Id: tmux.1,v 1.184 2009-10-11 23:46:02 tcunha Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\"
@ -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

3
tmux.c
View File

@ -1,4 +1,4 @@
/* $Id: tmux.c,v 1.177 2009-10-11 23:30:28 tcunha Exp $ */
/* $Id: tmux.c,v 1.178 2009-10-11 23:46:02 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -390,6 +390,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);

3
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.462 2009-10-11 23:38:16 tcunha Exp $ */
/* $Id: tmux.h,v 1.463 2009-10-11 23:46:02 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -1646,6 +1646,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

@ -1,4 +1,4 @@
/* $Id: window.c,v 1.111 2009-10-11 23:38:16 tcunha Exp $ */
/* $Id: window.c,v 1.112 2009-10-11 23:46:02 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -302,6 +302,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)
{