diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2017-04-21 14:01:20 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2017-04-21 14:01:20 +0000 |
commit | c521d87a41b11d6987fdcaf75709093b0a77e53a (patch) | |
tree | 7c33f37a1241ef688f36146b3479ca22637a7025 /usr.bin/tmux/cmd-queue.c | |
parent | 012593b8fe9dfa1f026f22abd12ff45e0190cf7b (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.c | 32 |
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); } |