summaryrefslogtreecommitdiffstats
path: root/key-string.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-11-10 17:24:43 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-11-10 17:24:43 +0000
commit38f64b3da3ab824f24685078789e2f16873a5d8b (patch)
tree7dd2746c2afc1fc5a08362b20793e32c74bf4e3c /key-string.c
parent9f47c6083a4d8c8dfd0d509f581f67dab8cf8e2c (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.
Diffstat (limited to 'key-string.c')
-rw-r--r--key-string.c57
1 files changed, 39 insertions, 18 deletions
diff --git a/key-string.c b/key-string.c
index bfccb978..0c5c8269 100644
--- a/key-string.c
+++ b/key-string.c
@@ -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)
{