Add a window or pane id "tag" to each format tree and use it to separate

jobs, this means that if the same job is used for different windows or
panes (for example in pane-border-format), it will be run separately for
each pane.
This commit is contained in:
nicm
2017-02-03 11:57:27 +00:00
parent dd0c814779
commit 7d23d019c0
26 changed files with 203 additions and 135 deletions

View File

@ -77,6 +77,7 @@ static void format_defaults_winlink(struct format_tree *, struct session *,
/* Entry in format job tree. */
struct format_job {
u_int tag;
const char *cmd;
const char *expanded;
@ -99,6 +100,10 @@ RB_GENERATE_STATIC(format_job_tree, format_job, entry, format_job_cmp);
static int
format_job_cmp(struct format_job *fj1, struct format_job *fj2)
{
if (fj1->tag < fj2->tag)
return (-1);
if (fj1->tag > fj2->tag)
return (1);
return (strcmp(fj1->cmd, fj2->cmd));
}
@ -123,6 +128,7 @@ struct format_tree {
struct session *s;
struct window_pane *wp;
u_int tag;
int flags;
RB_HEAD(format_entry_tree, format_entry) tree;
@ -238,9 +244,11 @@ format_job_get(struct format_tree *ft, const char *cmd)
char *expanded;
int force;
fj0.tag = ft->tag;
fj0.cmd = cmd;
if ((fj = RB_FIND(format_job_tree, &format_jobs, &fj0)) == NULL) {
fj = xcalloc(1, sizeof *fj);
fj->tag = ft->tag;
fj->cmd = xstrdup(cmd);
fj->expanded = NULL;
@ -497,7 +505,7 @@ format_merge(struct format_tree *ft, struct format_tree *from)
/* Create a new tree. */
struct format_tree *
format_create(struct cmdq_item *item, int flags)
format_create(struct cmdq_item *item, int tag, int flags)
{
struct format_tree *ft;
@ -508,6 +516,8 @@ format_create(struct cmdq_item *item, int flags)
ft = xcalloc(1, sizeof *ft);
RB_INIT(&ft->tree);
ft->tag = tag;
ft->flags = flags;
format_add_cb(ft, "host", format_cb_host);