=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-queue.c,v retrieving revision 1.62 retrieving revision 1.63 diff -c -r1.62 -r1.63 *** src/usr.bin/tmux/cmd-queue.c 2019/04/17 14:37:48 1.62 --- src/usr.bin/tmux/cmd-queue.c 2019/04/26 11:38:51 1.63 *************** *** 1,4 **** ! /* $OpenBSD: cmd-queue.c,v 1.62 2019/04/17 14:37:48 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-queue.c,v 1.63 2019/04/26 11:38:51 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott *************** *** 98,103 **** --- 98,157 ---- } while (item != NULL); } + + /* Insert a hook. */ + void + cmdq_insert_hook(struct session *s, struct cmdq_item *item, + struct cmd_find_state *fs, const char *fmt, ...) + { + struct options *oo; + va_list ap; + char *name; + struct cmdq_item *new_item; + struct options_entry *o; + struct options_array_item *a; + struct cmd_list *cmdlist; + + if (item->flags & CMDQ_NOHOOKS) + return; + if (s == NULL) + oo = global_s_options; + else + oo = s->options; + + va_start(ap, fmt); + xvasprintf(&name, fmt, ap); + va_end(ap); + + o = options_get(oo, name); + if (o == NULL) { + free(name); + return; + } + log_debug("running hook %s (parent %p)", name, item); + + a = options_array_first(o); + while (a != NULL) { + cmdlist = options_array_item_value(a)->cmdlist; + if (cmdlist == NULL) { + a = options_array_next(a); + continue; + } + + new_item = cmdq_get_command(cmdlist, fs, NULL, CMDQ_NOHOOKS); + cmdq_format(new_item, "hook", "%s", name); + if (item != NULL) { + cmdq_insert_after(item, new_item); + item = new_item; + } else + cmdq_append(NULL, new_item); + + a = options_array_next(a); + } + + free(name); + } + /* Remove an item. */ static void cmdq_remove(struct cmdq_item *item) *************** *** 245,251 **** fsp = &fs; else goto out; ! hooks_insert(fsp->s->hooks, item, fsp, "after-%s", entry->name); } out: --- 299,305 ---- fsp = &fs; else goto out; ! cmdq_insert_hook(fsp->s, item, fsp, "after-%s", entry->name); } out: