summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2020-04-14 08:01:33 +0100
committerThomas Adam <thomas@xteddy.org>2020-04-14 08:01:33 +0100
commit6d9b3704f58a9806912ac0a734ac996f96c22b68 (patch)
tree6e19406e5883c93f18bdca5f02990685b8fab301
parent653a159225609f7e5efb45bc78cdf7b480d7ef93 (diff)
parent63ec7918542a36ac9afa60b2e91f75337c5a91ff (diff)
Merge branch 'obsd-master'
-rw-r--r--cmd-queue.c36
-rw-r--r--notify.c9
-rw-r--r--tmux.h1
3 files changed, 33 insertions, 13 deletions
diff --git a/cmd-queue.c b/cmd-queue.c
index 16c58401..5df30940 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -64,7 +64,7 @@ struct cmdq_item {
TAILQ_ENTRY(cmdq_item) entry;
};
-TAILQ_HEAD(cmdq_list, cmdq_item);
+TAILQ_HEAD(cmdq_item_list, cmdq_item);
/*
* Command queue state. This is the context for commands on the command queue.
@@ -83,6 +83,12 @@ struct cmdq_state {
struct cmd_find_state current;
};
+/* Command queue. */
+struct cmdq_list {
+ struct cmdq_item *item;
+ struct cmdq_item_list list;
+};
+
/* Get command queue name. */
static const char *
cmdq_name(struct client *c)
@@ -119,7 +125,7 @@ cmdq_new(void)
struct cmdq_list *queue;
queue = xcalloc (1, sizeof *queue);
- TAILQ_INIT (queue);
+ TAILQ_INIT (&queue->list);
return (queue);
}
@@ -127,7 +133,7 @@ cmdq_new(void)
void
cmdq_free(struct cmdq_list *queue)
{
- if (!TAILQ_EMPTY(queue))
+ if (!TAILQ_EMPTY(&queue->list))
fatalx("queue not empty");
free(queue);
}
@@ -289,12 +295,12 @@ cmdq_append(struct client *c, struct cmdq_item *item)
item->client = c;
item->queue = queue;
- TAILQ_INSERT_TAIL(queue, item, entry);
+ TAILQ_INSERT_TAIL(&queue->list, item, entry);
log_debug("%s %s: %s", __func__, cmdq_name(c), item->name);
item = next;
} while (item != NULL);
- return (TAILQ_LAST(queue, cmdq_list));
+ return (TAILQ_LAST(&queue->list, cmdq_item_list));
}
/* Insert an item. */
@@ -315,7 +321,7 @@ cmdq_insert_after(struct cmdq_item *after, struct cmdq_item *item)
item->client = c;
item->queue = queue;
- TAILQ_INSERT_AFTER(queue, after, item, entry);
+ TAILQ_INSERT_AFTER(&queue->list, after, item, entry);
log_debug("%s %s: %s after %s", __func__, cmdq_name(c),
item->name, after->name);
@@ -399,7 +405,7 @@ cmdq_remove(struct cmdq_item *item)
cmd_list_free(item->cmdlist);
cmdq_free_state(item->state);
- TAILQ_REMOVE(item->queue, item, entry);
+ TAILQ_REMOVE(&item->queue->list, item, entry);
free(item->name);
free(item);
@@ -621,18 +627,18 @@ cmdq_next(struct client *c)
u_int items = 0;
static u_int number;
- if (TAILQ_EMPTY(queue)) {
+ if (TAILQ_EMPTY(&queue->list)) {
log_debug("%s %s: empty", __func__, name);
return (0);
}
- if (TAILQ_FIRST(queue)->flags & CMDQ_WAITING) {
+ if (TAILQ_FIRST(&queue->list)->flags & CMDQ_WAITING) {
log_debug("%s %s: waiting", __func__, name);
return (0);
}
log_debug("%s %s: enter", __func__, name);
for (;;) {
- item = TAILQ_FIRST(queue);
+ item = queue->item = TAILQ_FIRST(&queue->list);
if (item == NULL)
break;
log_debug("%s %s: %s (%d), flags %x", __func__, name,
@@ -682,6 +688,7 @@ cmdq_next(struct client *c)
}
cmdq_remove(item);
}
+ queue->item = NULL;
log_debug("%s %s: exit (empty)", __func__, name);
return (items);
@@ -691,6 +698,15 @@ waiting:
return (items);
}
+/* Get running item if any. */
+struct cmdq_item *
+cmdq_running(struct client *c)
+{
+ struct cmdq_list *queue = cmdq_get(c);
+
+ return (queue->item);
+}
+
/* Print a guard line. */
void
cmdq_guard(struct cmdq_item *item, const char *guard, int flags)
diff --git a/notify.c b/notify.c
index d6a88a76..e5ce761b 100644
--- a/notify.c
+++ b/notify.c
@@ -157,7 +157,11 @@ notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
struct session *s, struct window *w, struct window_pane *wp)
{
struct notify_entry *ne;
- struct cmdq_item *new_item;
+ struct cmdq_item *item;
+
+ item = cmdq_running(NULL);
+ if (item != NULL && (cmdq_get_flags(item) & CMDQ_STATE_NOHOOKS))
+ return;
ne = xcalloc(1, sizeof *ne);
ne->name = xstrdup(name);
@@ -182,8 +186,7 @@ notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
if (ne->fs.s != NULL) /* cmd_find_valid_state needs session */
session_add_ref(ne->fs.s, __func__);
- new_item = cmdq_get_callback(notify_callback, ne);
- cmdq_append(NULL, new_item);
+ cmdq_append(NULL, cmdq_get_callback(notify_callback, ne));
}
void
diff --git a/tmux.h b/tmux.h
index 4fafe41e..882d8107 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2134,6 +2134,7 @@ void cmdq_insert_hook(struct session *, struct cmdq_item *,
struct cmd_find_state *, const char *, ...);
void cmdq_continue(struct cmdq_item *);
u_int cmdq_next(struct client *);
+struct cmdq_item *cmdq_running(struct client *);
void cmdq_guard(struct cmdq_item *, const char *, int);
void printflike(2, 3) cmdq_print(struct cmdq_item *, const char *, ...);
void printflike(2, 3) cmdq_error(struct cmdq_item *, const char *, ...);