Now that glfw reports shifted keys, use it when encoding key events
This commit is contained in:
@@ -199,65 +199,8 @@ encode_function_key(const KeyEvent *ev, char *output) {
|
||||
return serialize(&ed, output, csi_trailer);
|
||||
}
|
||||
|
||||
static inline char
|
||||
shifted_ascii_key(const uint32_t key) { // {{{
|
||||
switch(key) {
|
||||
/* start shifted key map (auto generated by gen-key-constants.py do not edit) */
|
||||
case '`': return '~';
|
||||
case '1': return '!';
|
||||
case '2': return '@';
|
||||
case '3': return '#';
|
||||
case '4': return '$';
|
||||
case '5': return '%';
|
||||
case '6': return '^';
|
||||
case '7': return '&';
|
||||
case '8': return '*';
|
||||
case '9': return '(';
|
||||
case '0': return ')';
|
||||
case '-': return '_';
|
||||
case '=': return '+';
|
||||
case '[': return '{';
|
||||
case ']': return '}';
|
||||
case '\\': return '|';
|
||||
case ';': return ':';
|
||||
case '\'': return '"';
|
||||
case ',': return '<';
|
||||
case '.': return '>';
|
||||
case '/': return '?';
|
||||
case 'a': return 'A';
|
||||
case 'b': return 'B';
|
||||
case 'c': return 'C';
|
||||
case 'd': return 'D';
|
||||
case 'e': return 'E';
|
||||
case 'f': return 'F';
|
||||
case 'g': return 'G';
|
||||
case 'h': return 'H';
|
||||
case 'i': return 'I';
|
||||
case 'j': return 'J';
|
||||
case 'k': return 'K';
|
||||
case 'l': return 'L';
|
||||
case 'm': return 'M';
|
||||
case 'n': return 'N';
|
||||
case 'o': return 'O';
|
||||
case 'p': return 'P';
|
||||
case 'q': return 'Q';
|
||||
case 'r': return 'R';
|
||||
case 's': return 'S';
|
||||
case 't': return 'T';
|
||||
case 'u': return 'U';
|
||||
case 'v': return 'V';
|
||||
case 'w': return 'W';
|
||||
case 'x': return 'X';
|
||||
case 'y': return 'Y';
|
||||
case 'z': return 'Z';
|
||||
/* end shifted key map */
|
||||
default:
|
||||
return key;
|
||||
}
|
||||
} // }}}
|
||||
|
||||
static char
|
||||
ctrled_key(const uint32_t key) { // {{{
|
||||
ctrled_key(const char key) { // {{{
|
||||
switch(key) {
|
||||
/* start ctrl mapping (auto generated by gen-key-constants.py do not edit) */
|
||||
case ' ': return 0;
|
||||
@@ -315,17 +258,25 @@ ctrled_key(const uint32_t key) { // {{{
|
||||
static int
|
||||
encode_printable_ascii_key_legacy(const KeyEvent *ev, char *output) {
|
||||
if (!ev->mods.value) return snprintf(output, KEY_BUFFER_SIZE, "%c", (char)ev->key);
|
||||
if (ev->disambiguate) return 0;
|
||||
|
||||
char shifted_key = (ev->mods.shift) ? shifted_ascii_key(ev->key) : (char)ev->key;
|
||||
char key = ev->key;
|
||||
unsigned mods = ev->mods.value;
|
||||
if (mods & SHIFT) {
|
||||
const char shifted = ev->shifted_key;
|
||||
if (shifted && shifted != key && (!(mods & CTRL) || key < 'a' || key > 'z')) {
|
||||
key = shifted;
|
||||
mods &= ~SHIFT;
|
||||
}
|
||||
}
|
||||
|
||||
if (ev->mods.value == SHIFT)
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "%c", shifted_key);
|
||||
if ((ev->mods.value == ALT || ev->mods.value == (SHIFT | ALT)))
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "\x1b%c", shifted_key);
|
||||
if (ev->mods.value == CTRL)
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "%c", ctrled_key(ev->key));
|
||||
if (ev->mods.value == (CTRL | ALT))
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "\x1b%c", ctrled_key(ev->key));
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "%c", key);
|
||||
if (mods == ALT)
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "\x1b%c", key);
|
||||
if (mods == CTRL)
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "%c", ctrled_key(key));
|
||||
if (mods == (CTRL | ALT))
|
||||
return snprintf(output, KEY_BUFFER_SIZE, "\x1b%c", ctrled_key(key));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -367,7 +318,7 @@ encode_key(const KeyEvent *ev, char *output) {
|
||||
return encode_utf8(ev->key, output);
|
||||
}
|
||||
if (!ev->disambiguate && !ev->report_text) {
|
||||
if (is_legacy_ascii_key(ev->key)) {
|
||||
if (is_legacy_ascii_key(ev->key) || (ev->shifted_key && is_legacy_ascii_key(ev->shifted_key))) {
|
||||
int ret = encode_printable_ascii_key_legacy(ev, output);
|
||||
if (ret > 0) return ret;
|
||||
} else if (ev->key == ' ' && ev->mods.value == CTRL) {
|
||||
@@ -378,6 +329,7 @@ encode_key(const KeyEvent *ev, char *output) {
|
||||
KeyEvent alternate = *ev;
|
||||
alternate.key = ev->alternate_key;
|
||||
alternate.alternate_key = 0;
|
||||
alternate.shifted_key = 0;
|
||||
int ret = encode_printable_ascii_key_legacy(&alternate, output);
|
||||
if (ret > 0) return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user