Key encoding: in legacy mode use legacy encoding for a few more combinations

Some legacy terminal applications get confused seeing CSI u escape
codes. Since it is relatively common to press ctrl or shift and
space/enter/tab/backspace, emit the same bytes as traditional terminals
do for these common keys.
This commit is contained in:
Kovid Goyal
2021-02-21 11:14:25 +05:30
parent de100ac67c
commit 56fcbb95ab
3 changed files with 77 additions and 48 deletions

View File

@@ -126,6 +126,34 @@ convert_kp_key_to_normal_key(uint32_t key_number) {
return key_number;
}
static int
legacy_functional_key_encoding_with_modifiers(uint32_t key_number, const KeyEvent *ev, char *output) {
const char *prefix = ev->mods.value & ALT ? "\x1b" : "";
const char *main = "";
switch (key_number) {
case GLFW_FKEY_ENTER:
main = "\x0d";
break;
case GLFW_FKEY_ESCAPE:
main = "\x1b";
break;
case GLFW_FKEY_BACKSPACE:
main = ev->mods.value & CTRL ? "\x08" : "\x7f";
break;
case GLFW_FKEY_TAB:
if (ev->mods.value & SHIFT) {
prefix = ev->mods.value & ALT ? "\x1b\x1b" : "\x1b";
main = "[Z";
} else {
main = "\t";
}
break;
default:
return -1;
}
return snprintf(output, KEY_BUFFER_SIZE, "%s%s", prefix, main);
}
static int
encode_function_key(const KeyEvent *ev, char *output) {
#define SIMPLE(val) return snprintf(output, KEY_BUFFER_SIZE, "%s", val);
@@ -158,18 +186,11 @@ encode_function_key(const KeyEvent *ev, char *output) {
default: break;
}
}
} else if (legacy_mode) {
int num = legacy_functional_key_encoding_with_modifiers(key_number, ev, output);
if (num > -1) return num;
}
if (ev->mods.value == ALT && !ev->disambiguate) {
switch(key_number) {
case GLFW_FKEY_TAB: SIMPLE("\x1b\t");
case GLFW_FKEY_ENTER: SIMPLE("\x1b\r");
case GLFW_FKEY_BACKSPACE: SIMPLE("\x1b\x7f");
}
}
if (ev->mods.value == SHIFT && key_number == GLFW_FKEY_TAB && !ev->disambiguate) { SIMPLE("\x1b[Z"); }
if (ev->mods.value == CTRL && key_number == GLFW_FKEY_BACKSPACE && !ev->disambiguate) { SIMPLE("\x08"); }
#undef SIMPLE
#define S(number, trailer) key_number = number; csi_trailer = trailer; break
switch(key_number) {
/* start special numbers (auto generated by gen-key-constants.py do not edit) */
@@ -288,6 +309,10 @@ encode_printable_ascii_key_legacy(const KeyEvent *ev, char *output) {
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));
if (key == ' ') {
if (mods == (CTRL | SHIFT)) return snprintf(output, KEY_BUFFER_SIZE, "%c", ctrled_key(key));
if (mods == (ALT | SHIFT)) return snprintf(output, KEY_BUFFER_SIZE, "\x1b%c", key);
}
return 0;
}