From dfb7bb683057d08303955c49073f4b475bd0e2d6 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 26 Apr 2019 11:38:51 +0000 Subject: Merge hooks into options and make each one an array option. This allows multiple commands to be easily bound to one hook. set-hook and show-hooks remain but they are now variants of set-option and show-options. show-options now has a -H flag to show hooks (by default they are not shown). --- cmd-set-option.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'cmd-set-option.c') diff --git a/cmd-set-option.c b/cmd-set-option.c index edeb8385..7be561f2 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -65,6 +65,19 @@ const struct cmd_entry cmd_set_window_option_entry = { .exec = cmd_set_option_exec }; +const struct cmd_entry cmd_set_hook_entry = { + .name = "set-hook", + .alias = NULL, + + .args = { "agRt:u", 1, 2 }, + .usage = "[-agRu] " CMD_TARGET_SESSION_USAGE " hook [command]", + + .target = { 't', CMD_FIND_SESSION, CMD_FIND_CANFAIL }, + + .flags = CMD_AFTERHOOK, + .exec = cmd_set_option_exec +}; + static enum cmd_retval cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) { @@ -87,6 +100,11 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) c = cmd_find_client(item, NULL, 1); argument = format_single(item, args->argv[0], c, s, wl, NULL); + if (self->entry == &cmd_set_hook_entry && args_has(args, 'R')) { + notify_hook(item, argument); + return (CMD_RETURN_NORMAL); + } + /* Parse option name and index. */ name = options_match(argument, &idx, &ambiguous); if (name == NULL) { @@ -200,8 +218,11 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) options_default(oo, options_table_entry(o)); else options_remove(o); - } else - options_array_set(o, idx, NULL, 0); + } else if (options_array_set(o, idx, NULL, 0, &cause) != 0) { + cmdq_error(item, "%s", cause); + free(cause); + goto fail; + } } else if (*name == '@') { if (value == NULL) { cmdq_error(item, "empty value"); @@ -222,9 +243,15 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) if (idx == -1) { if (!append) options_array_clear(o); - options_array_assign(o, value); - } else if (options_array_set(o, idx, value, append) != 0) { - cmdq_error(item, "invalid index: %s", argument); + if (options_array_assign(o, value, &cause) != 0) { + cmdq_error(item, "%s", cause); + free(cause); + goto fail; + } + } else if (options_array_set(o, idx, value, append, + &cause) != 0) { + cmdq_error(item, "%s", cause); + free(cause); goto fail; } } @@ -366,6 +393,8 @@ cmd_set_option_set(struct cmd *self, struct cmdq_item *item, struct options *oo, return (-1); } return (0); + case OPTIONS_TABLE_COMMAND: + break; } return (-1); } -- cgit