version 1.39, 2021/08/12 08:10:20 |
version 1.40, 2022/03/08 21:58:37 |
|
|
int pane; |
int pane; |
}; |
}; |
|
|
|
static struct cmdq_item * |
|
notify_insert_one_hook(struct cmdq_item *item, struct notify_entry *ne, |
|
struct cmd_list *cmdlist, struct cmdq_state *state) |
|
{ |
|
struct cmdq_item *new_item; |
|
char *s; |
|
|
|
if (cmdlist == NULL) |
|
return (item); |
|
if (log_get_level() != 0) { |
|
s = cmd_list_print(cmdlist, 0); |
|
log_debug("%s: hook %s is: %s", __func__, ne->name, s); |
|
free (s); |
|
} |
|
new_item = cmdq_get_command(cmdlist, state); |
|
return (cmdq_insert_after(item, new_item)); |
|
} |
|
|
static void |
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_state *state; |
struct cmdq_state *new_state; |
|
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; |
|
const char *value; |
|
struct cmd_parse_result *pr; |
|
|
log_debug("%s: %s", __func__, ne->name); |
log_debug("%s: inserting hook %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)) |
|
|
oo = fs.wl->window->options; |
oo = fs.wl->window->options; |
o = options_get(oo, ne->name); |
o = options_get(oo, ne->name); |
} |
} |
if (o == NULL) |
if (o == NULL) { |
|
log_debug("%s: hook %s not found", __func__, ne->name); |
return; |
return; |
|
} |
|
|
new_state = cmdq_new_state(&fs, NULL, CMDQ_STATE_NOHOOKS); |
state = cmdq_new_state(&fs, NULL, CMDQ_STATE_NOHOOKS); |
cmdq_add_formats(new_state, ne->formats); |
cmdq_add_formats(state, ne->formats); |
|
|
a = options_array_first(o); |
if (*ne->name == '@') { |
while (a != NULL) { |
value = options_get_string(oo, ne->name); |
cmdlist = options_array_item_value(a)->cmdlist; |
pr = cmd_parse_from_string(value, NULL); |
if (cmdlist != NULL) { |
switch (pr->status) { |
new_item = cmdq_get_command(cmdlist, new_state); |
case CMD_PARSE_ERROR: |
item = cmdq_insert_after(item, new_item); |
log_debug("%s: can't parse hook %s: %s", __func__, |
|
ne->name, pr->error); |
|
free(pr->error); |
|
break; |
|
case CMD_PARSE_SUCCESS: |
|
notify_insert_one_hook(item, ne, pr->cmdlist, state); |
|
break; |
} |
} |
a = options_array_next(a); |
} else { |
|
a = options_array_first(o); |
|
while (a != NULL) { |
|
cmdlist = options_array_item_value(a)->cmdlist; |
|
item = notify_insert_one_hook(item, ne, cmdlist, state); |
|
a = options_array_next(a); |
|
} |
} |
} |
|
|
cmdq_free_state(new_state); |
cmdq_free_state(state); |
} |
} |
|
|
static enum cmd_retval |
static enum cmd_retval |