summaryrefslogtreecommitdiffstats
path: root/cmd-unbind-key.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2012-05-12 14:56:10 +0000
committerTiago Cunha <tcunha@gmx.com>2012-05-12 14:56:10 +0000
commit5f92f62ac38f9e957f99ee46ada6054694d098f9 (patch)
treead702d2fae7280796290df19d2d573602b46d4ca /cmd-unbind-key.c
parent673b1abe5fac6fb8dfdeb83f73b270060a966bc2 (diff)
Sync OpenBSD patchset 1106:
Make unbind-key -a work with -t, based on a diff from Kazuhiko Sakaguchi.
Diffstat (limited to 'cmd-unbind-key.c')
-rw-r--r--cmd-unbind-key.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c
index 723edac3..5773f3d0 100644
--- a/cmd-unbind-key.c
+++ b/cmd-unbind-key.c
@@ -42,8 +42,8 @@ const struct cmd_entry cmd_unbind_key_entry = {
int
cmd_unbind_key_check(struct args *args)
{
- if (args_has(args, 'a') && (args->argc != 0 || args_has(args, 't')))
- return (-1);
+ if (args_has(args, 'a') && args->argc != 0)
+ return (-1);
if (!args_has(args, 'a') && args->argc != 1)
return (-1);
return (0);
@@ -56,7 +56,19 @@ cmd_unbind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx)
struct key_binding *bd;
int key;
- if (args_has(args, 'a')) {
+ if (!args_has(args, 'a')) {
+ key = key_string_lookup_string(args->argv[0]);
+ if (key == KEYC_NONE) {
+ ctx->error(ctx, "unknown key: %s", args->argv[0]);
+ return (-1);
+ }
+ } else
+ key = KEYC_NONE;
+
+ if (args_has(args, 't'))
+ return (cmd_unbind_key_table(self, ctx, key));
+
+ if (key == KEYC_NONE) {
while (!RB_EMPTY(&key_bindings)) {
bd = RB_ROOT(&key_bindings);
key_bindings_remove(bd->key);
@@ -64,15 +76,6 @@ cmd_unbind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx)
return (0);
}
- 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);
@@ -93,6 +96,15 @@ cmd_unbind_key_table(struct cmd *self, struct cmd_ctx *ctx, int key)
return (-1);
}
+ if (key == KEYC_NONE) {
+ while (!RB_EMPTY(mtab->tree)) {
+ mbind = RB_ROOT(mtab->tree);
+ RB_REMOVE(mode_key_tree, mtab->tree, mbind);
+ xfree(mbind);
+ }
+ return (0);
+ }
+
mtmp.key = key;
mtmp.mode = !!args_has(args, 'c');
if ((mbind = RB_FIND(mode_key_tree, mtab->tree, &mtmp)) != NULL) {