version 1.37, 2021/03/16 09:14:58 |
version 1.38, 2021/08/12 08:05:11 |
|
|
|
|
struct notify_entry { |
struct notify_entry { |
const char *name; |
const char *name; |
|
struct cmd_find_state fs; |
|
struct format_tree *formats; |
|
|
struct client *client; |
struct client *client; |
struct session *session; |
struct session *session; |
struct window *window; |
struct window *window; |
int pane; |
int pane; |
|
|
struct cmd_find_state fs; |
|
}; |
}; |
|
|
static void |
static void |
notify_hook_formats(struct cmdq_state *state, struct session *s, |
|
struct window *w, int pane) |
|
{ |
|
if (s != NULL) { |
|
cmdq_add_format(state, "hook_session", "$%u", s->id); |
|
cmdq_add_format(state, "hook_session_name", "%s", s->name); |
|
} |
|
if (w != NULL) { |
|
cmdq_add_format(state, "hook_window", "@%u", w->id); |
|
cmdq_add_format(state, "hook_window_name", "%s", w->name); |
|
} |
|
if (pane != -1) |
|
cmdq_add_format(state, "hook_pane", "%%%d", pane); |
|
} |
|
|
|
static void |
|
notify_insert_hook(struct cmdq_item *item, struct notify_entry *ne) |
notify_insert_hook(struct cmdq_item *item, struct notify_entry *ne) |
{ |
{ |
struct cmd_find_state fs; |
struct cmd_find_state fs; |
struct options *oo; |
struct options *oo; |
struct cmdq_item *new_item; |
struct cmdq_item *new_item; |
struct cmdq_state *new_state; |
struct cmdq_state *new_state; |
struct session *s = ne->session; |
|
struct window *w = ne->window; |
|
struct options_entry *o; |
struct options_entry *o; |
struct options_array_item *a; |
struct options_array_item *a; |
struct cmd_list *cmdlist; |
struct cmd_list *cmdlist; |
|
|
return; |
return; |
|
|
new_state = cmdq_new_state(&fs, NULL, CMDQ_STATE_NOHOOKS); |
new_state = cmdq_new_state(&fs, NULL, CMDQ_STATE_NOHOOKS); |
cmdq_add_format(new_state, "hook", "%s", ne->name); |
cmdq_add_formats(new_state, ne->formats); |
notify_hook_formats(new_state, s, w, ne->pane); |
|
|
|
a = options_array_first(o); |
a = options_array_first(o); |
while (a != NULL) { |
while (a != NULL) { |
|
|
if (ne->fs.s != NULL) |
if (ne->fs.s != NULL) |
session_remove_ref(ne->fs.s, __func__); |
session_remove_ref(ne->fs.s, __func__); |
|
|
|
format_free(ne->formats); |
free((void *)ne->name); |
free((void *)ne->name); |
free(ne); |
free(ne); |
|
|
|
|
ne->client = c; |
ne->client = c; |
ne->session = s; |
ne->session = s; |
ne->window = w; |
ne->window = w; |
|
ne->pane = (wp != NULL ? wp->id : -1); |
|
|
|
ne->formats = format_create(NULL, NULL, 0, FORMAT_NOJOBS); |
|
format_add(ne->formats, "hook", "%s", name); |
|
if (c != NULL) |
|
format_add(ne->formats, "hook_client", "%s", c->name); |
|
if (s != NULL) { |
|
format_add(ne->formats, "hook_session", "$%u", s->id); |
|
format_add(ne->formats, "hook_session_name", "%s", s->name); |
|
} |
|
if (w != NULL) { |
|
format_add(ne->formats, "hook_window", "@%u", w->id); |
|
format_add(ne->formats, "hook_window_name", "%s", w->name); |
|
} |
if (wp != NULL) |
if (wp != NULL) |
ne->pane = wp->id; |
format_add(ne->formats, "hook_pane", "%%%d", wp->id); |
else |
format_log_debug(ne->formats, __func__); |
ne->pane = -1; |
|
|
|
if (c != NULL) |
if (c != NULL) |
c->references++; |
c->references++; |
|
|
ne.window = target->w; |
ne.window = target->w; |
ne.pane = target->wp->id; |
ne.pane = target->wp->id; |
|
|
|
ne.formats = format_create(NULL, NULL, 0, FORMAT_NOJOBS); |
|
format_add(ne.formats, "hook", "%s", name); |
|
format_log_debug(ne.formats, __func__); |
|
|
notify_insert_hook(item, &ne); |
notify_insert_hook(item, &ne); |
|
format_free(ne.formats); |
} |
} |
|
|
void |
void |