diff --git a/termo.c b/termo.c index 38caba2..953bc88 100644 --- a/termo.c +++ b/termo.c @@ -778,7 +778,15 @@ parse_multibyte (termo_t *tk, const unsigned char *bytes, size_t len, static void emit_codepoint (termo_t *tk, uint32_t codepoint, termo_key_t *key) { - if (codepoint < 0x20) + if (codepoint == 0) + { + // ASCII NUL = Ctrl-Space as well as Ctrl-@ but let's prefer + // the former to follow the behaviour of libtermkey + key->type = TERMO_TYPE_KEYSYM; + key->code.sym = TERMO_SYM_SPACE; + key->modifiers = TERMO_KEYMOD_CTRL; + } + else if (codepoint < 0x20) { // C0 range key->code.codepoint = 0; diff --git a/tests/02getkey.c b/tests/02getkey.c index b36eb9e..a5443e2 100644 --- a/tests/02getkey.c +++ b/tests/02getkey.c @@ -7,7 +7,7 @@ main (int argc, char *argv[]) termo_t *tk; termo_key_t key; - plan_tests (38); + plan_tests (42); tk = termo_new_abstract ("vt100", NULL, 0); @@ -86,6 +86,15 @@ main (int argc, char *argv[]) is_int (key.modifiers, TERMO_KEYMOD_CTRL, "key.modifiers after Ctrl-Escape"); + termo_push_bytes (tk, "\0", 1); + + is_int (termo_getkey (tk, &key), TERMO_RES_KEY, + "getkey yields RES_KEY after Ctrl-Space"); + + is_int (key.type, TERMO_TYPE_KEY, "key.type after Ctrl-Space"); + is_int (key.code.codepoint, ' ', "key.code.codepoint after Ctrl-Space"); + is_int (key.modifiers, TERMO_KEYMOD_CTRL, "key.modifiers after Ctrl-Space"); + // Escape key in various amounts termo_push_bytes (tk, "\x1b\x1b", 2);