summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-11-10 17:24:44 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-11-10 17:24:44 +0000
commitb9414f0dd9cf01f060faab923b6afa065d5b64ff (patch)
tree9915224764d3becc4845fd00eb46663750e969ab
parent481615bab09972e2acde411479c5800c8a820ea7 (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.c59
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)
{