summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-01-21 11:39:23 -0500
committerJune McEnroe <june@causal.agency>2021-01-21 11:57:23 -0500
commit6ee0aea9e55cd72102a7abee26481179311273f2 (patch)
tree151df7435dcc16f94be0b2a5ea6de4ccb24339f6
parentDocument that M-l shows timestamps (diff)
downloadcatgirl-6ee0aea9e55cd72102a7abee26481179311273f2.tar.gz
catgirl-6ee0aea9e55cd72102a7abee26481179311273f2.zip
Simplify windowUpdate loops and factor out windowTop
No idea why I made that more complicated than it had to be looping
backwards.
-rw-r--r--ui.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/ui.c b/ui.c
index 090a247..ed0cb6a 100644
--- a/ui.c
+++ b/ui.c
@@ -463,33 +463,31 @@ static void mainAdd(int y, const char *str) {
 	(void)nx;
 }
 
+static size_t windowTop(const struct Window *window) {
+	size_t top = BufferCap - MAIN_LINES - window->scroll;
+	if (window->scroll) top += MarkerLines;
+	return top;
+}
+
 static void windowUpdate(void) {
 	struct Window *window = windows.ptrs[windows.show];
 
-	int y = MAIN_LINES - 1;
-	size_t bottom = BufferCap - 1 - window->scroll + !!window->scroll;
-	for (size_t i = bottom; i < BufferCap; --i) {
+	int y = 0;
+	int marker = MAIN_LINES - SplitLines - MarkerLines;
+	for (size_t i = windowTop(window); i < BufferCap; ++i) {
 		const struct Line *line = bufferHard(window->buffer, i);
-		if (!line) break;
-		mainAdd(y, line->str);
-		if (!y--) break;
-	}
-
-	while (y >= 0) {
-		wmove(main, y--, 0);
-		wclrtoeol(main);
+		mainAdd(y++, (line ? line->str : ""));
+		if (window->scroll && y == marker) break;
 	}
 	if (!window->scroll) return;
 
-	y = MAIN_LINES - 1;
-	for (size_t i = BufferCap - 1; i < BufferCap; --i) {
+	y = MAIN_LINES - SplitLines;
+	for (size_t i = BufferCap - SplitLines; i < BufferCap; ++i) {
 		const struct Line *line = bufferHard(window->buffer, i);
-		if (!line) break;
-		mainAdd(y, line->str);
-		if (--y < MAIN_LINES - SplitLines) break;
+		mainAdd(y++, (line ? line->str : ""));
 	}
 	wattr_set(main, A_NORMAL, 0, NULL);
-	mvwhline(main, y, 0, ACS_BULLET, COLS);
+	mvwhline(main, marker, 0, ACS_BULLET, COLS);
 }
 
 static void windowScroll(struct Window *window, int n) {
@@ -513,8 +511,7 @@ static void windowScrollTo(struct Window *window, int top) {
 }
 
 static void windowScrollHot(struct Window *window, int dir) {
-	size_t from = BufferCap - window->scroll - MAIN_LINES + MarkerLines + dir;
-	for (size_t i = from; i < BufferCap; i += dir) {
+	for (size_t i = windowTop(window) + dir; i < BufferCap; i += dir) {
 		const struct Line *line = bufferHard(window->buffer, i);
 		const struct Line *prev = bufferHard(window->buffer, i - 1);
 		if (!line || line->heat < Hot) continue;
@@ -526,8 +523,7 @@ static void windowScrollHot(struct Window *window, int dir) {
 
 static void
 windowScrollSearch(struct Window *window, const char *str, int dir) {
-	size_t from = BufferCap - window->scroll - MAIN_LINES + MarkerLines + dir;
-	for (size_t i = from; i < BufferCap; i += dir) {
+	for (size_t i = windowTop(window) + dir; i < BufferCap; i += dir) {
 		const struct Line *line = bufferHard(window->buffer, i);
 		if (!line || !strcasestr(line->str, str)) continue;
 		windowScrollTo(window, BufferCap - i);