Don't interpret #() for display-message, it usually doesn't make sense and may

leak commands.
This commit is contained in:
Nicholas Marriott 2009-11-19 10:22:06 +00:00
parent 8d4eae5662
commit ac5b7d518e
5 changed files with 30 additions and 15 deletions

View File

@ -55,7 +55,7 @@ cmd_display_message_exec(struct cmd *self, struct cmd_ctx *ctx)
else else
template = data->arg; template = data->arg;
msg = status_replace(c, template, time(NULL)); msg = status_replace(c, template, time(NULL), 0);
status_message_set(c, "%s", msg); status_message_set(c, "%s", msg);
xfree(msg); xfree(msg);

View File

@ -489,7 +489,7 @@ server_client_set_title(struct client *c)
template = options_get_string(&s->options, "set-titles-string"); template = options_get_string(&s->options, "set-titles-string");
title = status_replace(c, template, time(NULL)); title = status_replace(c, template, time(NULL), 1);
if (c->title == NULL || strcmp(title, c->title) != 0) { if (c->title == NULL || strcmp(title, c->title) != 0) {
if (c->title != NULL) if (c->title != NULL)
xfree(c->title); xfree(c->title);

View File

@ -107,14 +107,14 @@ status_redraw(struct client *c)
/* Work out the left and right strings. */ /* Work out the left and right strings. */
left = status_replace(c, options_get_string( left = status_replace(c, options_get_string(
&s->options, "status-left"), c->status_timer.tv_sec); &s->options, "status-left"), c->status_timer.tv_sec, 1);
llen = options_get_number(&s->options, "status-left-length"); llen = options_get_number(&s->options, "status-left-length");
llen2 = screen_write_cstrlen(utf8flag, "%s", left); llen2 = screen_write_cstrlen(utf8flag, "%s", left);
if (llen2 < llen) if (llen2 < llen)
llen = llen2; llen = llen2;
right = status_replace(c, options_get_string( right = status_replace(c, options_get_string(
&s->options, "status-right"), c->status_timer.tv_sec); &s->options, "status-right"), c->status_timer.tv_sec, 1);
rlen = options_get_number(&s->options, "status-right-length"); rlen = options_get_number(&s->options, "status-right-length");
rlen2 = screen_write_cstrlen(utf8flag, "%s", right); rlen2 = screen_write_cstrlen(utf8flag, "%s", right);
if (rlen2 < rlen) if (rlen2 < rlen)
@ -319,7 +319,7 @@ out:
} }
char * char *
status_replace(struct client *c, const char *fmt, time_t t) status_replace(struct client *c, const char *fmt, time_t t, int run_jobs)
{ {
struct session *s = c->session; struct session *s = c->session;
struct winlink *wl = s->curw; struct winlink *wl = s->curw;
@ -355,11 +355,25 @@ status_replace(struct client *c, const char *fmt, time_t t)
ptr = NULL; ptr = NULL;
switch (*iptr++) { switch (*iptr++) {
case '(': case '(':
if (ptr == NULL) { if (run_jobs) {
ptr = status_job(c, &iptr); if (ptr == NULL) {
if (ptr == NULL) ptr = status_job(c, &iptr);
break; if (ptr == NULL)
savedptr = ptr; break;
savedptr = ptr;
}
} else {
/* Don't run jobs. Copy to ). */
*optr++ = '#';
iptr--; /* include [ */
while (*iptr != ')' && *iptr != '\0') {
if (optr >=
out + (sizeof out) - 1)
break;
*optr++ = *iptr++;
}
break;
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
case 'H': case 'H':

9
tmux.1
View File

@ -1992,10 +1992,11 @@ This command works only from inside
.Op Ar message .Op Ar message
.Xc .Xc
.D1 (alias: Ic display ) .D1 (alias: Ic display )
Display a message (see the Display a message in the status line.
.Ic status-left The format of
option below) .Ar message is as for
in the status line. .Ic status-left ,
with the exception that #() are not handled.
.It Ic select-prompt Op Fl t Ar target-client .It Ic select-prompt Op Fl t Ar target-client
Open a prompt inside Open a prompt inside
.Ar target-client .Ar target-client

2
tmux.h
View File

@ -1617,7 +1617,7 @@ void server_update_event(struct client *);
/* status.c */ /* status.c */
int status_redraw(struct client *); int status_redraw(struct client *);
char *status_replace(struct client *, const char *, time_t); char *status_replace(struct client *, const char *, time_t, int);
void printflike2 status_message_set(struct client *, const char *, ...); void printflike2 status_message_set(struct client *, const char *, ...);
void status_message_clear(struct client *); void status_message_clear(struct client *);
int status_message_redraw(struct client *); int status_message_redraw(struct client *);