about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-01-27 14:45:03 -0500
committerJune McEnroe <june@causal.agency>2021-01-27 14:55:31 -0500
commitb4c26a2cab313ee3fa9de5ee1ed19cbb709ec914 (patch)
tree460e55d1de34f406290cd312a45d38fc3a0743df
parentChange default timestamp format to %X (diff)
downloadcatgirl-b4c26a2cab313ee3fa9de5ee1ed19cbb709ec914.tar.gz
catgirl-b4c26a2cab313ee3fa9de5ee1ed19cbb709ec914.zip
Measure timestamp width using ncurses
This allows for non-ASCII characters in timestamps, and simplifies
things by including the trailing space in the width.
-rw-r--r--chat.h2
-rw-r--r--ui.c28
2 files changed, 16 insertions, 14 deletions
diff --git a/chat.h b/chat.h
index d3647e7..a44e0d3 100644
--- a/chat.h
+++ b/chat.h
@@ -283,7 +283,7 @@ enum { TimeCap = 64 };
 extern struct Time {
 	bool enable;
 	const char *format;
-	size_t width;
+	int width;
 } uiTime;
 extern struct Util uiNotifyUtil;
 void uiInitEarly(void);
diff --git a/ui.c b/ui.c
index da40dc0..9b55c83 100644
--- a/ui.c
+++ b/ui.c
@@ -236,13 +236,6 @@ static void errExit(void) {
 }
 
 void uiInitEarly(void) {
-	char buf[TimeCap];
-	struct tm *time = localtime(&(time_t) { -22100400 });
-	uiTime.width = strftime(buf, sizeof(buf), uiTime.format, time);
-	if (!uiTime.width) {
-		errx(EX_CONFIG, "invalid timestamp format: %s", uiTime.format);
-	}
-
 	initscr();
 	cbreak();
 	noecho();
@@ -264,6 +257,16 @@ void uiInitEarly(void) {
 	main = newwin(MAIN_LINES, COLS, StatusLines, 0);
 	if (!main) err(EX_OSERR, "newwin");
 
+	int y;
+	char buf[TimeCap];
+	struct tm *time = localtime(&(time_t) { -22100400 });
+	size_t len = strftime(buf, sizeof(buf), uiTime.format, time);
+	if (!len) errx(EX_CONFIG, "invalid timestamp format: %s", uiTime.format);
+	waddstr(main, buf);
+	waddch(main, ' ');
+	getyx(main, y, uiTime.width);
+	(void)y;
+
 	input = newpad(InputLines, InputCols);
 	if (!input) err(EX_OSERR, "newpad");
 	keypad(input, true);
@@ -476,8 +479,7 @@ static size_t windowBottom(const struct Window *window) {
 }
 
 static int windowCols(const struct Window *window) {
-	if (!window->time) return COLS;
-	return COLS - (uiTime.width + 1);
+	return COLS - (window->time ? uiTime.width : 0);
 }
 
 static void mainAdd(int y, bool time, const struct Line *line) {
@@ -498,8 +500,8 @@ static void mainAdd(int y, bool time, const struct Line *line) {
 		waddstr(main, buf);
 		waddch(main, ' ');
 	} else if (time) {
-		whline(main, ' ', uiTime.width + 1);
-		wmove(main, y, uiTime.width + 1);
+		whline(main, ' ', uiTime.width);
+		wmove(main, y, uiTime.width);
 	}
 	styleAdd(main, line->str);
 	getyx(main, ny, nx);
@@ -752,8 +754,8 @@ static void inputUpdate(void) {
 	int y, x;
 	wmove(input, 0, 0);
 	if (window->time && window->id != Network) {
-		whline(input, ' ', uiTime.width + 1);
-		wmove(input, 0, uiTime.width + 1);
+		whline(input, ' ', uiTime.width);
+		wmove(input, 0, uiTime.width);
 	}
 	wattr_set(input, styleAttr(stylePrompt), stylePair(stylePrompt), NULL);
 	waddstr(input, prefix);