summaryrefslogtreecommitdiffstats
path: root/cmd-unbind-key.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-07-28 17:05:10 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-07-28 17:05:10 +0000
commitf596be99505a0191cac9f314fb1b71528c5080b4 (patch)
tree1e765f4841da1107e11322d7ba62445f61ec67af /cmd-unbind-key.c
parent9e5d585ba4b0af6badf559cc7b275a23be8947c2 (diff)
Final pieces of mode key rebinding: bind-key and unbind-key now accept a -t
argument to modify a table.
Diffstat (limited to 'cmd-unbind-key.c')
-rw-r--r--cmd-unbind-key.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c
index 35c43658..8f5e794e 100644
--- a/cmd-unbind-key.c
+++ b/cmd-unbind-key.c
@@ -28,13 +28,18 @@ int cmd_unbind_key_parse(struct cmd *, int, char **, char **);
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 command_key;
+ char *tablename;
};
const struct cmd_entry cmd_unbind_key_entry = {
"unbind-key", "unbind",
- "[-n] key",
+ "[-cn] [-t key-table] key",
0, 0,
NULL,
cmd_unbind_key_parse,
@@ -50,12 +55,20 @@ cmd_unbind_key_parse(struct cmd *self, int argc, char **argv, char **cause)
int opt, no_prefix = 0;
self->data = data = xmalloc(sizeof *data);
+ data->command_key = 0;
+ data->tablename = NULL;
- while ((opt = getopt(argc, argv, "n")) != -1) {
+ while ((opt = getopt(argc, argv, "cnt:")) != -1) {
switch (opt) {
+ case 'c':
+ data->command_key = 1;
+ break;
case 'n':
no_prefix = 1;
break;
+ case 't':
+ data->tablename = xstrdup(optarg);
+ break;
default:
goto usage;
}
@@ -89,16 +102,41 @@ cmd_unbind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx)
if (data == NULL)
return (0);
+ if (data->tablename != NULL)
+ return (cmd_unbind_key_table(self, ctx));
key_bindings_remove(data->key);
return (0);
}
+int
+cmd_unbind_key_table(struct cmd *self, struct cmd_ctx *ctx)
+{
+ struct cmd_unbind_key_data *data = self->data;
+ 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);
+ return (-1);
+ }
+
+ mtmp.key = data->key & ~KEYC_PREFIX;
+ mtmp.mode = data->command_key ? 1 : 0;
+ 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);
}