version 1.26, 2018/07/04 12:30:52 |
version 1.27, 2019/04/26 11:38:51 |
|
|
}; |
}; |
|
|
static void |
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; |
if (s != NULL) { |
struct hook *hook; |
cmdq_format(item, "hook_session", "$%u", s->id); |
struct cmdq_item *new_item; |
cmdq_format(item, "hook_session_name", "%s", s->name); |
struct session *s = ne->session; |
} |
struct window *w = ne->window; |
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); |
cmd_find_clear_state(&fs, 0); |
if (cmd_find_empty_state(&ne->fs) || !cmd_find_valid_state(&ne->fs)) |
if (cmd_find_empty_state(&ne->fs) || !cmd_find_valid_state(&ne->fs)) |
cmd_find_from_nothing(&fs, 0); |
cmd_find_from_nothing(&fs, 0); |
else |
else |
cmd_find_copy_state(&fs, &ne->fs); |
cmd_find_copy_state(&fs, &ne->fs); |
|
|
hook = hooks_find(hooks_get(fs.s), ne->name); |
if (fs.s == NULL) |
if (hook == NULL) |
oo = global_s_options; |
|
else |
|
oo = fs.s->options; |
|
o = options_get(oo, ne->name); |
|
if (o == NULL) |
return; |
return; |
log_debug("notify hook %s", ne->name); |
|
|
|
new_item = cmdq_get_command(hook->cmdlist, &fs, NULL, CMDQ_NOHOOKS); |
a = options_array_first(o); |
cmdq_format(new_item, "hook", "%s", ne->name); |
while (a != NULL) { |
|
cmdlist = options_array_item_value(a)->cmdlist; |
|
if (cmdlist == NULL) { |
|
a = options_array_next(a); |
|
continue; |
|
} |
|
|
if (s != NULL) { |
new_item = cmdq_get_command(cmdlist, &fs, NULL, CMDQ_NOHOOKS); |
cmdq_format(new_item, "hook_session", "$%u", s->id); |
cmdq_format(new_item, "hook", "%s", ne->name); |
cmdq_format(new_item, "hook_session_name", "%s", s->name); |
notify_hook_formats(new_item, s, w, ne->pane); |
} |
|
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); |
cmdq_insert_after(item, new_item); |
|
item = new_item; |
|
|
|
a = options_array_next(a); |
|
} |
} |
} |
|
|
static enum cmd_retval |
static enum cmd_retval |
|
|
if (strcmp(ne->name, "session-window-changed") == 0) |
if (strcmp(ne->name, "session-window-changed") == 0) |
control_notify_session_window_changed(ne->session); |
control_notify_session_window_changed(ne->session); |
|
|
notify_hook1(item, ne); |
notify_insert_hook(item, ne); |
|
|
if (ne->client != NULL) |
if (ne->client != NULL) |
server_client_unref(ne->client); |
server_client_unref(ne->client); |
|
|
ne.window = item->target.w; |
ne.window = item->target.w; |
ne.pane = item->target.wp->id; |
ne.pane = item->target.wp->id; |
|
|
notify_hook1(item, &ne); |
notify_insert_hook(item, &ne); |
} |
} |
|
|
void |
void |