summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2019-06-20 09:02:26 +0100
committerThomas Adam <thomas@xteddy.org>2019-06-20 09:02:26 +0100
commit03945276f7010a69969714f8b581d68ee9ff92ba (patch)
treee09fa390d09df02ebc31e696bce5db733013ba12
parentb3ca410bc398e9aa7a045cf1337ca3f08c005e6e (diff)
parentcd1fc42df6d1bacac4f617e031c279ba31bc0632 (diff)
Merge branch 'obsd-master'
-rw-r--r--arguments.c4
-rw-r--r--cfg.c7
-rw-r--r--cmd-show-options.c78
-rw-r--r--format.c4
-rw-r--r--server-client.c39
-rw-r--r--server.c3
-rw-r--r--tmux.15
7 files changed, 88 insertions, 52 deletions
diff --git a/arguments.c b/arguments.c
index c8a6ab45..f7b6cbe1 100644
--- a/arguments.c
+++ b/arguments.c
@@ -212,7 +212,9 @@ args_escape(const char *s)
if (*s == '\0')
return (xstrdup(s));
- if ((strchr(quoted, s[0]) != NULL || s[0] == '~') && s[1] == '\0') {
+ if (s[0] != ' ' &&
+ (strchr(quoted, s[0]) != NULL || s[0] == '~') &&
+ s[1] == '\0') {
xasprintf(&escaped, "\\%c", s[0]);
return (escaped);
}
diff --git a/cfg.c b/cfg.c
index f781e825..c29292b2 100644
--- a/cfg.c
+++ b/cfg.c
@@ -90,14 +90,14 @@ start_cfg(void)
}
if (cfg_file == NULL)
- load_cfg(TMUX_CONF, NULL, NULL, CMD_PARSE_QUIET, NULL);
+ load_cfg(TMUX_CONF, c, NULL, CMD_PARSE_QUIET, NULL);
if (cfg_file == NULL && (home = find_home()) != NULL) {
xasprintf(&cfg_file, "%s/.tmux.conf", home);
flags = CMD_PARSE_QUIET;
}
if (cfg_file != NULL)
- load_cfg(cfg_file, NULL, NULL, flags, NULL);
+ load_cfg(cfg_file, c, NULL, flags, NULL);
cmdq_append(NULL, cmdq_get_callback(cfg_done, NULL));
}
@@ -127,6 +127,7 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int flags,
pi.file = path;
pi.line = 1;
pi.item = item;
+ pi.c = c;
pr = cmd_parse_from_file(f, &pi);
fclose(f);
@@ -146,7 +147,7 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int flags,
if (item != NULL)
cmdq_insert_after(item, new_item0);
else
- cmdq_append(c, new_item0);
+ cmdq_append(NULL, new_item0);
cmd_list_free(pr->cmdlist);
if (new_item != NULL)
diff --git a/cmd-show-options.c b/cmd-show-options.c
index 756f763c..8548d515 100644
--- a/cmd-show-options.c
+++ b/cmd-show-options.c
@@ -30,16 +30,16 @@
static enum cmd_retval cmd_show_options_exec(struct cmd *, struct cmdq_item *);
static void cmd_show_options_print(struct cmd *, struct cmdq_item *,
- struct options_entry *, int);
+ struct options_entry *, int, int);
static enum cmd_retval cmd_show_options_all(struct cmd *, struct cmdq_item *,
- struct options *);
+ enum options_table_scope, struct options *);
const struct cmd_entry cmd_show_options_entry = {
.name = "show-options",
.alias = "show",
- .args = { "gHqst:vw", 0, 1 },
- .usage = "[-gHqsvw] [-t target-session|target-window] [option]",
+ .args = { "AgHqst:vw", 0, 1 },
+ .usage = "[-AgHqsvw] [-t target-session|target-window] [option]",
.target = { 't', CMD_FIND_WINDOW, CMD_FIND_CANFAIL },
@@ -85,7 +85,7 @@ cmd_show_options_exec(struct cmd *self, struct cmdq_item *item)
enum options_table_scope scope;
char *argument, *name = NULL, *cause;
const char *target;
- int window, idx, ambiguous;
+ int window, idx, ambiguous, parent;
struct options_entry *o;
window = (self->entry == &cmd_show_window_options_entry);
@@ -98,7 +98,7 @@ cmd_show_options_exec(struct cmd *self, struct cmdq_item *item)
free(cause);
return (CMD_RETURN_ERROR);
}
- return (cmd_show_options_all(self, item, oo));
+ return (cmd_show_options_all(self, item, scope, oo));
}
argument = format_single(item, args->argv[0], c, s, wl, NULL);
@@ -163,8 +163,13 @@ cmd_show_options_exec(struct cmd *self, struct cmdq_item *item)
goto fail;
}
o = options_get_only(oo, name);
+ if (args_has(args, 'A') && o == NULL) {
+ o = options_get(oo, name);
+ parent = 1;
+ } else
+ parent = 0;
if (o != NULL)
- cmd_show_options_print(self, item, o, idx);
+ cmd_show_options_print(self, item, o, idx, parent);
free(name);
free(argument);
@@ -178,7 +183,7 @@ fail:
static void
cmd_show_options_print(struct cmd *self, struct cmdq_item *item,
- struct options_entry *o, int idx)
+ struct options_entry *o, int idx, int parent)
{
struct options_array_item *a;
const char *name = options_name(o);
@@ -197,7 +202,8 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item,
}
while (a != NULL) {
idx = options_array_item_index(a);
- cmd_show_options_print(self, item, o, idx);
+ cmd_show_options_print(self, item, o, idx,
+ parent);
a = options_array_next(a);
}
return;
@@ -209,10 +215,17 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item,
cmdq_print(item, "%s", value);
else if (options_isstring(o)) {
escaped = args_escape(value);
- cmdq_print(item, "%s %s", name, escaped);
+ if (parent)
+ cmdq_print(item, "%s* %s", name, escaped);
+ else
+ cmdq_print(item, "%s %s", name, escaped);
free(escaped);
- } else
- cmdq_print(item, "%s %s", name, value);
+ } else {
+ if (parent)
+ cmdq_print(item, "%s* %s", name, value);
+ else
+ cmdq_print(item, "%s %s", name, value);
+ }
free(value);
free(tmp);
@@ -220,39 +233,54 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item,
static enum cmd_retval
cmd_show_options_all(struct cmd *self, struct cmdq_item *item,
- struct options *oo)
+ enum options_table_scope scope, struct options *oo)
{
+ const struct options_table_entry *oe;
struct options_entry *o;
struct options_array_item *a;
u_int idx;
- const struct options_table_entry *oe;
+ int parent;
+
+ for (oe = options_table; oe->name != NULL; oe++) {
+ if (oe->scope != scope)
+ continue;
- o = options_first(oo);
- while (o != NULL) {
- oe = options_table_entry(o);
if ((self->entry != &cmd_show_hooks_entry &&
!args_has(self->args, 'H') &&
oe != NULL &&
(oe->flags & OPTIONS_TABLE_IS_HOOK)) ||
(self->entry == &cmd_show_hooks_entry &&
(oe == NULL ||
- (~oe->flags & OPTIONS_TABLE_IS_HOOK)))) {
- o = options_next(o);
+ (~oe->flags & OPTIONS_TABLE_IS_HOOK))))
continue;
- }
+
+ o = options_get_only(oo, oe->name);
+ if (o == NULL) {
+ if (!args_has(self->args, 'A'))
+ continue;
+ o = options_get(oo, oe->name);
+ if (o == NULL)
+ continue;
+ parent = 1;
+ } else
+ parent = 0;
+
if (!options_isarray(o))
- cmd_show_options_print(self, item, o, -1);
+ cmd_show_options_print(self, item, o, -1, parent);
else if ((a = options_array_first(o)) == NULL) {
- if (!args_has(self->args, 'v'))
- cmdq_print(item, "%s", options_name(o));
+ if (!args_has(self->args, 'v')) {
+ if (parent)
+ cmdq_print(item, "%s*", options_name(o));
+ else
+ cmdq_print(item, "%s", options_name(o));
+ }
} else {
while (a != NULL) {
idx = options_array_item_index(a);
- cmd_show_options_print(self, item, o, idx);
+ cmd_show_options_print(self, item, o, idx, parent);
a = options_array_next(a);
}
}
- o = options_next(o);
}
return (CMD_RETURN_NORMAL);
}
diff --git a/format.c b/format.c
index f5754f0d..dec8932e 100644
--- a/format.c
+++ b/format.c
@@ -2022,10 +2022,10 @@ void
format_defaults(struct format_tree *ft, struct client *c, struct session *s,
struct winlink *wl, struct window_pane *wp)
{
- if (c != NULL)
+ if (c != NULL && c->name != NULL)
log_debug("%s: c=%s", __func__, c->name);
else
- log_debug("%s: s=none", __func__);
+ log_debug("%s: c=none", __func__);
if (s != NULL)
log_debug("%s: s=$%u", __func__, s->id);
else
diff --git a/server-client.c b/server-client.c
index ae41278a..0382b58f 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1948,26 +1948,29 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
close(c->fd);
c->fd = -1;
-
- return;
- }
-
- if (c->fd == -1)
- return;
- if (tty_init(&c->tty, c, c->fd, c->term) != 0) {
- close(c->fd);
- c->fd = -1;
- return;
+ } else if (c->fd != -1) {
+ if (tty_init(&c->tty, c, c->fd, c->term) != 0) {
+ close(c->fd);
+ c->fd = -1;
+ } else {
+ if (c->flags & CLIENT_UTF8)
+ c->tty.flags |= TTY_UTF8;
+ if (c->flags & CLIENT_256COLOURS)
+ c->tty.term_flags |= TERM_256COLOURS;
+ tty_resize(&c->tty);
+ c->flags |= CLIENT_TERMINAL;
+ }
}
- if (c->flags & CLIENT_UTF8)
- c->tty.flags |= TTY_UTF8;
- if (c->flags & CLIENT_256COLOURS)
- c->tty.term_flags |= TERM_256COLOURS;
- tty_resize(&c->tty);
-
- if (!(c->flags & CLIENT_CONTROL))
- c->flags |= CLIENT_TERMINAL;
+ /*
+ * If this is the first client that has finished identifying, load
+ * configuration files.
+ */
+ if ((~c->flags & CLIENT_EXIT) &&
+ !cfg_finished &&
+ c == TAILQ_FIRST(&clients) &&
+ TAILQ_NEXT(c, entry) == NULL)
+ start_cfg();
}
/* Handle shell message. */
diff --git a/server.c b/server.c
index eceb83e5..a5d5e37f 100644
--- a/server.c
+++ b/server.c
@@ -207,8 +207,7 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
cmdq_append(c, cmdq_get_error(cause));
free(cause);
c->flags |= CLIENT_EXIT;
- } else
- start_cfg();
+ }
server_add_accept(0);
proc_loop(server_proc, server_loop);
diff --git a/tmux.1 b/tmux.1
index 9188ba47..6aa6d29f 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3685,7 +3685,7 @@ function key sequences; these have a number included to indicate modifiers such
as Shift, Alt or Ctrl.
.El
.It Xo Ic show-options
-.Op Fl gHqsvw
+.Op Fl AgHqsvw
.Op Fl t Ar target-session | Ar target-window
.Op Ar option
.Xc
@@ -3719,6 +3719,9 @@ is set, no error will be returned if
is unset.
.Fl H
includes hooks (omitted by default).
+.Fl A
+includes options inherited from a parent set of options, such options are
+marked with an asterisk.
.It Xo Ic show-window-options
.Op Fl gv
.Op Fl t Ar target-window