From 3b67208c8767f79b760df8d94ad94836a284da33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Fri, 2 Jan 2015 11:32:31 +0100 Subject: Make getkey read one UTF-8 character at a time --- vis.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'vis.c') diff --git a/vis.c b/vis.c index a334792..7501d3e 100644 --- a/vis.c +++ b/vis.c @@ -1770,20 +1770,28 @@ static void keypress(Key *key) { static Key getkey(void) { Key key = { .str = "", .code = 0 }; - int keycode = getch(), len = 0; + int keycode = getch(), cur = 0; if (keycode == ERR) return key; if (keycode >= KEY_MIN) { key.code = keycode; } else { - char keychar = keycode; - key.str[len++] = keychar; - - if (!ISASCII(keychar) || keychar == '\e') { + key.str[cur++] = keycode; + int len = 1; + unsigned char keychar = keycode; + if (ISASCII(keychar)) len = 1; + else if (keychar == '\e' || keychar >= 0xFC) len = 6; + else if (keychar >= 0xF8) len = 5; + else if (keychar >= 0xF0) len = 4; + else if (keychar >= 0xE0) len = 3; + else if (keychar >= 0xC0) len = 2; + len = MIN(len, LENGTH(key.str)); + + if (cur < len) { nodelay(stdscr, TRUE); - for (int t; len < LENGTH(key.str) && (t = getch()) != ERR; len++) - key.str[len] = t; + for (int t; cur < len && (t = getch()) != ERR; cur++) + key.str[cur] = t; nodelay(stdscr, FALSE); } } -- cgit v1.2.3