mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 13:37:12 +00:00
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:
40
key-string.c
40
key-string.c
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user