summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2019-04-18 11:07:29 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2019-04-18 11:07:29 +0000
commit26e04078152d03c5a1592f6c086948bd5ee53701 (patch)
tree96a394a5e3d61477dd04ecf9447ac4c5f757fb32 /usr.bin
parentc7238ebfc8be93dc4a2331d6edbba360b6224d1f (diff)
Pass target client and session to load_cfg from source-file so formats
work. Reported by Thomas Sattler.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/cfg.c32
-rw-r--r--usr.bin/tmux/screen-write.c4
2 files changed, 24 insertions, 12 deletions
diff --git a/usr.bin/tmux/cfg.c b/usr.bin/tmux/cfg.c
index b8b4ff5bc5c..b4d4f89f6d8 100644
--- a/usr.bin/tmux/cfg.c
+++ b/usr.bin/tmux/cfg.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cfg.c,v 1.67 2019/04/03 06:43:19 nicm Exp $ */
+/* $OpenBSD: cfg.c,v 1.68 2019/04/18 11:07:28 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -116,7 +116,8 @@ start_cfg(void)
}
static int
-cfg_check_condition(const char *path, size_t line, const char *p, int *skip)
+cfg_check_cond(const char *path, size_t line, const char *p, int *skip,
+ struct client *c, struct cmd_find_state *fs)
{
struct format_tree *ft;
char *s;
@@ -131,6 +132,10 @@ cfg_check_condition(const char *path, size_t line, const char *p, int *skip)
}
ft = format_create(NULL, NULL, FORMAT_NONE, FORMAT_NOJOBS);
+ if (fs != NULL)
+ format_defaults(ft, c, fs->s, fs->wl, fs->wp);
+ else
+ format_defaults(ft, c, NULL, NULL, NULL);
s = format_expand(ft, p);
result = format_true(s);
free(s);
@@ -142,7 +147,7 @@ cfg_check_condition(const char *path, size_t line, const char *p, int *skip)
static void
cfg_handle_if(const char *path, size_t line, struct cfg_conds *conds,
- const char *p)
+ const char *p, struct client *c, struct cmd_find_state *fs)
{
struct cfg_cond *cond;
struct cfg_cond *parent = TAILQ_FIRST(conds);
@@ -154,7 +159,7 @@ cfg_handle_if(const char *path, size_t line, struct cfg_conds *conds,
cond = xcalloc(1, sizeof *cond);
cond->line = line;
if (parent == NULL || parent->met)
- cond->met = cfg_check_condition(path, line, p, &cond->skip);
+ cond->met = cfg_check_cond(path, line, p, &cond->skip, c, fs);
else
cond->skip = 1;
cond->saw_else = 0;
@@ -163,7 +168,7 @@ cfg_handle_if(const char *path, size_t line, struct cfg_conds *conds,
static void
cfg_handle_elif(const char *path, size_t line, struct cfg_conds *conds,
- const char *p)
+ const char *p, struct client *c, struct cmd_find_state *fs)
{
struct cfg_cond *cond = TAILQ_FIRST(conds);
@@ -174,7 +179,7 @@ cfg_handle_elif(const char *path, size_t line, struct cfg_conds *conds,
if (cond == NULL || cond->saw_else)
cfg_add_cause("%s:%zu: unexpected %%elif", path, line);
else if (!cond->skip)
- cond->met = cfg_check_condition(path, line, p, &cond->skip);
+ cond->met = cfg_check_cond(path, line, p, &cond->skip, c, fs);
else
cond->met = 0;
}
@@ -215,16 +220,16 @@ cfg_handle_endif(const char *path, size_t line, struct cfg_conds *conds)
static void
cfg_handle_directive(const char *p, const char *path, size_t line,
- struct cfg_conds *conds)
+ struct cfg_conds *conds, struct client *c, struct cmd_find_state *fs)
{
int n = 0;
while (p[n] != '\0' && !isspace((u_char)p[n]))
n++;
if (strncmp(p, "%if", n) == 0)
- cfg_handle_if(path, line, conds, p + n);
+ cfg_handle_if(path, line, conds, p + n, c, fs);
else if (strncmp(p, "%elif", n) == 0)
- cfg_handle_elif(path, line, conds, p + n);
+ cfg_handle_elif(path, line, conds, p + n, c, fs);
else if (strcmp(p, "%else") == 0)
cfg_handle_else(path, line, conds);
else if (strcmp(p, "%endif") == 0)
@@ -245,6 +250,13 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int quiet)
struct cmdq_item *new_item;
struct cfg_cond *cond, *cond1;
struct cfg_conds conds;
+ struct cmd_find_state *fs = NULL;
+ struct client *fc = NULL;
+
+ if (item != NULL) {
+ fs = &item->target;
+ fc = cmd_find_client(item, NULL, 1);
+ }
TAILQ_INIT(&conds);
@@ -271,7 +283,7 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int quiet)
*q-- = '\0';
if (*p == '%') {
- cfg_handle_directive(p, path, line, &conds);
+ cfg_handle_directive(p, path, line, &conds, fc, fs);
continue;
}
cond = TAILQ_FIRST(&conds);
diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c
index ab6f3f52c3c..5b0baf05a23 100644
--- a/usr.bin/tmux/screen-write.c
+++ b/usr.bin/tmux/screen-write.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-write.c,v 1.150 2019/04/03 06:43:04 nicm Exp $ */
+/* $OpenBSD: screen-write.c,v 1.151 2019/04/18 11:07:28 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1139,7 +1139,7 @@ screen_write_collect_clear(struct screen_write_ctx *ctx, u_int y, u_int n)
u_int i;
size_t size;
- for (i = y ; i < y + n; i++) {
+ for (i = y; i < y + n; i++) {
if (TAILQ_EMPTY(&ctx->list[i].items))
continue;
size = 0;