diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2015-01-02 11:32:31 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2015-01-02 11:32:31 +0100 |
| commit | 3b67208c8767f79b760df8d94ad94836a284da33 (patch) | |
| tree | da6a081b65ebf0248c36d824d12dec1de1067162 | |
| parent | acd54f11b21ebcc3eadfbf7d4be14639fac82ca8 (diff) | |
| download | vis-3b67208c8767f79b760df8d94ad94836a284da33.tar.gz vis-3b67208c8767f79b760df8d94ad94836a284da33.tar.xz | |
Make getkey read one UTF-8 character at a time
| -rw-r--r-- | vis.c | 22 |
1 files changed, 15 insertions, 7 deletions
@@ -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); } } |
