summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/cmd-unbind-key.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-07-28 17:05:11 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-07-28 17:05:11 +0000
commitfdac46d6f899b49d104690311de0ac64162d89c7 (patch)
tree6fe1930e84dcda9cec807062c454025470bc2b10 /usr.bin/tmux/cmd-unbind-key.c
parente08be4259306569ce6c3e59161bc8478e4dd2f56 (diff)
Final pieces of mode key rebinding: bind-key and unbind-key now accept a -t
argument to modify a table.
Diffstat (limited to 'usr.bin/tmux/cmd-unbind-key.c')
-rw-r--r--usr.bin/tmux/cmd-unbind-key.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/usr.bin/tmux/cmd-unbind-key.c b/usr.bin/tmux/cmd-unbind-key.c
index 63b8aa0f998..16eb94982a4 100644
--- a/usr.bin/tmux/cmd-unbind-key.c
+++ b/usr.bin/tmux/cmd-unbind-key.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-unbind-key.c,v 1.4 2009/07/26 12:58:44 nicm Exp $ */
+/* $OpenBSD: cmd-unbind-key.c,v 1.5 2009/07/28 17:05:10 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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);
}