diff options
author | Curtis McEnroe | 2018-08-06 15:12:13 -0400 |
---|---|---|
committer | Curtis McEnroe | 2018-08-06 15:12:13 -0400 |
commit | 3f3fa34d8aa914e6d65e524d4ab3cd944082cde7 (patch) | |
tree | 484215d19fac54af7c77b6b48a7afca7581e943e /ui.c | |
parent | d6fb797b11aa6dd031032faf425be3ce5a69661d (diff) |
Implement word wrapping
Diffstat (limited to 'ui.c')
-rw-r--r-- | ui.c | 21 |
1 files changed, 20 insertions, 1 deletions
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; |