diff options
author | June McEnroe <june@causal.agency> | 2018-08-06 15:12:13 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2018-08-06 15:12:13 -0400 |
commit | 3f3fa34d8aa914e6d65e524d4ab3cd944082cde7 (patch) | |
tree | 484215d19fac54af7c77b6b48a7afca7581e943e | |
parent | Use wchar_t strings for all of UI (diff) | |
download | catgirl-3f3fa34d8aa914e6d65e524d4ab3cd944082cde7.tar.gz catgirl-3f3fa34d8aa914e6d65e524d4ab3cd944082cde7.zip |
Implement word wrapping
-rw-r--r-- | pls.c | 2 | ||||
-rw-r--r-- | ui.c | 21 |
2 files changed, 21 insertions, 2 deletions
diff --git a/pls.c b/pls.c index bd40dbd..c6071c7 100644 --- a/pls.c +++ b/pls.c @@ -26,7 +26,7 @@ wchar_t *wcssep(wchar_t **stringp, const wchar_t *delim) { size_t i = wcscspn(orig, delim); *stringp = NULL; if (orig[i]) { - orig[i] = '\0'; + orig[i] = L'\0'; *stringp = &orig[i + 1]; } return orig; diff --git a/ui.c b/ui.c index 5f5efc3..9c77668 100644 --- a/ui.c +++ b/ui.c @@ -198,17 +198,36 @@ static const wchar_t *parseColor(short *pair, const wchar_t *str) { return str; } +static void wordWrap(WINDOW *win, const wchar_t *str) { + size_t len = wcscspn(str, L" "); + size_t width = 1; + for (size_t i = 0; i < len; ++i) { + if (iswprint(str[i])) width += wcwidth(str[i]); + } + + int _, x, xMax; + getyx(win, _, x); + getmaxyx(win, _, xMax); + + if (width >= (size_t)(xMax - x)) { + waddch(win, '\n'); + } else { + waddch(win, ' '); + } +} + static void addIRC(WINDOW *win, const wchar_t *str) { attr_t attr = A_NORMAL; short pair = -1; for (;;) { - size_t cc = wcscspn(str, L"\2\3\35\37"); + size_t cc = wcscspn(str, L" \2\3\35\37"); wattr_set(win, attr | attr8(pair), 1 + pair8(pair), NULL); waddnwstr(win, str, cc); if (!str[cc]) break; str = &str[cc]; switch (*str++) { + break; case L' ': wordWrap(win, str); break; case L'\2': attr ^= A_BOLD; break; case L'\3': str = parseColor(&pair, str); break; case L'\35': attr ^= A_ITALIC; |