diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-11-10 17:24:44 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-11-10 17:24:44 +0000 |
commit | b9414f0dd9cf01f060faab923b6afa065d5b64ff (patch) | |
tree | 9915224764d3becc4845fd00eb46663750e969ab | |
parent | 481615bab09972e2acde411479c5800c8a820ea7 (diff) |
Lookup key as a named key (eg 'Space') before checking for single character
keys, makes C-Space/M-Space etc resolve to the correct key code.
-rw-r--r-- | usr.bin/tmux/key-string.c | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/usr.bin/tmux/key-string.c b/usr.bin/tmux/key-string.c index bde8bfc507d..6b5570dc596 100644 --- a/usr.bin/tmux/key-string.c +++ b/usr.bin/tmux/key-string.c @@ -1,4 +1,4 @@ -/* $OpenBSD: key-string.c,v 1.9 2009/10/26 13:13:33 nicm Exp $ */ +/* $OpenBSD: key-string.c,v 1.10 2009/11/10 17:24:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -87,6 +87,7 @@ struct { { "KP.", KEYC_KP_PERIOD }, }; +/* Find key string in table. */ int key_string_search_table(const char *string) { @@ -99,6 +100,7 @@ key_string_search_table(const char *string) return (KEYC_NONE); } +/* Lookup a string and convert to a key value, handling C-/M-/S- prefix. */ int key_string_lookup_string(const char *string) { @@ -118,20 +120,34 @@ key_string_lookup_string(const char *string) if (ptr != NULL) { if (ptr[0] == '\0') return (KEYC_NONE); - if (ptr[1] == '\0') { - if (ptr[0] == 32) - return (0); - if (ptr[0] == 63) - return (KEYC_BSPACE); - if (ptr[0] >= 64 && ptr[0] <= 95) - return (ptr[0] - 64); - if (ptr[0] >= 97 && ptr[0] <= 122) - return (ptr[0] - 96); - return (KEYC_NONE); - } + /* + * Lookup as a named key. If a function key (>= KEYC_BASE), + * return it with the ctrl modifier, otherwise fallthrough with + * the key value from the table (eg for C-Space). If not a + * named key, check for single character keys and try that. + */ key = key_string_search_table(ptr); - if (key != KEYC_NONE) - return (key | KEYC_CTRL); + if (key != KEYC_NONE) { + if (key >= KEYC_BASE) + return (key | KEYC_CTRL); + } else { + if (ptr[1] != '\0') + return (KEYC_NONE); + key = ptr[0]; + } + + /* + * Figure out if the single character in key is a valid ctrl + * key. + */ + if (key == 32) + return (0); + if (key == 63) + return (KEYC_BSPACE); + if (key >= 64 && key <= 95) + return (key - 64); + if (key >= 97 && key <= 122) + return (key - 96); return (KEYC_NONE); } @@ -139,13 +155,17 @@ key_string_lookup_string(const char *string) ptr = string + 2; if (ptr[0] == '\0') return (KEYC_NONE); - if (ptr[1] == '\0') { - if (ptr[0] < 32 || ptr[0] > 127) + key = key_string_lookup_string(ptr); + if (key != KEYC_NONE) { + if (key >= KEYC_BASE) + return (key | KEYC_ESCAPE); + } else { + if (ptr[1] == '\0') return (KEYC_NONE); - return (ptr[0] | KEYC_ESCAPE); + key = ptr[0]; } - key = key_string_lookup_string(ptr); - if (key != KEYC_NONE) + + if (key >= 32 && key <= 127) return (key | KEYC_ESCAPE); return (KEYC_NONE); } @@ -153,6 +173,7 @@ key_string_lookup_string(const char *string) return (key_string_search_table(string)); } +/* Convert a key code into string format, with prefix if necessary. */ const char * key_string_lookup_key(int key) { |