From cf6075fb29fcd86f11a1f2cc6e906c62f39d4032 Mon Sep 17 00:00:00 2001
From: nicm <nicm>
Date: Fri, 3 May 2019 15:43:01 +0000
Subject: [PATCH] Correct ordering when adding after an existing item.

---
 cmd-queue.c | 24 +++++++++---------------
 tmux.h      |  2 +-
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/cmd-queue.c b/cmd-queue.c
index 9ce25f5f..14d6a824 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -66,6 +66,7 @@ cmdq_append(struct client *c, struct cmdq_item *item)
 
 		item->queue = queue;
 		TAILQ_INSERT_TAIL(queue, item, entry);
+		log_debug("%s %s: %s", __func__, cmdq_name(c), item->name);
 
 		item = next;
 	} while (item != NULL);
@@ -81,18 +82,17 @@ cmdq_insert_after(struct cmdq_item *after, struct cmdq_item *item)
 
 	do {
 		next = item->next;
-		item->next = NULL;
+		item->next = after->next;
+		after->next = item;
 
 		if (c != NULL)
 			c->references++;
 		item->client = c;
 
 		item->queue = queue;
-		if (after->next != NULL)
-			TAILQ_INSERT_AFTER(queue, after->next, item, entry);
-		else
-			TAILQ_INSERT_AFTER(queue, after, item, entry);
-		after->next = item;
+		TAILQ_INSERT_AFTER(queue, after, item, entry);
+		log_debug("%s %s: %s after %s", __func__, cmdq_name(c),
+		    item->name, after->name);
 
 		item = next;
 	} while (item != NULL);
@@ -170,7 +170,7 @@ cmdq_remove(struct cmdq_item *item)
 
 	TAILQ_REMOVE(item->queue, item, entry);
 
-	free((void *)item->name);
+	free(item->name);
 	free(item);
 }
 
@@ -206,7 +206,6 @@ cmdq_get_command(struct cmd_list *cmdlist, struct cmd_find_state *current,
 	struct cmdq_item	*item, *first = NULL, *last = NULL;
 	struct cmd		*cmd;
 	u_int			 group = cmdq_next_group();
-	char			*tmp;
 	struct cmdq_shared	*shared;
 
 	shared = xcalloc(1, sizeof *shared);
@@ -218,10 +217,8 @@ cmdq_get_command(struct cmd_list *cmdlist, struct cmd_find_state *current,
 		memcpy(&shared->mouse, m, sizeof shared->mouse);
 
 	TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
-		xasprintf(&tmp, "command[%s]", cmd->entry->name);
-
 		item = xcalloc(1, sizeof *item);
-		item->name = tmp;
+		xasprintf(&item->name, "[%s/%p]", cmd->entry->name, item);
 		item->type = CMDQ_COMMAND;
 
 		item->group = group;
@@ -316,12 +313,9 @@ struct cmdq_item *
 cmdq_get_callback1(const char *name, cmdq_cb cb, void *data)
 {
 	struct cmdq_item	*item;
-	char			*tmp;
-
-	xasprintf(&tmp, "callback[%s]", name);
 
 	item = xcalloc(1, sizeof *item);
-	item->name = tmp;
+	xasprintf(&item->name, "[%s/%p]", name, item);
 	item->type = CMDQ_CALLBACK;
 
 	item->group = 0;
diff --git a/tmux.h b/tmux.h
index 4f69301f..e8d03c4b 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1291,7 +1291,7 @@ struct cmdq_shared {
 /* Command queue item. */
 typedef enum cmd_retval (*cmdq_cb) (struct cmdq_item *, void *);
 struct cmdq_item {
-	const char		*name;
+	char			*name;
 	struct cmdq_list	*queue;
 	struct cmdq_item	*next;