Allow prefix and prefix2 to be set to None to disable (useful if you

would rather bind the prefix in the root table).
This commit is contained in:
nicm
2015-12-12 18:19:00 +00:00
parent 88bc8f3528
commit 39cf9c9d31
10 changed files with 69 additions and 45 deletions

View File

@ -22,8 +22,8 @@
#include "tmux.h"
key_code key_string_search_table(const char *);
key_code key_string_get_modifiers(const char **);
static key_code key_string_search_table(const char *);
static key_code key_string_get_modifiers(const char **);
const struct {
const char *string;
@ -98,7 +98,7 @@ const struct {
};
/* Find key string in table. */
key_code
static key_code
key_string_search_table(const char *string)
{
u_int i;
@ -107,11 +107,11 @@ key_string_search_table(const char *string)
if (strcasecmp(string, key_string_table[i].string) == 0)
return (key_string_table[i].key);
}
return (KEYC_NONE);
return (KEYC_UNKNOWN);
}
/* Find modifiers. */
key_code
static key_code
key_string_get_modifiers(const char **string)
{
key_code modifiers;
@ -150,10 +150,14 @@ key_string_lookup_string(const char *string)
u_int i;
enum utf8_state more;
/* Is this no key? */
if (strcasecmp(string, "None") == 0)
return (KEYC_NONE);
/* Is this a hexadecimal value? */
if (string[0] == '0' && string[1] == 'x') {
if (sscanf(string + 2, "%hx%n", &u, &size) != 1 || size > 4)
return (KEYC_NONE);
return (KEYC_UNKNOWN);
return (u);
}
@ -165,30 +169,30 @@ key_string_lookup_string(const char *string)
}
modifiers |= key_string_get_modifiers(&string);
if (string[0] == '\0')
return (KEYC_NONE);
return (KEYC_UNKNOWN);
/* Is this a standard ASCII key? */
if (string[1] == '\0' && (u_char)string[0] <= 127) {
key = (u_char)string[0];
if (key < 32 || key == 127)
return (KEYC_NONE);
return (KEYC_UNKNOWN);
} else {
/* Try as a UTF-8 key. */
if ((more = utf8_open(&ud, (u_char)*string)) == UTF8_MORE) {
if (strlen(string) != ud.size)
return (KEYC_NONE);
return (KEYC_UNKNOWN);
for (i = 1; i < ud.size; i++)
more = utf8_append(&ud, (u_char)string[i]);
if (more != UTF8_DONE)
return (KEYC_NONE);
return (KEYC_UNKNOWN);
key = utf8_combine(&ud);
return (key | modifiers);
}
/* Otherwise look the key up in the table. */
key = key_string_search_table(string);
if (key == KEYC_NONE)
return (KEYC_NONE);
if (key == KEYC_UNKNOWN)
return (KEYC_UNKNOWN);
}
/* Convert the standard control keys. */
@ -202,7 +206,7 @@ key_string_lookup_string(const char *string)
else if (key == 63)
key = KEYC_BSPACE;
else
return (KEYC_NONE);
return (KEYC_UNKNOWN);
modifiers &= ~KEYC_CTRL;
}
@ -222,9 +226,13 @@ key_string_lookup_key(key_code key)
/* Handle no key. */
if (key == KEYC_NONE)
return ("<NONE>");
return ("None");
/* Handle special keys. */
if (key == KEYC_UNKNOWN)
return ("Unknown");
if (key == KEYC_MOUSE)
return ("<MOUSE>");
return ("Mouse");
/*
* Special case: display C-@ as C-Space. Could do this below in
@ -265,7 +273,7 @@ key_string_lookup_key(key_code key)
/* Invalid keys are errors. */
if (key == 127 || key > 255) {
snprintf(out, sizeof out, "<INVALID#%llx>", key);
snprintf(out, sizeof out, "Invalid#%llx", key);
return (out);
}