xref: /minix3/external/bsd/tmux/dist/cmd-list-keys.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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