Sync OpenBSD patchset 1106:

Make unbind-key -a work with -t, based on a diff from Kazuhiko Sakaguchi.
This commit is contained in:
Tiago Cunha 2012-05-12 14:56:10 +00:00
parent 673b1abe5f
commit 5f92f62ac3

View File

@ -42,7 +42,7 @@ const struct cmd_entry cmd_unbind_key_entry = {
int int
cmd_unbind_key_check(struct args *args) cmd_unbind_key_check(struct args *args)
{ {
if (args_has(args, 'a') && (args->argc != 0 || args_has(args, 't'))) if (args_has(args, 'a') && args->argc != 0)
return (-1); return (-1);
if (!args_has(args, 'a') && args->argc != 1) if (!args_has(args, 'a') && args->argc != 1)
return (-1); return (-1);
@ -56,7 +56,19 @@ cmd_unbind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx)
struct key_binding *bd; struct key_binding *bd;
int key; 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)) { while (!RB_EMPTY(&key_bindings)) {
bd = RB_ROOT(&key_bindings); bd = RB_ROOT(&key_bindings);
key_bindings_remove(bd->key); key_bindings_remove(bd->key);
@ -64,15 +76,6 @@ cmd_unbind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx)
return (0); 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')) if (!args_has(args, 'n'))
key |= KEYC_PREFIX; key |= KEYC_PREFIX;
key_bindings_remove(key); key_bindings_remove(key);
@ -93,6 +96,15 @@ cmd_unbind_key_table(struct cmd *self, struct cmd_ctx *ctx, int key)
return (-1); 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.key = key;
mtmp.mode = !!args_has(args, 'c'); mtmp.mode = !!args_has(args, 'c');
if ((mbind = RB_FIND(mode_key_tree, mtab->tree, &mtmp)) != NULL) { if ((mbind = RB_FIND(mode_key_tree, mtab->tree, &mtmp)) != NULL) {