Avoid writing past the end of the status bar

When waddnstr is called with a string that would extend past the
end of the window, the string is truncated, the cursor remains at
the last column, and ERR is returned. If this error is ignored and
the loop continues, the next call to waddnstr overwrites the character
at this column, resulting in a slight visual artifact. When the
window is too small to fit the full status line, it is effectively
truncated by one space on the right, since the string shown for
each channel begins with a space.  Additionally, if the last window
is the current window, the space is shown with a colored background.

To fix this, when waddnstr returns ERR, exit the loop in styleAdd()
early return -1 to propogate this error down to the caller.
weechat-hashes
Michael Forney 2021-06-04 22:14:44 -07:00 committed by C. McEnroe
parent f559322224
commit 8d7460859b
1 changed files with 5 additions and 3 deletions

8
ui.c
View File

@ -374,14 +374,16 @@ static short stylePair(struct Style style) {
return colorPair(Colors[style.fg], Colors[style.bg]); return colorPair(Colors[style.fg], Colors[style.bg]);
} }
static void styleAdd(WINDOW *win, const char *str) { static int styleAdd(WINDOW *win, const char *str) {
struct Style style = StyleDefault; struct Style style = StyleDefault;
while (*str) { while (*str) {
size_t len = styleParse(&style, &str); size_t len = styleParse(&style, &str);
wattr_set(win, styleAttr(style), stylePair(style), NULL); wattr_set(win, styleAttr(style), stylePair(style), NULL);
waddnstr(win, str, len); if (waddnstr(win, str, len) == ERR)
return -1;
str += len; str += len;
} }
return 0;
} }
static void statusUpdate(void) { static void statusUpdate(void) {
@ -420,7 +422,7 @@ static void statusUpdate(void) {
if (window->scroll) { if (window->scroll) {
catf(&cat, "~%d ", window->scroll); catf(&cat, "~%d ", window->scroll);
} }
styleAdd(status, buf); if (styleAdd(status, buf) < 0) break;
} }
wclrtoeol(status); wclrtoeol(status);