diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2009-07-28 07:03:32 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2009-07-28 07:03:32 +0000 |
commit | 86785004baf4086816b5d6684b9d0e4c56b58ea6 (patch) | |
tree | 822c8656bcf8c550a62c5bd00cb072f92542b48a /cmd-list-keys.c | |
parent | 2da48644837cd51cfe5a9628140866f06e049e50 (diff) | |
download | rtmux-86785004baf4086816b5d6684b9d0e4c56b58ea6.tar.gz rtmux-86785004baf4086816b5d6684b9d0e4c56b58ea6.tar.bz2 rtmux-86785004baf4086816b5d6684b9d0e4c56b58ea6.zip |
Next step towards customisable mode keys: build each default table of keys into
a named tree on start and use that for lookups. Also add command to string
translation tables and modify list-keys to show the the mode key bindings (new
-t argument).
Diffstat (limited to 'cmd-list-keys.c')
-rw-r--r-- | cmd-list-keys.c | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/cmd-list-keys.c b/cmd-list-keys.c index 9110d12a..0a22e82c 100644 --- a/cmd-list-keys.c +++ b/cmd-list-keys.c @@ -28,25 +28,31 @@ int cmd_list_keys_exec(struct cmd *, struct cmd_ctx *); +int cmd_list_keys_table(struct cmd *, struct cmd_ctx *); + const struct cmd_entry cmd_list_keys_entry = { "list-keys", "lsk", - "", + "[-t key-table]", 0, 0, - NULL, - NULL, + cmd_target_init, + cmd_target_parse, cmd_list_keys_exec, - NULL, - NULL + cmd_target_free, + cmd_target_print }; int -cmd_list_keys_exec(unused struct cmd *self, struct cmd_ctx *ctx) +cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx) { + struct cmd_target_data *data = self->data; struct key_binding *bd; const char *key; char tmp[BUFSIZ], keytmp[64]; int width, keywidth; + if (data->target != NULL) + return (cmd_list_keys_table(self, ctx)); + width = 0; SPLAY_FOREACH(bd, key_bindings, &key_bindings) { key = key_string_lookup_key(bd->key & ~KEYC_PREFIX); @@ -76,3 +82,48 @@ cmd_list_keys_exec(unused struct cmd *self, struct cmd_ctx *ctx) return (0); } + +int +cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx) +{ + struct cmd_target_data *data = self->data; + const struct mode_key_table *mtab; + struct mode_key_binding *mbind; + const char *key, *cmdstr, *mode; + int width, keywidth; + + for (mtab = mode_key_tables; mtab->name != NULL; mtab++) { + if (strcasecmp(data->target, mtab->name) == 0) + break; + } + if (mtab->name == NULL) { + ctx->error(ctx, "unknown key table: %s", data->target); + return (-1); + } + + width = 0; + SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { + key = key_string_lookup_key(mbind->key); + if (key == NULL) + continue; + + keywidth = strlen(key) + 1; + if (keywidth > width) + width = keywidth; + } + + SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { + key = key_string_lookup_key(mbind->key); + if (key == NULL) + continue; + + mode = ""; + if (mbind->mode != 0) + mode = "(command mode) "; + cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd); + if (cmdstr != NULL) + ctx->print(ctx, "%*s: %s%s", width, key, mode, cmdstr); + } + + return (0); +} |