about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--buffer.c7
-rw-r--r--chat.h2
-rw-r--r--ui.c12
3 files changed, 16 insertions, 5 deletions
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);