summaryrefslogtreecommitdiffstats
path: root/cmd-set-option.c
diff options
context:
space:
mode:
authornicm <nicm>2019-04-26 11:38:51 +0000
committernicm <nicm>2019-04-26 11:38:51 +0000
commitdfb7bb683057d08303955c49073f4b475bd0e2d6 (patch)
tree3adae7924f831bce4f28ec5aef5528793319ada4 /cmd-set-option.c
parentf1e14f86c4d2467571e20a3dca4a96a3cc357897 (diff)
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).
Diffstat (limited to 'cmd-set-option.c')
-rw-r--r--cmd-set-option.c39
1 files changed, 34 insertions, 5 deletions
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);
}