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