diff options
author | June McEnroe <june@causal.agency> | 2020-05-26 15:18:55 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-05-26 15:18:55 -0400 |
commit | 88e2197a8f3272abbdc9a322806a7bdc9fff2daa (patch) | |
tree | 60fefa9dc937064f3b14e45cc1e6c7511ae95506 | |
parent | Define constants for window geometry (diff) | |
download | catgirl-88e2197a8f3272abbdc9a322806a7bdc9fff2daa.tar.gz catgirl-88e2197a8f3272abbdc9a322806a7bdc9fff2daa.zip |
Don't send zero-width characters to ncurses
-rw-r--r-- | ui.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/ui.c b/ui.c index 5b7ef5e..fd9bfab 100644 --- a/ui.c +++ b/ui.c @@ -563,6 +563,19 @@ static int wordWidth(const char *str) { return width; } +// XXX: ncurses likes to render zero-width characters as spaces... +static int waddnstrnzw(WINDOW *win, const char *str, int len) { + wchar_t wc; + while (len) { + int n = mbtowc(&wc, str, len); + if (n < 1) return waddnstr(win, str, len); + if (wcwidth(wc)) waddnstr(win, str, n); + str += n; + len -= n; + } + return OK; +} + static int wordWrap(WINDOW *win, const char *str) { int y, x, width; getmaxyx(win, y, width); @@ -601,7 +614,7 @@ static int wordWrap(WINDOW *win, const char *str) { colorPair(Colors[style.fg], Colors[style.bg]), NULL ); - waddnstr(win, str, len); + waddnstrnzw(win, str, len); str += len; } return lines; |