TUI: kitty keyboard protocol, word movement and deletion keys
Query CSI ? u at startup and push the disambiguate flag on the alternate screen when the terminal answers; CSI u reports are mapped back to legacy input (Shift/Ctrl+Enter insert a newline, Ctrl+Backspace deletes a word). Ctrl/Alt+Left/Right move by word, Ctrl/Alt+Delete delete the next word. Our define_key codes move above the range ncurses uses for terminfo extended keys.
This commit is contained in:
@@ -117,10 +117,47 @@ static void test_json(void) {
|
||||
CHECK(cst_keymap_conflicts(&km, conf, sizeof(conf)) > 0);
|
||||
}
|
||||
|
||||
static int kitty(int cp, int mods, int *a, int *b) {
|
||||
int out[2] = {-1, -1};
|
||||
int n = cst_key_from_kitty(cp, mods, out);
|
||||
*a = out[0], *b = out[1];
|
||||
return n;
|
||||
}
|
||||
|
||||
static void test_kitty(void) {
|
||||
int a, b;
|
||||
CHECK(kitty('c', 4, &a, &b) == 1 && a == 3); /* ctrl+c */
|
||||
CHECK(kitty('a', 5, &a, &b) == 1 && a == 1); /* ctrl+shift+a */
|
||||
CHECK(kitty(' ', 4, &a, &b) == 1 && a == 0); /* ctrl+space */
|
||||
CHECK(kitty('[', 4, &a, &b) == 1 && a == 27); /* ctrl+[ */
|
||||
CHECK(kitty('b', 2, &a, &b) == 2 && a == 27 && b == 'b');
|
||||
CHECK(kitty('b', 3, &a, &b) == 2 && a == 27 && b == 'B');
|
||||
CHECK(kitty('1', 3, &a, &b) == 2 && a == 27 && b == '!');
|
||||
CHECK(kitty('x', 6, &a, &b) == 2 && a == 27 && b == 24); /* ctrl+alt+x */
|
||||
CHECK(kitty(27, 0, &a, &b) == 1 && a == 27);
|
||||
CHECK(kitty(13, 0, &a, &b) == 1 && a == 13);
|
||||
CHECK(kitty(13, 1, &a, &b) == 2 && a == 27 && b == 13); /* shift+enter */
|
||||
CHECK(kitty(13, 4, &a, &b) == 2 && a == 27 && b == 13); /* ctrl+enter */
|
||||
CHECK(kitty(127, 4, &a, &b) == 2 && a == 27 && b == 127);
|
||||
CHECK(kitty(127, 1, &a, &b) == 1 && a == 127);
|
||||
CHECK(kitty(9, 1, &a, &b) == 1 && a == CST_K_BTAB);
|
||||
CHECK(kitty(9, 4, &a, &b) == 1 && a == 9);
|
||||
CHECK(kitty('a', 8, &a, &b) == 0); /* super+a */
|
||||
CHECK(kitty(5, 4, &a, &b) == 0);
|
||||
/* the result goes through the keymap like legacy input */
|
||||
cst_keymap_t km;
|
||||
cst_keymap_defaults(&km);
|
||||
int act = 0;
|
||||
kitty(13, 1, &a, &b);
|
||||
CHECK(lookup1(&km, b | CST_KEY_ALT, &act) == CST_KM_MATCH &&
|
||||
act == CST_KA_NEWLINE);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
test_parse();
|
||||
test_defaults();
|
||||
test_json();
|
||||
test_kitty();
|
||||
puts("test_keymap: ok");
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user