mirror of
https://github.com/tmux/tmux.git
synced 2025-01-07 16:28:48 +00:00
Add format_expand_time and use it instead of status_replace where
command execution is not needed.
This commit is contained in:
parent
83a8e1fd20
commit
03758a50dc
@ -22,6 +22,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <paths.h>
|
#include <paths.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -49,11 +50,14 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
{
|
{
|
||||||
struct args *args = self->args;
|
struct args *args = self->args;
|
||||||
struct client *c;
|
struct client *c;
|
||||||
|
struct session *s;
|
||||||
|
struct winlink *wl;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
char *command;
|
char *cmd;
|
||||||
int old_fd, pipe_fd[2], null_fd;
|
int old_fd, pipe_fd[2], null_fd;
|
||||||
|
struct format_tree *ft;
|
||||||
|
|
||||||
if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
|
if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
c = cmd_find_client(cmdq, NULL, 1);
|
c = cmd_find_client(cmdq, NULL, 1);
|
||||||
|
|
||||||
@ -84,10 +88,18 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Expand the command. */
|
||||||
|
ft = format_create();
|
||||||
|
format_defaults(ft, c, s, wl, wp);
|
||||||
|
cmd = format_expand_time(ft, args->argv[0], time(NULL));
|
||||||
|
format_free(ft);
|
||||||
|
|
||||||
/* Fork the child. */
|
/* Fork the child. */
|
||||||
switch (fork()) {
|
switch (fork()) {
|
||||||
case -1:
|
case -1:
|
||||||
cmdq_error(cmdq, "fork error: %s", strerror(errno));
|
cmdq_error(cmdq, "fork error: %s", strerror(errno));
|
||||||
|
|
||||||
|
free(cmd);
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
case 0:
|
case 0:
|
||||||
/* Child process. */
|
/* Child process. */
|
||||||
@ -109,8 +121,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
|
|
||||||
closefrom(STDERR_FILENO + 1);
|
closefrom(STDERR_FILENO + 1);
|
||||||
|
|
||||||
command = status_replace(c, NULL, args->argv[0], time(NULL), 0);
|
execl(_PATH_BSHELL, "sh", "-c", cmd, (char *) NULL);
|
||||||
execl(_PATH_BSHELL, "sh", "-c", command, (char *) NULL);
|
|
||||||
_exit(1);
|
_exit(1);
|
||||||
default:
|
default:
|
||||||
/* Parent process. */
|
/* Parent process. */
|
||||||
@ -124,6 +135,8 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
|
|||||||
bufferevent_enable(wp->pipe_event, EV_WRITE);
|
bufferevent_enable(wp->pipe_event, EV_WRITE);
|
||||||
|
|
||||||
setblocking(wp->pipe_fd, 0);
|
setblocking(wp->pipe_fd, 0);
|
||||||
|
|
||||||
|
free(cmd);
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
30
format.c
30
format.c
@ -326,6 +326,33 @@ fail:
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Expand keys in a template, passing through strftime first. */
|
||||||
|
char *
|
||||||
|
format_expand_time(struct format_tree *ft, const char *fmt, time_t t)
|
||||||
|
{
|
||||||
|
char *tmp, *expanded;
|
||||||
|
size_t tmplen;
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
if (fmt == NULL)
|
||||||
|
return (xstrdup(""));
|
||||||
|
|
||||||
|
tm = localtime(&t);
|
||||||
|
|
||||||
|
tmp = NULL;
|
||||||
|
tmplen = strlen(fmt);
|
||||||
|
|
||||||
|
do {
|
||||||
|
tmp = xreallocarray(tmp, 2, tmplen);
|
||||||
|
tmplen *= 2;
|
||||||
|
} while (strftime(tmp, tmplen, fmt, tm) == 0);
|
||||||
|
|
||||||
|
expanded = format_expand(ft, tmp);
|
||||||
|
free(tmp);
|
||||||
|
|
||||||
|
return (expanded);
|
||||||
|
}
|
||||||
|
|
||||||
/* Expand keys in a template. */
|
/* Expand keys in a template. */
|
||||||
char *
|
char *
|
||||||
format_expand(struct format_tree *ft, const char *fmt)
|
format_expand(struct format_tree *ft, const char *fmt)
|
||||||
@ -335,6 +362,9 @@ format_expand(struct format_tree *ft, const char *fmt)
|
|||||||
size_t off, len, n;
|
size_t off, len, n;
|
||||||
int ch, brackets;
|
int ch, brackets;
|
||||||
|
|
||||||
|
if (fmt == NULL)
|
||||||
|
return (xstrdup(""));
|
||||||
|
|
||||||
len = 64;
|
len = 64;
|
||||||
buf = xmalloc(len);
|
buf = xmalloc(len);
|
||||||
off = 0;
|
off = 0;
|
||||||
|
27
status.c
27
status.c
@ -760,14 +760,20 @@ status_prompt_set(struct client *c, const char *msg, const char *input,
|
|||||||
int (*callbackfn)(void *, const char *), void (*freefn)(void *),
|
int (*callbackfn)(void *, const char *), void (*freefn)(void *),
|
||||||
void *data, int flags)
|
void *data, int flags)
|
||||||
{
|
{
|
||||||
int keys;
|
struct format_tree *ft;
|
||||||
|
int keys;
|
||||||
|
time_t t;
|
||||||
|
|
||||||
|
ft = format_create();
|
||||||
|
format_defaults(ft, c, NULL, NULL, NULL);
|
||||||
|
t = time(NULL);
|
||||||
|
|
||||||
status_message_clear(c);
|
status_message_clear(c);
|
||||||
status_prompt_clear(c);
|
status_prompt_clear(c);
|
||||||
|
|
||||||
c->prompt_string = status_replace(c, NULL, msg, time(NULL), 0);
|
c->prompt_string = format_expand_time(ft, msg, time(NULL));
|
||||||
|
|
||||||
c->prompt_buffer = status_replace(c, NULL, input, time(NULL), 0);
|
c->prompt_buffer = format_expand_time(ft, input, time(NULL));
|
||||||
c->prompt_index = strlen(c->prompt_buffer);
|
c->prompt_index = strlen(c->prompt_buffer);
|
||||||
|
|
||||||
c->prompt_callbackfn = callbackfn;
|
c->prompt_callbackfn = callbackfn;
|
||||||
@ -786,6 +792,8 @@ status_prompt_set(struct client *c, const char *msg, const char *input,
|
|||||||
|
|
||||||
c->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE);
|
c->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE);
|
||||||
c->flags |= CLIENT_STATUS;
|
c->flags |= CLIENT_STATUS;
|
||||||
|
|
||||||
|
format_free(ft);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove status line prompt. */
|
/* Remove status line prompt. */
|
||||||
@ -814,16 +822,25 @@ status_prompt_clear(struct client *c)
|
|||||||
void
|
void
|
||||||
status_prompt_update(struct client *c, const char *msg, const char *input)
|
status_prompt_update(struct client *c, const char *msg, const char *input)
|
||||||
{
|
{
|
||||||
|
struct format_tree *ft;
|
||||||
|
time_t t;
|
||||||
|
|
||||||
|
ft = format_create();
|
||||||
|
format_defaults(ft, c, NULL, NULL, NULL);
|
||||||
|
t = time(NULL);
|
||||||
|
|
||||||
free(c->prompt_string);
|
free(c->prompt_string);
|
||||||
c->prompt_string = status_replace(c, NULL, msg, time(NULL), 0);
|
c->prompt_string = format_expand_time(ft, msg, time(NULL));
|
||||||
|
|
||||||
free(c->prompt_buffer);
|
free(c->prompt_buffer);
|
||||||
c->prompt_buffer = status_replace(c, NULL, input, time(NULL), 0);
|
c->prompt_buffer = format_expand_time(ft, input, time(NULL));
|
||||||
c->prompt_index = strlen(c->prompt_buffer);
|
c->prompt_index = strlen(c->prompt_buffer);
|
||||||
|
|
||||||
c->prompt_hindex = 0;
|
c->prompt_hindex = 0;
|
||||||
|
|
||||||
c->flags |= CLIENT_STATUS;
|
c->flags |= CLIENT_STATUS;
|
||||||
|
|
||||||
|
format_free(ft);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw client prompt on status line of present else on last line. */
|
/* Draw client prompt on status line of present else on last line. */
|
||||||
|
1
tmux.h
1
tmux.h
@ -1512,6 +1512,7 @@ void format_free(struct format_tree *);
|
|||||||
void printflike(3, 4) format_add(struct format_tree *, const char *,
|
void printflike(3, 4) format_add(struct format_tree *, const char *,
|
||||||
const char *, ...);
|
const char *, ...);
|
||||||
const char *format_find(struct format_tree *, const char *);
|
const char *format_find(struct format_tree *, const char *);
|
||||||
|
char *format_expand_time(struct format_tree *, const char *, time_t);
|
||||||
char *format_expand(struct format_tree *, const char *);
|
char *format_expand(struct format_tree *, const char *);
|
||||||
void format_defaults(struct format_tree *, struct client *,
|
void format_defaults(struct format_tree *, struct client *,
|
||||||
struct session *, struct winlink *, struct window_pane *);
|
struct session *, struct winlink *, struct window_pane *);
|
||||||
|
Loading…
Reference in New Issue
Block a user