summary refs log tree commit diff
path: root/ui.c
diff options
context:
space:
mode:
authorC. McEnroe2020-02-10 01:59:08 -0500
committerC. McEnroe2020-02-10 01:59:08 -0500
commit05fc01b2483dfa203a4f905f294b04325e4111eb (patch)
tree02ab9ea7c3dd31d27fa554d3322ecf2f55e8c194 /ui.c
parentfabb89077d445e6b682f0e38305de7387d07af24 (diff)
Simplify mark, heat, unread tracking
Diffstat (limited to 'ui.c')
-rw-r--r--ui.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/ui.c b/ui.c
index d94351a..c331a7c 100644
--- a/ui.c
+++ b/ui.c
@@ -71,11 +71,11 @@ struct Window {
 	size_t id;
 	struct Buffer buffer;
 	WINDOW *pad;
+	int scroll;
 	bool mark;
 	enum Heat heat;
 	int unreadCount;
 	int unreadLines;
-	int scroll;
 	struct Window *prev;
 	struct Window *next;
 };
@@ -114,7 +114,7 @@ static struct Window *windowFor(size_t id) {
 	window->pad = newpad(WindowLines, COLS);
 	if (!window->pad) err(EX_OSERR, "newpad");
 	scrollok(window->pad, true);
-	wmove(window->pad, BufferCap - 1, 0);
+	wmove(window->pad, WindowLines - 1, 0);
 	window->mark = true;
 
 	windowAdd(window);
@@ -356,7 +356,7 @@ static void statusUpdate(void) {
 	int num;
 	const struct Window *window;
 	for (num = 0, window = windows.head; window; ++num, window = window->next) {
-		if (!window->unreadCount && window != windows.active) continue;
+		if (!window->heat && window != windows.active) continue;
 		int unread;
 		char buf[256];
 		snprintf(
@@ -367,7 +367,7 @@ static void statusUpdate(void) {
 			window->unreadCount,
 			idColors[window->id]
 		);
-		if (!window->unreadCount) buf[unread] = '\0';
+		if (!window->mark || !window->unreadCount) buf[unread] = '\0';
 		statusAdd(buf);
 	}
 	wclrtoeol(status);
@@ -379,30 +379,38 @@ static void statusUpdate(void) {
 		self.network, idNames[windows.active->id],
 		&unread, windows.active->unreadCount
 	);
-	if (!windows.active->unreadCount) buf[unread] = '\0';
+	if (!windows.active->mark || !windows.active->unreadCount) {
+		buf[unread] = '\0';
+	}
 	putp(to_status_line);
 	putp(buf);
 	putp(from_status_line);
 	fflush(stdout);
 }
 
+static void mark(struct Window *window) {
+	if (window->scroll) return;
+	window->mark = true;
+	window->unreadCount = 0;
+	window->unreadLines = 0;
+}
+
 static void unmark(struct Window *window) {
 	if (!window->scroll) {
-		window->heat = Cold;
-		window->unreadCount = 0;
 		window->mark = false;
+		window->heat = Cold;
 	}
 	statusUpdate();
 }
 
 static void windowScroll(struct Window *window, int n) {
-	if (!window->scroll) window->mark = true;
+	mark(window);
 	window->scroll += n;
 	if (window->scroll > WindowLines - PAGE_LINES) {
 		window->scroll = WindowLines - PAGE_LINES;
 	}
 	if (window->scroll < 0) window->scroll = 0;
-	if (!window->scroll) unmark(window);
+	unmark(window);
 }
 
 static void windowScrollUnread(struct Window *window) {
@@ -480,7 +488,6 @@ void uiWrite(size_t id, enum Heat heat, const time_t *src, const char *str) {
 
 	int lines = 1;
 	waddch(window->pad, '\n');
-	if (window->mark && !window->unreadCount) window->unreadLines = 0;
 	if (window->mark && heat > Cold) {
 		if (!window->unreadCount++) {
 			lines++;
@@ -646,9 +653,9 @@ static void windowShow(struct Window *window) {
 	touchwin(window->pad);
 	windows.other = windows.active;
 	windows.active = window;
-	windows.other->mark = true;
-	inputUpdate();
+	mark(windows.other);
 	unmark(windows.active);
+	inputUpdate();
 }
 
 void uiShowID(size_t id) {
@@ -722,7 +729,7 @@ static void keyCode(int code) {
 	switch (code) {
 		break; case KEY_RESIZE:  resize();
 		break; case KeyFocusIn:  unmark(window);
-		break; case KeyFocusOut: window->mark = true;
+		break; case KeyFocusOut: mark(window);
 		break; case KeyPasteOn:; // TODO
 		break; case KeyPasteOff:; // TODO