diff options
Diffstat (limited to 'cmd-unbind-key.c')
-rw-r--r-- | cmd-unbind-key.c | 126 |
1 files changed, 33 insertions, 93 deletions
diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c index f95342b9..7dab5683 100644 --- a/cmd-unbind-key.c +++ b/cmd-unbind-key.c @@ -24,140 +24,80 @@ * Unbind key from command. */ -int cmd_unbind_key_parse(struct cmd *, int, char **, char **); +int cmd_unbind_key_check(struct args *); int cmd_unbind_key_exec(struct cmd *, struct cmd_ctx *); -void cmd_unbind_key_free(struct cmd *); -int cmd_unbind_key_table(struct cmd *, struct cmd_ctx *); - -struct cmd_unbind_key_data { - int key; - - int flag_all; - int command_key; - char *tablename; -}; +int cmd_unbind_key_table(struct cmd *, struct cmd_ctx *, int); const struct cmd_entry cmd_unbind_key_entry = { "unbind-key", "unbind", + "acnt:", 1, 1, "[-acn] [-t key-table] key", - 0, "", + 0, NULL, - cmd_unbind_key_parse, - cmd_unbind_key_exec, - cmd_unbind_key_free, - NULL + cmd_unbind_key_check, + cmd_unbind_key_exec }; int -cmd_unbind_key_parse(struct cmd *self, int argc, char **argv, char **cause) +cmd_unbind_key_check(struct args *args) { - struct cmd_unbind_key_data *data; - int opt, no_prefix = 0; - - self->data = data = xmalloc(sizeof *data); - data->flag_all = 0; - data->command_key = 0; - data->tablename = NULL; - - while ((opt = getopt(argc, argv, "acnt:")) != -1) { - switch (opt) { - case 'a': - data->flag_all = 1; - break; - case 'c': - data->command_key = 1; - break; - case 'n': - no_prefix = 1; - break; - case 't': - if (data->tablename == NULL) - data->tablename = xstrdup(optarg); - break; - default: - goto usage; - } - } - argc -= optind; - argv += optind; - if (data->flag_all && (argc != 0 || data->tablename)) - goto usage; - if (!data->flag_all && argc != 1) - goto usage; - - if (!data->flag_all) { - data->key = key_string_lookup_string(argv[0]); - if (data->key == KEYC_NONE) { - xasprintf(cause, "unknown key: %s", argv[0]); - goto error; - } - if (!no_prefix) - data->key |= KEYC_PREFIX; - } - + if (args_has(args, 'a') && (args->argc != 0 || args_has(args, 't'))) + return (-1); return (0); - -usage: - xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage); - -error: - xfree(data); - return (-1); } int cmd_unbind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx) { - struct cmd_unbind_key_data *data = self->data; - struct key_binding *bd; + struct args *args = self->args; + struct key_binding *bd; + int key; - if (data == NULL) - return (0); - if (data->flag_all) { + if (args_has(args, 'a')) { while (!SPLAY_EMPTY(&key_bindings)) { bd = SPLAY_ROOT(&key_bindings); SPLAY_REMOVE(key_bindings, &key_bindings, bd); cmd_list_free(bd->cmdlist); xfree(bd); } - } else { - if (data->tablename != NULL) - return (cmd_unbind_key_table(self, ctx)); + return (0); + } - key_bindings_remove(data->key); + key = key_string_lookup_string(args->argv[0]); + if (key == KEYC_NONE) { + ctx->error(ctx, "unknown key: %s", args->argv[0]); + return (-1); } + if (args_has(args, 't')) + return (cmd_unbind_key_table(self, ctx, key)); + + if (!args_has(args, 'n')) + key |= KEYC_PREFIX; + key_bindings_remove(key); return (0); } int -cmd_unbind_key_table(struct cmd *self, struct cmd_ctx *ctx) +cmd_unbind_key_table(struct cmd *self, struct cmd_ctx *ctx, int key) { - struct cmd_unbind_key_data *data = self->data; + struct args *args = self->args; + const char *tablename; const struct mode_key_table *mtab; struct mode_key_binding *mbind, mtmp; - if ((mtab = mode_key_findtable(data->tablename)) == NULL) { - ctx->error(ctx, "unknown key table: %s", data->tablename); + tablename = args_get(args, 't'); + if ((mtab = mode_key_findtable(tablename)) == NULL) { + ctx->error(ctx, "unknown key table: %s", tablename); return (-1); } - mtmp.key = data->key & ~KEYC_PREFIX; - mtmp.mode = data->command_key ? 1 : 0; + mtmp.key = key; + mtmp.mode = !!args_has(args, 'c'); if ((mbind = SPLAY_FIND(mode_key_tree, mtab->tree, &mtmp)) != NULL) { SPLAY_REMOVE(mode_key_tree, mtab->tree, mbind); xfree(mbind); } return (0); } - -void -cmd_unbind_key_free(struct cmd *self) -{ - struct cmd_unbind_key_data *data = self->data; - - if (data->tablename != NULL) - xfree(data->tablename); - xfree(data); -} |