summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--main.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/main.c b/main.c
index c458139..40d861e 100644
--- a/main.c
+++ b/main.c
@@ -5,6 +5,11 @@
 
 /* TODO:
  *
+ * - add a little temporary message line, maybe at the top of the screen
+ *   + log_warn() goes here
+ *   + "message not yours to edit"
+ *   + "got 78 users and 722 posts in [nanoseconds?]"
+ *
  * - make it so that page up/page down act based on number of lines
  *   traversed, not abstract number of posts skipped
  *
@@ -38,7 +43,8 @@
 #include "arena.h"
 
 #define POST_LIMIT 200 /* see bink.py */
-#define PAGE_LEN 10
+#define PAGE_LEN getmaxy(stdscr)
+#define HALF_PAGE_LEN ((getmaxy(stdscr) * 75) / 100)
 #define GFX_MARGIN_X 2
 #define GFX_MARGIN_Y 1
 #define GFX_TEXT_MARGIN_X 1
@@ -420,8 +426,23 @@ void new_post(Arena *temp) {
 	fclose(f);
 }
 
-/* this will probably crash if there are zero posts */
+/* will skip at least one post, so not suitable for just scrolling one line at
+ * a time like bink.py does */
+int line_skip(int cur, Gfx *gfx, int amt) {
+	int sign = amt < 0 ? -1 : 1;
+	amt = abs(amt);
+	while (amt > 0 && (sign < 0 ? cur > 0 : cur + 1 < gfx->len)) {
+		amt -= gfx_post_height(&gfx->posts[cur]) + 1;
+		cur += sign;
+	}
+	if (amt < 0) {
+		if (sign < 0 && cur + 1 < gfx->len) cur++;
+		else if (sign > 0 && cur > 0) cur--;
+	}
+	return cur;
+}
 
+/* might crash on zero posts? */
 int main(void) {
 	/* init */
 
@@ -476,16 +497,18 @@ int main(void) {
 		case ' ':
 		case 'd':
 		case KEY_NPAGE:
+			cur = line_skip(cur, &gfx, PAGE_LEN);
+			break;
 		case 0x04 /* ^D */:
-			cur += PAGE_LEN;
-			if (cur > posts.len - 1) cur = posts.len - 1;
+			cur = line_skip(cur, &gfx, HALF_PAGE_LEN);
 			break;
 		case 'b':
 		case 'u':
 		case KEY_PPAGE:
+			cur = line_skip(cur, &gfx, -PAGE_LEN);
+			break;
 		case 0x15 /* ^U */:
-			cur -= PAGE_LEN;
-			if (cur < 0) cur = 0;
+			cur = line_skip(cur, &gfx, -HALF_PAGE_LEN);
 			break;
 		case 'e':
 			if (my_post(&posts.data[cur])) {