1*0a6a1f1dSLionel Sambuc /* Id */
2eda6f593SDavid van Moolenbroek
3eda6f593SDavid van Moolenbroek /*
4eda6f593SDavid van Moolenbroek * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
5eda6f593SDavid van Moolenbroek *
6eda6f593SDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any
7eda6f593SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8eda6f593SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9eda6f593SDavid van Moolenbroek *
10eda6f593SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11eda6f593SDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12eda6f593SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13eda6f593SDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14eda6f593SDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15eda6f593SDavid van Moolenbroek * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16eda6f593SDavid van Moolenbroek * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17eda6f593SDavid van Moolenbroek */
18eda6f593SDavid van Moolenbroek
19eda6f593SDavid van Moolenbroek #include <sys/types.h>
20eda6f593SDavid van Moolenbroek
21eda6f593SDavid van Moolenbroek #include <string.h>
22eda6f593SDavid van Moolenbroek
23eda6f593SDavid van Moolenbroek #include "tmux.h"
24eda6f593SDavid van Moolenbroek
25eda6f593SDavid van Moolenbroek /*
26eda6f593SDavid van Moolenbroek * List key bindings.
27eda6f593SDavid van Moolenbroek */
28eda6f593SDavid van Moolenbroek
29*0a6a1f1dSLionel Sambuc enum cmd_retval cmd_list_keys_exec(struct cmd *, struct cmd_q *);
30*0a6a1f1dSLionel Sambuc enum cmd_retval cmd_list_keys_table(struct cmd *, struct cmd_q *);
31eda6f593SDavid van Moolenbroek
32eda6f593SDavid van Moolenbroek const struct cmd_entry cmd_list_keys_entry = {
33eda6f593SDavid van Moolenbroek "list-keys", "lsk",
34eda6f593SDavid van Moolenbroek "t:", 0, 0,
35eda6f593SDavid van Moolenbroek "[-t key-table]",
36eda6f593SDavid van Moolenbroek 0,
37eda6f593SDavid van Moolenbroek NULL,
38eda6f593SDavid van Moolenbroek cmd_list_keys_exec
39eda6f593SDavid van Moolenbroek };
40eda6f593SDavid van Moolenbroek
41*0a6a1f1dSLionel Sambuc enum cmd_retval
cmd_list_keys_exec(struct cmd * self,struct cmd_q * cmdq)42*0a6a1f1dSLionel Sambuc cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
43eda6f593SDavid van Moolenbroek {
44eda6f593SDavid van Moolenbroek struct args *args = self->args;
45eda6f593SDavid van Moolenbroek struct key_binding *bd;
46eda6f593SDavid van Moolenbroek const char *key;
47eda6f593SDavid van Moolenbroek char tmp[BUFSIZ], flags[8];
48eda6f593SDavid van Moolenbroek size_t used;
49eda6f593SDavid van Moolenbroek int width, keywidth;
50eda6f593SDavid van Moolenbroek
51eda6f593SDavid van Moolenbroek if (args_has(args, 't'))
52*0a6a1f1dSLionel Sambuc return (cmd_list_keys_table(self, cmdq));
53eda6f593SDavid van Moolenbroek
54eda6f593SDavid van Moolenbroek width = 0;
55eda6f593SDavid van Moolenbroek
56*0a6a1f1dSLionel Sambuc RB_FOREACH(bd, key_bindings, &key_bindings) {
57eda6f593SDavid van Moolenbroek key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
58eda6f593SDavid van Moolenbroek if (key == NULL)
59eda6f593SDavid van Moolenbroek continue;
60eda6f593SDavid van Moolenbroek
61eda6f593SDavid van Moolenbroek keywidth = strlen(key);
62eda6f593SDavid van Moolenbroek if (!(bd->key & KEYC_PREFIX)) {
63eda6f593SDavid van Moolenbroek if (bd->can_repeat)
64eda6f593SDavid van Moolenbroek keywidth += 4;
65eda6f593SDavid van Moolenbroek else
66eda6f593SDavid van Moolenbroek keywidth += 3;
67eda6f593SDavid van Moolenbroek } else if (bd->can_repeat)
68eda6f593SDavid van Moolenbroek keywidth += 3;
69eda6f593SDavid van Moolenbroek if (keywidth > width)
70eda6f593SDavid van Moolenbroek width = keywidth;
71eda6f593SDavid van Moolenbroek }
72eda6f593SDavid van Moolenbroek
73*0a6a1f1dSLionel Sambuc RB_FOREACH(bd, key_bindings, &key_bindings) {
74eda6f593SDavid van Moolenbroek key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
75eda6f593SDavid van Moolenbroek if (key == NULL)
76eda6f593SDavid van Moolenbroek continue;
77eda6f593SDavid van Moolenbroek
78*0a6a1f1dSLionel Sambuc *flags = '\0';
79eda6f593SDavid van Moolenbroek if (!(bd->key & KEYC_PREFIX)) {
80eda6f593SDavid van Moolenbroek if (bd->can_repeat)
81eda6f593SDavid van Moolenbroek xsnprintf(flags, sizeof flags, "-rn ");
82eda6f593SDavid van Moolenbroek else
83eda6f593SDavid van Moolenbroek xsnprintf(flags, sizeof flags, "-n ");
84eda6f593SDavid van Moolenbroek } else if (bd->can_repeat)
85eda6f593SDavid van Moolenbroek xsnprintf(flags, sizeof flags, "-r ");
86eda6f593SDavid van Moolenbroek
87eda6f593SDavid van Moolenbroek used = xsnprintf(tmp, sizeof tmp, "%s%*s ",
88eda6f593SDavid van Moolenbroek flags, (int) (width - strlen(flags)), key);
89eda6f593SDavid van Moolenbroek if (used >= sizeof tmp)
90eda6f593SDavid van Moolenbroek continue;
91eda6f593SDavid van Moolenbroek
92eda6f593SDavid van Moolenbroek cmd_list_print(bd->cmdlist, tmp + used, (sizeof tmp) - used);
93*0a6a1f1dSLionel Sambuc cmdq_print(cmdq, "bind-key %s", tmp);
94eda6f593SDavid van Moolenbroek }
95eda6f593SDavid van Moolenbroek
96*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
97eda6f593SDavid van Moolenbroek }
98eda6f593SDavid van Moolenbroek
99*0a6a1f1dSLionel Sambuc enum cmd_retval
cmd_list_keys_table(struct cmd * self,struct cmd_q * cmdq)100*0a6a1f1dSLionel Sambuc cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
101eda6f593SDavid van Moolenbroek {
102eda6f593SDavid van Moolenbroek struct args *args = self->args;
103eda6f593SDavid van Moolenbroek const char *tablename;
104eda6f593SDavid van Moolenbroek const struct mode_key_table *mtab;
105eda6f593SDavid van Moolenbroek struct mode_key_binding *mbind;
106eda6f593SDavid van Moolenbroek const char *key, *cmdstr, *mode;
107eda6f593SDavid van Moolenbroek int width, keywidth, any_mode;
108eda6f593SDavid van Moolenbroek
109eda6f593SDavid van Moolenbroek tablename = args_get(args, 't');
110eda6f593SDavid van Moolenbroek if ((mtab = mode_key_findtable(tablename)) == NULL) {
111*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "unknown key table: %s", tablename);
112*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
113eda6f593SDavid van Moolenbroek }
114eda6f593SDavid van Moolenbroek
115eda6f593SDavid van Moolenbroek width = 0;
116eda6f593SDavid van Moolenbroek any_mode = 0;
117*0a6a1f1dSLionel Sambuc RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
118eda6f593SDavid van Moolenbroek key = key_string_lookup_key(mbind->key);
119eda6f593SDavid van Moolenbroek if (key == NULL)
120eda6f593SDavid van Moolenbroek continue;
121eda6f593SDavid van Moolenbroek
122eda6f593SDavid van Moolenbroek if (mbind->mode != 0)
123eda6f593SDavid van Moolenbroek any_mode = 1;
124eda6f593SDavid van Moolenbroek
125eda6f593SDavid van Moolenbroek keywidth = strlen(key);
126eda6f593SDavid van Moolenbroek if (keywidth > width)
127eda6f593SDavid van Moolenbroek width = keywidth;
128eda6f593SDavid van Moolenbroek }
129eda6f593SDavid van Moolenbroek
130*0a6a1f1dSLionel Sambuc RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
131eda6f593SDavid van Moolenbroek key = key_string_lookup_key(mbind->key);
132eda6f593SDavid van Moolenbroek if (key == NULL)
133eda6f593SDavid van Moolenbroek continue;
134eda6f593SDavid van Moolenbroek
135eda6f593SDavid van Moolenbroek mode = "";
136eda6f593SDavid van Moolenbroek if (mbind->mode != 0)
137eda6f593SDavid van Moolenbroek mode = "c";
138eda6f593SDavid van Moolenbroek cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
139eda6f593SDavid van Moolenbroek if (cmdstr != NULL) {
140*0a6a1f1dSLionel Sambuc cmdq_print(cmdq, "bind-key -%st %s%s %*s %s%s%s%s",
141eda6f593SDavid van Moolenbroek mode, any_mode && *mode == '\0' ? " " : "",
142*0a6a1f1dSLionel Sambuc mtab->name, (int) width, key, cmdstr,
143*0a6a1f1dSLionel Sambuc mbind->arg != NULL ? " \"" : "",
144*0a6a1f1dSLionel Sambuc mbind->arg != NULL ? mbind->arg : "",
145*0a6a1f1dSLionel Sambuc mbind->arg != NULL ? "\"": "");
146eda6f593SDavid van Moolenbroek }
147eda6f593SDavid van Moolenbroek }
148eda6f593SDavid van Moolenbroek
149*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
150eda6f593SDavid van Moolenbroek }
151