summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/cmd-queue.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2017-04-21 14:01:20 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2017-04-21 14:01:20 +0000
commitc521d87a41b11d6987fdcaf75709093b0a77e53a (patch)
tree7c33f37a1241ef688f36146b3479ca22637a7025 /usr.bin/tmux/cmd-queue.c
parent012593b8fe9dfa1f026f22abd12ff45e0190cf7b (diff)
Store state shared between multiple commands in the queue in a shared
structure.
Diffstat (limited to 'usr.bin/tmux/cmd-queue.c')
-rw-r--r--usr.bin/tmux/cmd-queue.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/usr.bin/tmux/cmd-queue.c b/usr.bin/tmux/cmd-queue.c
index f1f7512a7a8..b4313ea2ec4 100644
--- a/usr.bin/tmux/cmd-queue.c
+++ b/usr.bin/tmux/cmd-queue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-queue.c,v 1.48 2017/02/03 11:57:27 nicm Exp $ */
+/* $OpenBSD: cmd-queue.c,v 1.49 2017/04/21 14:01:19 nicm Exp $ */
/*
* Copyright (c) 2013 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -102,8 +102,11 @@ cmdq_insert_after(struct cmdq_item *after, struct cmdq_item *item)
static void
cmdq_remove(struct cmdq_item *item)
{
- if (item->formats != NULL)
- format_free(item->formats);
+ if (item->shared != NULL && --item->shared->references == 0) {
+ if (item->shared->formats != NULL)
+ format_free(item->shared->formats);
+ free(item->shared);
+ }
if (item->client != NULL)
server_client_unref(item->client);
@@ -150,6 +153,13 @@ cmdq_get_command(struct cmd_list *cmdlist, struct cmd_find_state *current,
struct cmd *cmd;
u_int group = cmdq_next_group();
char *tmp;
+ struct cmdq_shared *shared;
+
+ shared = xcalloc(1, sizeof *shared);
+ if (current != NULL)
+ cmd_find_copy_state(&shared->current, current);
+ if (m != NULL)
+ memcpy(&shared->mouse, m, sizeof shared->mouse);
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
xasprintf(&tmp, "command[%s]", cmd->entry->name);
@@ -161,13 +171,11 @@ cmdq_get_command(struct cmd_list *cmdlist, struct cmd_find_state *current,
item->group = group;
item->flags = flags;
+ item->shared = shared;
item->cmdlist = cmdlist;
item->cmd = cmd;
- if (current != NULL)
- cmd_find_copy_state(&item->current, current);
- if (m != NULL)
- memcpy(&item->mouse, m, sizeof item->mouse);
+ shared->references++;
cmdlist->references++;
if (first == NULL)
@@ -258,19 +266,17 @@ cmdq_fire_callback(struct cmdq_item *item)
void
cmdq_format(struct cmdq_item *item, const char *key, const char *fmt, ...)
{
+ struct cmdq_shared *shared = item->shared;
va_list ap;
- struct cmdq_item *loop;
char *value;
va_start(ap, fmt);
xvasprintf(&value, fmt, ap);
va_end(ap);
- for (loop = item; loop != NULL; loop = item->next) {
- if (loop->formats == NULL)
- loop->formats = format_create(NULL, FORMAT_NONE, 0);
- format_add(loop->formats, key, "%s", value);
- }
+ if (shared->formats == NULL)
+ shared->formats = format_create(NULL, FORMAT_NONE, 0);
+ format_add(shared->formats, key, "%s", value);
free(value);
}