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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user