summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd-bind-key.c13
-rw-r--r--cmd-list.c20
-rw-r--r--key-bindings.c7
-rw-r--r--tmux.c2
-rw-r--r--tmux.h5
5 files changed, 32 insertions, 15 deletions
diff --git a/cmd-bind-key.c b/cmd-bind-key.c
index c535612f..60887904 100644
--- a/cmd-bind-key.c
+++ b/cmd-bind-key.c
@@ -130,7 +130,7 @@ cmd_bind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx)
return (cmd_bind_key_table(self, ctx));
key_bindings_add(data->key, data->can_repeat, data->cmdlist);
- data->cmdlist = NULL; /* avoid free */
+ data->cmdlist->references++;
return (0);
}
@@ -192,8 +192,17 @@ cmd_bind_key_print(struct cmd *self, char *buf, size_t len)
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
+
+ if (off < len && data->command_key)
+ off += xsnprintf(buf + off, len - off, " -c");
+ if (off < len && !(data->key & KEYC_PREFIX))
+ off += xsnprintf(buf + off, len - off, " -n");
+ if (off < len && data->can_repeat)
+ off += xsnprintf(buf + off, len - off, " -r");
+ if (off < len && data->tablename != NULL)
+ off += cmd_prarg(buf + off, len - off, " -t ", data->tablename);
if (off < len) {
- skey = key_string_lookup_key(data->key);
+ skey = key_string_lookup_key(data->key & ~KEYC_PREFIX);
off += xsnprintf(buf + off, len - off, " %s ", skey);
}
if (off < len)
diff --git a/cmd-list.c b/cmd-list.c
index 55550c21..181127ae 100644
--- a/cmd-list.c
+++ b/cmd-list.c
@@ -32,7 +32,8 @@ cmd_list_parse(int argc, char **argv, char **cause)
char **new_argv;
cmdlist = xmalloc(sizeof *cmdlist);
- TAILQ_INIT(cmdlist);
+ cmdlist->references = 1;
+ TAILQ_INIT(&cmdlist->list);
lastsplit = 0;
for (i = 0; i < argc; i++) {
@@ -54,7 +55,7 @@ cmd_list_parse(int argc, char **argv, char **cause)
cmd = cmd_parse(new_argc, new_argv, cause);
if (cmd == NULL)
goto bad;
- TAILQ_INSERT_TAIL(cmdlist, cmd, qentry);
+ TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
lastsplit = i + 1;
}
@@ -63,7 +64,7 @@ cmd_list_parse(int argc, char **argv, char **cause)
cmd = cmd_parse(argc - lastsplit, argv + lastsplit, cause);
if (cmd == NULL)
goto bad;
- TAILQ_INSERT_TAIL(cmdlist, cmd, qentry);
+ TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
}
return (cmdlist);
@@ -80,7 +81,7 @@ cmd_list_exec(struct cmd_list *cmdlist, struct cmd_ctx *ctx)
int n, retval;
retval = 0;
- TAILQ_FOREACH(cmd, cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if ((n = cmd_exec(cmd, ctx)) == -1)
return (-1);
@@ -114,9 +115,12 @@ cmd_list_free(struct cmd_list *cmdlist)
{
struct cmd *cmd;
- while (!TAILQ_EMPTY(cmdlist)) {
- cmd = TAILQ_FIRST(cmdlist);
- TAILQ_REMOVE(cmdlist, cmd, qentry);
+ if (--cmdlist->references != 0)
+ return;
+
+ while (!TAILQ_EMPTY(&cmdlist->list)) {
+ cmd = TAILQ_FIRST(&cmdlist->list);
+ TAILQ_REMOVE(&cmdlist->list, cmd, qentry);
cmd_free(cmd);
}
xfree(cmdlist);
@@ -129,7 +133,7 @@ cmd_list_print(struct cmd_list *cmdlist, char *buf, size_t len)
size_t off;
off = 0;
- TAILQ_FOREACH(cmd, cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (off >= len)
break;
off += cmd_print(cmd, buf + off, len - off);
diff --git a/key-bindings.c b/key-bindings.c
index ac4039f9..2a039af0 100644
--- a/key-bindings.c
+++ b/key-bindings.c
@@ -178,14 +178,15 @@ key_bindings_init(void)
for (i = 0; i < nitems(table); i++) {
cmdlist = xmalloc(sizeof *cmdlist);
- TAILQ_INIT(cmdlist);
+ TAILQ_INIT(&cmdlist->list);
+ cmdlist->references = 1;
cmd = xmalloc(sizeof *cmd);
cmd->entry = table[i].entry;
cmd->data = NULL;
if (cmd->entry->init != NULL)
cmd->entry->init(cmd, table[i].key);
- TAILQ_INSERT_HEAD(cmdlist, cmd, qentry);
+ TAILQ_INSERT_HEAD(&cmdlist->list, cmd, qentry);
key_bindings_add(
table[i].key | KEYC_PREFIX, table[i].can_repeat, cmdlist);
@@ -259,7 +260,7 @@ key_bindings_dispatch(struct key_binding *bd, struct client *c)
ctx.cmdclient = NULL;
readonly = 1;
- TAILQ_FOREACH(cmd, bd->cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &bd->cmdlist->list, qentry) {
if (!(cmd->entry->flags & CMD_READONLY))
readonly = 0;
}
diff --git a/tmux.c b/tmux.c
index 28f822ce..f85a3556 100644
--- a/tmux.c
+++ b/tmux.c
@@ -517,7 +517,7 @@ main(int argc, char **argv)
exit(1);
}
cmdflags &= ~CMD_STARTSERVER;
- TAILQ_FOREACH(cmd, cmdlist, qentry) {
+ TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (cmd->entry->flags & CMD_STARTSERVER)
cmdflags |= CMD_STARTSERVER;
if (cmd->entry->flags & CMD_SENDENVIRON)
diff --git a/tmux.h b/tmux.h
index 7d6c2e70..6b158cd7 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1161,7 +1161,10 @@ struct cmd {
TAILQ_ENTRY(cmd) qentry;
};
-TAILQ_HEAD(cmd_list, cmd);
+struct cmd_list {
+ int references;
+ TAILQ_HEAD(, cmd) list;
+};
struct cmd_entry {
const char *name;