summary refs log tree commit diff
diff options
context:
space:
mode:
authorC. McEnroe2020-05-25 13:51:09 -0400
committerC. McEnroe2020-05-25 13:51:09 -0400
commitb352f5965b251e7a218b51ee351fa806ff4e7ff1 (patch)
tree5f4caf86edcc53fac489ca7d395fa59613b76d1a
parent53f206f7e0a988cfc229a22ba0b929d7cdfcafff (diff)
Define constants for window geometry
Also fixes uiDraw so that the split lines and marker don't overlap the
main window, although that wasn't causing any real problems.
-rw-r--r--ui.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/ui.c b/ui.c
index e91bd26..5b7ef5e 100644
--- a/ui.c
+++ b/ui.c
@@ -46,9 +46,18 @@
 #define A_ITALIC A_NORMAL
 #endif
 
+enum {
+	StatusLines = 1,
+	WindowLines = 1024,
+	MarkerLines = 1,
+	SplitLines = 5,
+	InputLines = 1,
+	InputCols = 1024,
+};
+
 #define BOTTOM (LINES - 1)
 #define RIGHT (COLS - 1)
-#define PAGE_LINES (LINES - 2)
+#define MAIN_LINES (LINES - StatusLines - InputLines)
 
 static WINDOW *status;
 static WINDOW *marker;
@@ -82,7 +91,6 @@ static struct Line bufferLine(const struct Buffer *buffer, size_t i) {
 	return buffer->lines[(buffer->len + i) % BufferCap];
 }
 
-enum { WindowLines = BufferCap };
 struct Window {
 	uint id;
 	WINDOW *pad;
@@ -264,8 +272,6 @@ static void errExit(void) {
 	reset_shell_mode();
 }
 
-enum { SplitLines = 5 };
-
 void uiInit(void) {
 	initscr();
 	cbreak();
@@ -284,13 +290,16 @@ void uiInit(void) {
 	ENUM_KEY
 #undef X
 
-	status = newwin(1, COLS, 0, 0);
+	status = newwin(StatusLines, COLS, 0, 0);
 	if (!status) err(EX_OSERR, "newwin");
 
-	marker = newwin(1, COLS, BOTTOM - SplitLines - 1, 0);
+	marker = newwin(
+		MarkerLines, COLS,
+		LINES - InputLines - SplitLines - MarkerLines, 0
+	);
 	wbkgd(marker, ACS_BULLET);
 
-	input = newpad(1, 1024);
+	input = newpad(InputLines, InputCols);
 	if (!input) err(EX_OSERR, "newpad");
 	keypad(input, true);
 	nodelay(input, true);
@@ -309,20 +318,27 @@ void uiDraw(void) {
 	if (hidden) return;
 	wnoutrefresh(status);
 	const struct Window *window = windows.ptrs[windows.show];
-	pnoutrefresh(
-		window->pad,
-		WindowLines - window->scroll - PAGE_LINES + !!window->scroll, 0,
-		1, 0,
-		BOTTOM - 1 - !!window->scroll, RIGHT
-	);
-	if (window->scroll) {
+	if (!window->scroll) {
+		pnoutrefresh(
+			window->pad,
+			WindowLines - MAIN_LINES, 0,
+			StatusLines, 0,
+			BOTTOM - InputLines, RIGHT
+		);
+	} else {
+		pnoutrefresh(
+			window->pad,
+			WindowLines - window->scroll - MAIN_LINES + MarkerLines, 0,
+			StatusLines, 0,
+			BOTTOM - InputLines - SplitLines - MarkerLines, RIGHT
+		);
 		touchwin(marker);
 		wnoutrefresh(marker);
 		pnoutrefresh(
 			window->pad,
 			WindowLines - SplitLines, 0,
-			BOTTOM - SplitLines, 0,
-			BOTTOM - 1, RIGHT
+			LINES - InputLines - SplitLines, 0,
+			BOTTOM - InputLines, RIGHT
 		);
 	}
 	int y, x;
@@ -330,7 +346,7 @@ void uiDraw(void) {
 	pnoutrefresh(
 		input,
 		0, (x + 1 > RIGHT ? x + 1 - RIGHT : 0),
-		BOTTOM, 0,
+		LINES - InputLines, 0,
 		BOTTOM, RIGHT
 	);
 	(void)y;
@@ -517,21 +533,20 @@ void uiHide(void) {
 static void windowScroll(struct Window *window, int n) {
 	mark(window);
 	window->scroll += n;
-	if (window->scroll > WindowLines - PAGE_LINES) {
-		window->scroll = WindowLines - PAGE_LINES;
+	if (window->scroll > WindowLines - MAIN_LINES) {
+		window->scroll = WindowLines - MAIN_LINES;
 	}
 	if (window->scroll < 0) window->scroll = 0;
 	unmark(window);
 }
 
 static void windowScrollPage(struct Window *window, int n) {
-	// -1 for split marker, -1 for line of overlap.
-	windowScroll(window, n * (PAGE_LINES - SplitLines - 2));
+	windowScroll(window, n * (MAIN_LINES - SplitLines - MarkerLines - 1));
 }
 
 static void windowScrollUnread(struct Window *window) {
 	window->scroll = 0;
-	windowScroll(window, window->unreadSoft - PAGE_LINES + 1);
+	windowScroll(window, window->unreadSoft - MAIN_LINES);
 }
 
 static int wordWidth(const char *str) {
@@ -687,7 +702,7 @@ static void reflow(struct Window *window) {
 }
 
 static void resize(void) {
-	mvwin(marker, BOTTOM - SplitLines - 1, 0);
+	mvwin(marker, LINES - InputLines - SplitLines - MarkerLines, 0);
 	int height, width;
 	getmaxyx(windows.ptrs[0]->pad, height, width);
 	if (width == COLS) return;