aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2015-01-02 11:32:31 +0100
committerMarc André Tanner <mat@brain-dump.org>2015-01-02 11:32:31 +0100
commit3b67208c8767f79b760df8d94ad94836a284da33 (patch)
treeda6a081b65ebf0248c36d824d12dec1de1067162
parentacd54f11b21ebcc3eadfbf7d4be14639fac82ca8 (diff)
downloadvis-3b67208c8767f79b760df8d94ad94836a284da33.tar.gz
vis-3b67208c8767f79b760df8d94ad94836a284da33.tar.xz
Make getkey read one UTF-8 character at a time
-rw-r--r--vis.c22
1 files changed, 15 insertions, 7 deletions
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);
}
}