diff options
author | Thomas Adam <thomas@xteddy.org> | 2019-04-27 20:09:07 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2019-04-27 20:09:07 +0100 |
commit | 5489796737108cb9bba01f831421e531a50b946b (patch) | |
tree | 4f3c2727315adabaf5d932a1d81d4fad3e491752 /notify.c | |
parent | 85f09f9a4cf52b5af6b84464ea643c7c3686b0ad (diff) | |
parent | dfb7bb683057d08303955c49073f4b475bd0e2d6 (diff) | |
download | rtmux-5489796737108cb9bba01f831421e531a50b946b.tar.gz rtmux-5489796737108cb9bba01f831421e531a50b946b.tar.bz2 rtmux-5489796737108cb9bba01f831421e531a50b946b.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'notify.c')
-rw-r--r-- | notify.c | 74 |
1 files changed, 50 insertions, 24 deletions
@@ -35,13 +35,34 @@ struct notify_entry { }; 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)) @@ -49,26 +70,31 @@ notify_hook1(struct cmdq_item *item, struct notify_entry *ne) 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 @@ -101,7 +127,7 @@ notify_callback(struct cmdq_item *item, void *data) 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); @@ -168,7 +194,7 @@ notify_hook(struct cmdq_item *item, const char *name) ne.window = item->target.w; ne.pane = item->target.wp->id; - notify_hook1(item, &ne); + notify_insert_hook(item, &ne); } void |