=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/notify.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- src/usr.bin/tmux/notify.c 2018/07/04 12:30:52 1.26 +++ src/usr.bin/tmux/notify.c 2019/04/26 11:38:51 1.27 @@ -1,4 +1,4 @@ -/* $OpenBSD: notify.c,v 1.26 2018/07/04 12:30:52 nicm Exp $ */ +/* $OpenBSD: notify.c,v 1.27 2019/04/26 11:38:51 nicm Exp $ */ /* * Copyright (c) 2012 George Nachman @@ -36,40 +36,66 @@ }; static void -notify_hook1(struct cmdq_item *item, struct notify_entry *ne) +notify_hook_formats(struct cmdq_item *item, struct session *s, struct window *w, + int pane) { - struct cmd_find_state fs; - struct hook *hook; - struct cmdq_item *new_item; - struct session *s = ne->session; - struct window *w = ne->window; + if (s != NULL) { + cmdq_format(item, "hook_session", "$%u", s->id); + cmdq_format(item, "hook_session_name", "%s", s->name); + } + if (w != NULL) { + cmdq_format(item, "hook_window", "@%u", w->id); + cmdq_format(item, "hook_window_name", "%s", w->name); + } + if (pane != -1) + cmdq_format(item, "hook_pane", "%%%d", pane); +} +static void +notify_insert_hook(struct cmdq_item *item, struct notify_entry *ne) +{ + struct cmd_find_state fs; + struct options *oo; + struct cmdq_item *new_item; + struct session *s = ne->session; + struct window *w = ne->window; + struct options_entry *o; + struct options_array_item *a; + struct cmd_list *cmdlist; + + log_debug("%s: %s", __func__, ne->name); + cmd_find_clear_state(&fs, 0); if (cmd_find_empty_state(&ne->fs) || !cmd_find_valid_state(&ne->fs)) cmd_find_from_nothing(&fs, 0); else cmd_find_copy_state(&fs, &ne->fs); - hook = hooks_find(hooks_get(fs.s), ne->name); - if (hook == NULL) + if (fs.s == NULL) + oo = global_s_options; + else + oo = fs.s->options; + o = options_get(oo, ne->name); + if (o == NULL) return; - log_debug("notify hook %s", ne->name); - new_item = cmdq_get_command(hook->cmdlist, &fs, NULL, CMDQ_NOHOOKS); - cmdq_format(new_item, "hook", "%s", ne->name); + a = options_array_first(o); + while (a != NULL) { + cmdlist = options_array_item_value(a)->cmdlist; + if (cmdlist == NULL) { + a = options_array_next(a); + continue; + } - if (s != NULL) { - cmdq_format(new_item, "hook_session", "$%u", s->id); - cmdq_format(new_item, "hook_session_name", "%s", s->name); - } - if (w != NULL) { - cmdq_format(new_item, "hook_window", "@%u", w->id); - cmdq_format(new_item, "hook_window_name", "%s", w->name); - } - if (ne->pane != -1) - cmdq_format(new_item, "hook_pane", "%%%d", ne->pane); + new_item = cmdq_get_command(cmdlist, &fs, NULL, CMDQ_NOHOOKS); + cmdq_format(new_item, "hook", "%s", ne->name); + notify_hook_formats(new_item, s, w, ne->pane); - cmdq_insert_after(item, new_item); + cmdq_insert_after(item, new_item); + item = new_item; + + a = options_array_next(a); + } } static enum cmd_retval @@ -102,7 +128,7 @@ if (strcmp(ne->name, "session-window-changed") == 0) control_notify_session_window_changed(ne->session); - notify_hook1(item, ne); + notify_insert_hook(item, ne); if (ne->client != NULL) server_client_unref(ne->client); @@ -169,7 +195,7 @@ ne.window = item->target.w; ne.pane = item->target.wp->id; - notify_hook1(item, &ne); + notify_insert_hook(item, &ne); } void