Home | History | Annotate | Line # | Download | only in dist
cmd-list-keys.c revision 1.1
      1 /* $Id: cmd-list-keys.c,v 1.1 2011/03/10 09:15:37 jmmv Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2007 Nicholas Marriott <nicm (at) users.sourceforge.net>
      5  *
      6  * Permission to use, copy, modify, and distribute this software for any
      7  * purpose with or without fee is hereby granted, provided that the above
      8  * copyright notice and this permission notice appear in all copies.
      9  *
     10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
     15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
     16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     17  */
     18 
     19 #include <sys/types.h>
     20 
     21 #include <string.h>
     22 
     23 #include "tmux.h"
     24 
     25 /*
     26  * List key bindings.
     27  */
     28 
     29 int	cmd_list_keys_exec(struct cmd *, struct cmd_ctx *);
     30 
     31 int	cmd_list_keys_table(struct cmd *, struct cmd_ctx *);
     32 
     33 const struct cmd_entry cmd_list_keys_entry = {
     34 	"list-keys", "lsk",
     35 	"[-t key-table]",
     36 	0, "",
     37 	cmd_target_init,
     38 	cmd_target_parse,
     39 	cmd_list_keys_exec,
     40 	cmd_target_free,
     41 	cmd_target_print
     42 };
     43 
     44 int
     45 cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx)
     46 {
     47 	struct cmd_target_data	*data = self->data;
     48 	struct key_binding	*bd;
     49 	const char		*key;
     50 	char			 tmp[BUFSIZ];
     51 	size_t			 used;
     52 	int			 width, keywidth;
     53 
     54 	if (data->target != NULL)
     55 		return (cmd_list_keys_table(self, ctx));
     56 
     57 	width = 0;
     58 	SPLAY_FOREACH(bd, key_bindings, &key_bindings) {
     59 		key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
     60 		if (key == NULL)
     61 			continue;
     62 
     63 		keywidth = strlen(key) + 1;
     64 		if (!(bd->key & KEYC_PREFIX))
     65 			keywidth += 2;
     66 		if (keywidth > width)
     67 			width = keywidth;
     68 	}
     69 
     70 	SPLAY_FOREACH(bd, key_bindings, &key_bindings) {
     71 		key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
     72 		if (key == NULL)
     73 			continue;
     74 		used = xsnprintf(tmp, sizeof tmp, "%*s: ", width, key);
     75 		if (used >= sizeof tmp)
     76 			continue;
     77 
     78 		if (!(bd->key & KEYC_PREFIX)) {
     79 			used = strlcat(tmp, "(no prefix) ", sizeof tmp);
     80 			if (used >= sizeof tmp)
     81 				continue;
     82 		}
     83 		if (bd->can_repeat) {
     84 			used = strlcat(tmp, "(repeat) ", sizeof tmp);
     85 			if (used >= sizeof tmp)
     86 				continue;
     87 		}
     88 		cmd_list_print(bd->cmdlist, tmp + used, (sizeof tmp) - used);
     89 		ctx->print(ctx, "%s", tmp);
     90 	}
     91 
     92 	return (0);
     93 }
     94 
     95 int
     96 cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx)
     97 {
     98 	struct cmd_target_data		*data = self->data;
     99 	const struct mode_key_table	*mtab;
    100 	struct mode_key_binding		*mbind;
    101 	const char			*key, *cmdstr, *mode;
    102 	int			 	 width, keywidth;
    103 
    104 	if ((mtab = mode_key_findtable(data->target)) == NULL) {
    105 		ctx->error(ctx, "unknown key table: %s", data->target);
    106 		return (-1);
    107 	}
    108 
    109 	width = 0;
    110 	SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) {
    111 		key = key_string_lookup_key(mbind->key);
    112 		if (key == NULL)
    113 			continue;
    114 
    115 		keywidth = strlen(key) + 1;
    116 		if (keywidth > width)
    117 			width = keywidth;
    118 	}
    119 
    120 	SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) {
    121 		key = key_string_lookup_key(mbind->key);
    122 		if (key == NULL)
    123 			continue;
    124 
    125 		mode = "";
    126 		if (mbind->mode != 0)
    127 			mode = "(command mode) ";
    128 		cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
    129 		if (cmdstr != NULL)
    130 			ctx->print(ctx, "%*s: %s%s", width, key, mode, cmdstr);
    131 	}
    132 
    133 	return (0);
    134 }
    135