Add -d flag to display-panes to specify timeout, and make 0 mean no

timeout. From Laurens Post.
This commit is contained in:
nicm 2017-08-16 12:12:54 +00:00
parent c1ec28a34b
commit c6a8ad23a1
4 changed files with 31 additions and 10 deletions

View File

@ -37,8 +37,8 @@ const struct cmd_entry cmd_display_panes_entry = {
.name = "display-panes", .name = "display-panes",
.alias = "displayp", .alias = "displayp",
.args = { "t:", 0, 1 }, .args = { "d:t:", 0, 1 },
.usage = CMD_TARGET_CLIENT_USAGE, .usage = "[-d duration] " CMD_TARGET_CLIENT_USAGE,
.flags = CMD_AFTERHOOK, .flags = CMD_AFTERHOOK,
.exec = cmd_display_panes_exec .exec = cmd_display_panes_exec
@ -49,6 +49,9 @@ cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item)
{ {
struct args *args = self->args; struct args *args = self->args;
struct client *c; struct client *c;
struct session *s;
u_int delay;
char *cause;
if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL) if ((c = cmd_find_client(item, args_get(args, 't'), 0)) == NULL)
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
@ -61,8 +64,18 @@ cmd_display_panes_exec(struct cmd *self, struct cmdq_item *item)
c->identify_callback_data = xstrdup(args->argv[0]); c->identify_callback_data = xstrdup(args->argv[0]);
else else
c->identify_callback_data = xstrdup("select-pane -t '%%'"); c->identify_callback_data = xstrdup("select-pane -t '%%'");
s = c->session;
server_client_set_identify(c); if (args_has(args, 'd')) {
delay = args_strtonum(args, 'd', 0, UINT_MAX, &cause);
if (cause != NULL) {
cmdq_error(item, "delay %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
} else
delay = options_get_number(s->options, "display-panes-time");
server_client_set_identify(c, delay);
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
} }

View File

@ -74,19 +74,18 @@ server_client_callback_identify(__unused int fd, __unused short events,
/* Set identify mode on client. */ /* Set identify mode on client. */
void void
server_client_set_identify(struct client *c) server_client_set_identify(struct client *c, u_int delay)
{ {
struct timeval tv; struct timeval tv;
int delay;
delay = options_get_number(c->session->options, "display-panes-time");
tv.tv_sec = delay / 1000; tv.tv_sec = delay / 1000;
tv.tv_usec = (delay % 1000) * 1000L; tv.tv_usec = (delay % 1000) * 1000L;
if (event_initialized(&c->identify_timer)) if (event_initialized(&c->identify_timer))
evtimer_del(&c->identify_timer); evtimer_del(&c->identify_timer);
evtimer_set(&c->identify_timer, server_client_callback_identify, c); evtimer_set(&c->identify_timer, server_client_callback_identify, c);
evtimer_add(&c->identify_timer, &tv); if (delay != 0)
evtimer_add(&c->identify_timer, &tv);
c->flags |= CLIENT_IDENTIFY; c->flags |= CLIENT_IDENTIFY;
c->tty.flags |= (TTY_FREEZE|TTY_NOCURSOR); c->tty.flags |= (TTY_FREEZE|TTY_NOCURSOR);

13
tmux.1
View File

@ -1461,6 +1461,7 @@ specifies the format for each item in the tree.
This command works only if at least one client is attached. This command works only if at least one client is attached.
.It Xo .It Xo
.Ic display-panes .Ic display-panes
.Op Fl d Ar duration
.Op Fl t Ar target-client .Op Fl t Ar target-client
.Op Ar template .Op Ar template
.Xc .Xc
@ -1468,11 +1469,19 @@ This command works only if at least one client is attached.
Display a visible indicator of each pane shown by Display a visible indicator of each pane shown by
.Ar target-client . .Ar target-client .
See the See the
.Ic display-panes-time , .Ic display-panes-colour
.Ic display-panes-colour ,
and and
.Ic display-panes-active-colour .Ic display-panes-active-colour
session options. session options.
The indicator is closed when a key is pressed or
.Ar duration
milliseconds have passed.
If
.Fl d
is not given,
.Ic display-panes-time
is used.
A duration of zero means the indicator stays until a key is pressed.
While the indicator is on screen, a pane may be chosen with the While the indicator is on screen, a pane may be chosen with the
.Ql 0 .Ql 0
to to

2
tmux.h
View File

@ -1870,7 +1870,7 @@ void server_add_accept(int);
/* server-client.c */ /* server-client.c */
u_int server_client_how_many(void); u_int server_client_how_many(void);
void server_client_set_identify(struct client *); void server_client_set_identify(struct client *, u_int);
void server_client_clear_identify(struct client *, struct window_pane *); void server_client_clear_identify(struct client *, struct window_pane *);
void server_client_set_key_table(struct client *, const char *); void server_client_set_key_table(struct client *, const char *);
const char *server_client_get_key_table(struct client *); const char *server_client_get_key_table(struct client *);