summaryrefslogtreecommitdiffstats
path: root/key-string.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2009-11-10 23:30:26 +0000
committerTiago Cunha <tcunha@gmx.com>2009-11-10 23:30:26 +0000
commite9b357550f96100d9eba0c9141ad058c51b9f3e9 (patch)
tree006f30499c5b0d8af192988a330b024cdf30d3d6 /key-string.c
parent38ac9bb414cd7fa8e8bb16ded8f8bc6945e569f1 (diff)
Sync OpenBSD patchset 522:
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.c59
1 files changed, 40 insertions, 19 deletions
diff --git a/key-string.c b/key-string.c
index ed22f23e..f368315f 100644
--- a/key-string.c
+++ b/key-string.c
@@ -1,4 +1,4 @@
-/* $Id: key-string.c,v 1.25 2009-10-28 22:53:03 tcunha Exp $ */
+/* $Id: key-string.c,v 1.26 2009-11-10 23:30:26 tcunha 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)
{