diff --git a/buffer.c b/buffer.c index 7ac5c10..ff21eb4 100644 --- a/buffer.c +++ b/buffer.c @@ -186,16 +186,19 @@ int bufferPush( return flow(&buffer->hard, cols, soft); } -void bufferReflow(struct Buffer *buffer, int cols, bool ignore) { +int bufferReflow(struct Buffer *buffer, int cols, bool ignore, size_t tail) { buffer->hard.len = 0; for (size_t i = 0; i < BufferCap; ++i) { free(buffer->hard.lines[i].str); buffer->hard.lines[i].str = NULL; } + int flowed = 0; for (size_t i = 0; i < BufferCap; ++i) { const struct Line *soft = bufferSoft(buffer, i); if (!soft) continue; if (soft->heat < Cold && ignore) continue; - flow(&buffer->hard, cols, soft); + int n = flow(&buffer->hard, cols, soft); + if (i >= BufferCap - tail) flowed += n; } + return flowed; } diff --git a/chat.h b/chat.h index 6f2ba15..6cf34b3 100644 --- a/chat.h +++ b/chat.h @@ -291,7 +291,7 @@ int bufferPush( struct Buffer *buffer, int cols, bool ignore, enum Heat heat, time_t time, const char *str ); -void bufferReflow(struct Buffer *buffer, int cols, bool ignore); +int bufferReflow(struct Buffer *buffer, int cols, bool ignore, size_t tail); enum Edit { EditHead, diff --git a/ui.c b/ui.c index ab557d3..333ef53 100644 --- a/ui.c +++ b/ui.c @@ -542,6 +542,7 @@ void uiWrite(uint id, enum Heat heat, const time_t *src, const char *str) { } if (window->mark && heat > Cold) { if (!window->unreadWarm++) { + window->unreadSoft++; lines += bufferPush(window->buffer, COLS, false, Cold, ts, ""); } if (heat > window->heat) window->heat = heat; @@ -576,7 +577,9 @@ static void resize(void) { wresize(main, MAIN_LINES, COLS); for (uint num = 0; num < windows.len; ++num) { struct Window *window = windows.ptrs[num]; - bufferReflow(window->buffer, COLS, window->ignore); + window->unreadHard = bufferReflow( + window->buffer, COLS, window->ignore, window->unreadSoft + ); } windowUpdate(); } @@ -753,7 +756,9 @@ void uiCloseNum(uint num) { static void toggleIgnore(struct Window *window) { window->ignore ^= true; - bufferReflow(window->buffer, COLS, window->ignore); + window->unreadHard = bufferReflow( + window->buffer, COLS, window->ignore, window->unreadSoft + ); windowUpdate(); statusUpdate(); } @@ -1015,6 +1020,9 @@ void uiLoad(const char *name) { readString(file, &buf, &cap); bufferPush(window->buffer, COLS, window->ignore, heat, time, buf); } + window->unreadHard = bufferReflow( + window->buffer, COLS, window->ignore, window->unreadSoft + ); } free(buf);