From 8d7460859b9f4a74b4d8c19295de4f8d21117f2b Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Fri, 4 Jun 2021 22:14:44 -0700 Subject: [PATCH] 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. --- ui.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ui.c b/ui.c index 6449e27..81cf125 100644 --- a/ui.c +++ b/ui.c @@ -374,14 +374,16 @@ static short stylePair(struct Style style) { 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; while (*str) { size_t len = styleParse(&style, &str); wattr_set(win, styleAttr(style), stylePair(style), NULL); - waddnstr(win, str, len); + if (waddnstr(win, str, len) == ERR) + return -1; str += len; } + return 0; } static void statusUpdate(void) { @@ -420,7 +422,7 @@ static void statusUpdate(void) { if (window->scroll) { catf(&cat, "~%d ", window->scroll); } - styleAdd(status, buf); + if (styleAdd(status, buf) < 0) break; } wclrtoeol(status);