=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/notify.c,v retrieving revision 1.26 retrieving revision 1.27 diff -c -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 **** ! /* $OpenBSD: notify.c,v 1.26 2018/07/04 12:30:52 nicm Exp $ */ /* * Copyright (c) 2012 George Nachman --- 1,4 ---- ! /* $OpenBSD: notify.c,v 1.27 2019/04/26 11:38:51 nicm Exp $ */ /* * Copyright (c) 2012 George Nachman *************** *** 36,75 **** }; static void ! notify_hook1(struct cmdq_item *item, struct notify_entry *ne) { ! struct cmd_find_state fs; ! struct hook *hook; ! struct cmdq_item *new_item; ! struct session *s = ne->session; ! struct window *w = ne->window; 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) 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); ! 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); ! cmdq_insert_after(item, new_item); } static enum cmd_retval --- 36,101 ---- }; static void ! notify_hook_formats(struct cmdq_item *item, struct session *s, struct window *w, ! int pane) { ! 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); ! if (fs.s == NULL) ! oo = global_s_options; ! else ! oo = fs.s->options; ! o = options_get(oo, ne->name); ! if (o == NULL) return; ! 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", ne->name); ! notify_hook_formats(new_item, s, w, ne->pane); ! cmdq_insert_after(item, new_item); ! item = new_item; ! ! a = options_array_next(a); ! } } static enum cmd_retval *************** *** 102,108 **** if (strcmp(ne->name, "session-window-changed") == 0) control_notify_session_window_changed(ne->session); ! notify_hook1(item, ne); if (ne->client != NULL) server_client_unref(ne->client); --- 128,134 ---- if (strcmp(ne->name, "session-window-changed") == 0) control_notify_session_window_changed(ne->session); ! notify_insert_hook(item, ne); if (ne->client != NULL) server_client_unref(ne->client); *************** *** 169,175 **** ne.window = item->target.w; ne.pane = item->target.wp->id; ! notify_hook1(item, &ne); } void --- 195,201 ---- ne.window = item->target.w; ne.pane = item->target.wp->id; ! notify_insert_hook(item, &ne); } void