summaryrefslogtreecommitdiffstats
path: root/key-string.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2009-01-09 16:45:58 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2009-01-09 16:45:58 +0000
commited1031b358967b9a3037a8c5c72caae17ce2961c (patch)
treeb53b670692057cb4b9560984444c5144ff2eca31 /key-string.c
parent622d4def2283e6fdc13dae33d8814e2af5169a65 (diff)
Update key handling code. Simplify, support ctrl properly and add a new window option (xterm-keys) to output xterm key codes including ctrl and, if available, alt and shift.
Diffstat (limited to 'key-string.c')
-rw-r--r--key-string.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/key-string.c b/key-string.c
index 7b4b330c..56c69e98 100644
--- a/key-string.c
+++ b/key-string.c
@@ -1,4 +1,4 @@
-/* $Id: key-string.c,v 1.10 2009-01-08 22:28:02 nicm Exp $ */
+/* $Id: key-string.c,v 1.11 2009-01-09 16:45:58 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -22,6 +22,8 @@
#include "tmux.h"
+int key_string_search_table(const char *);
+
struct {
const char *string;
int key;
@@ -72,6 +74,18 @@ struct {
};
int
+key_string_search_table(const char *string)
+{
+ u_int i;
+
+ for (i = 0; i < nitems(key_string_table); i++) {
+ if (strcasecmp(string, key_string_table[i].string) == 0)
+ return (key_string_table[i].key);
+ }
+ return (KEYC_NONE);
+}
+
+int
key_string_lookup_string(const char *string)
{
u_int i;
@@ -91,6 +105,9 @@ key_string_lookup_string(const char *string)
return (string[2] - 64);
if (string[2] >= 97 && string[2] <= 122)
return (string[2] - 96);
+ key = key_string_search_table(string + 2);
+ if (key != KEYC_NONE)
+ return (KEYC_ADDCTL(key));
return (KEYC_NONE);
}
@@ -103,20 +120,19 @@ key_string_lookup_string(const char *string)
return (string[1] - 64);
if (string[1] >= 97 && string[1] <= 122)
return (string[1] - 96);
+ key = key_string_search_table(string + 1);
+ if (key != KEYC_NONE)
+ return (KEYC_ADDCTL(key));
return (KEYC_NONE);
}
if (string[0] == 'M' && string[1] == '-') {
if ((key = key_string_lookup_string(string + 2)) == KEYC_NONE)
return (KEYC_NONE);
- return (KEYC_ADDESCAPE(key));
+ return (KEYC_ADDESC(key));
}
- for (i = 0; i < nitems(key_string_table); i++) {
- if (strcasecmp(string, key_string_table[i].string) == 0)
- return (key_string_table[i].key);
- }
- return (KEYC_NONE);
+ return (key_string_search_table(string));
}
const char *
@@ -129,12 +145,19 @@ key_string_lookup_key(int key)
if (key == 127)
return (NULL);
- if (KEYC_ISESCAPE(key)) {
- if ((s = key_string_lookup_key(KEYC_REMOVEESCAPE(key))) == NULL)
+ if (KEYC_ISESC(key)) {
+ if ((s = key_string_lookup_key(KEYC_REMOVEESC(key))) == NULL)
return (NULL);
xsnprintf(tmp2, sizeof tmp2, "M-%s", s);
return (tmp2);
}
+ if (KEYC_ISCTL(key)) {
+ if ((s = key_string_lookup_key(KEYC_REMOVECTL(key))) == NULL)
+ return (NULL);
+ xsnprintf(tmp2, sizeof tmp2, "C-%s", s);
+ return (tmp2);
+ }
+
if (key >= 32 && key <= 255) {
tmp[0] = key;