diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 101 |
1 files changed, 62 insertions, 39 deletions
@@ -33,10 +33,12 @@ #define STR_IMPL #define STRIO_IMPL #define ARENA_IMPL +#define OPT_IMPL #include "str.h" #include "strio.h" #include "arena.h" +#include "opt.h" #define POST_LIMIT 200 /* see bink.py */ #define PAGE_LEN getmaxy(stdscr) @@ -60,24 +62,31 @@ /* colors */ -#define CPAIR_INIT_X(cp, fg, bg) init_pair(cp, fg, bg); -#define CPAIR_ENUM_X(cp, fg, bg) cp, +#define CPAIR_ENUM_X(cp, fg, bg, name) cp, +#define CPAIR_OPT_X(cp, fg_, bg_, name) opt.color[cp] = (ColorOpt) { .fg = fg_, .bg = bg_ }; +#define CPAIR_INIT_X(cp, fg_, bg_, name) init_pair(cp, opt.color[cp].fg, opt.color[cp].bg); +#define COLOR_NORM -1 +#define COLOR_FG COLOR_NORM +#define COLOR_BG COLOR_NORM #define CPAIR_LIST(X)\ - X(CPAIR_TEXT , COLOR_WHITE , COLOR_BLACK)\ - X(CPAIR_MENTION , COLOR_BLACK , COLOR_WHITE)\ - X(CPAIR_USER , COLOR_YELLOW , COLOR_BLACK)\ - X(CPAIR_PRONOUNS , COLOR_CYAN , COLOR_BLACK)\ - X(CPAIR_TIME , COLOR_BLUE , COLOR_BLACK)\ - X(CPAIR_PFP , COLOR_BLUE , COLOR_BLACK)\ - X(CPAIR_PFP_SELF , COLOR_YELLOW , COLOR_BLACK)\ - X(CPAIR_BANNER , COLOR_WHITE , COLOR_BLACK)\ - X(CPAIR_BORDER , COLOR_BLUE , COLOR_BLACK)\ - X(CPAIR_TAGLINE_OK , COLOR_GREEN , COLOR_BLACK)\ - X(CPAIR_TAGLINE_WARN , COLOR_YELLOW , COLOR_BLACK)\ - X(CPAIR_TAGLINE_ERR , COLOR_RED , COLOR_BLACK) + X(CPAIR_TEXT , COLOR_FG , COLOR_BG, "text")\ + X(CPAIR_MENTION , COLOR_BG , COLOR_FG, "mention")\ + X(CPAIR_USER , COLOR_YELLOW , COLOR_BG, "user")\ + X(CPAIR_PRONOUNS , COLOR_CYAN , COLOR_BG, "pronouns")\ + X(CPAIR_TIME , COLOR_BLUE , COLOR_BG, "time")\ + X(CPAIR_PFP , COLOR_BLUE , COLOR_BG, "pfp")\ + X(CPAIR_PFP_SELF , COLOR_YELLOW , COLOR_BG, "pfp.self")\ + X(CPAIR_BANNER , COLOR_FG , COLOR_BG, "banner")\ + X(CPAIR_BORDER , COLOR_BLUE , COLOR_BG, "border")\ + X(CPAIR_MSG_OK , COLOR_GREEN , COLOR_BG, "msg.ok")\ + X(CPAIR_MSG_WARN , COLOR_YELLOW , COLOR_BG, "msg.warn")\ + X(CPAIR_MSG_ERR , COLOR_RED , COLOR_BG, "msg.err") typedef enum { + /* not all curses implementation allow modifying cpair 0 */ + CPAIR_UNUSED, CPAIR_LIST(CPAIR_ENUM_X) + CPAIR_MAX } ColorPair; /* dynamic arrays */ @@ -132,12 +141,18 @@ int utf8_cp_to_byte(Str s, int dest) { /* options */ typedef struct { + int fg, bg; +} ColorOpt; + +typedef struct { struct { int pfp, pronouns; } see; struct { int left, right, top, bottom; } margin; + int default_colors; + ColorOpt color[CPAIR_MAX]; } Options; /* globals */ @@ -151,27 +166,28 @@ Options opt = { .margin = { .left = 0, .right = 0 - } + }, + .default_colors = 1 }; -/* tagline & logging */ +/* msg & logging */ -#define TAGLINE_MAX 1024 -char tagline[TAGLINE_MAX] = { 0 }; +#define MSG_MAX 1024 +char msg[MSG_MAX] = { 0 }; typedef enum { - TAGLINE_OK, - TAGLINE_WARN, - TAGLINE_ERR + MSG_OK, + MSG_WARN, + MSG_ERR } TaglineStatus; -TaglineStatus tagline_status = TAGLINE_OK; +TaglineStatus msg_status = MSG_OK; -void tagline_set(const char *fmt, ...) { +void msg_set(const char *fmt, ...) { va_list ap; va_start(ap, fmt); - vsnprintf(tagline, TAGLINE_MAX - 1, fmt, ap); + vsnprintf(msg, MSG_MAX - 1, fmt, ap); va_end(ap); - tagline_status = TAGLINE_OK; + msg_status = MSG_OK; } void log_warn(const char *fmt, ...) { @@ -179,9 +195,9 @@ void log_warn(const char *fmt, ...) { va_start(ap, fmt); beep(); flash(); - vsnprintf(tagline, TAGLINE_MAX - 1, fmt, ap); + vsnprintf(msg, MSG_MAX - 1, fmt, ap); va_end(ap); - tagline_status = TAGLINE_WARN; + msg_status = MSG_WARN; } void log_err(const char *fmt, ...) { @@ -189,11 +205,11 @@ void log_err(const char *fmt, ...) { flash(); va_list ap; va_start(ap, fmt); - vsnprintf(tagline, TAGLINE_MAX - 1, fmt, ap); - size_t n = strlen(tagline); - snprintf(tagline + n, TAGLINE_MAX - n - 1, ": %s", strerror(errno)); + vsnprintf(msg, MSG_MAX - 1, fmt, ap); + size_t n = strlen(msg); + snprintf(msg + n, MSG_MAX - n - 1, ": %s", strerror(errno)); va_end(ap); - tagline_status = TAGLINE_ERR; + msg_status = MSG_ERR; } /* string conversion */ @@ -820,13 +836,14 @@ void init_curses(void) { setlocale(LC_ALL, ""); initscr(); start_color(); - init_color(COLOR_BLACK, 0, 0, 0); + init_color(COLOR_BG, 0, 0, 0); cbreak(); noecho(); intrflush(stdscr, FALSE); keypad(stdscr, TRUE); curs_set(0); + if (opt.default_colors) use_default_colors(); CPAIR_LIST(CPAIR_INIT_X) } @@ -835,6 +852,11 @@ void fini_curses(void) { endwin(); } +void load_config(void) { + CPAIR_LIST(CPAIR_OPT_X) + /* TODO: load cbinkrc */ +} + /* main */ int main(void) { @@ -856,6 +878,7 @@ int main(void) { "([ \t\n]+|^)[@~]?%s([:;,.!? \t\n]|$)", getlogin()), REG_EXTENDED | REG_ICASE | REG_NOSUB); + load_config(); init_curses(); posts_refresh(&posts, &post_arena); @@ -868,13 +891,13 @@ int main(void) { arena_reset(&temp_arena); gfx_draw(&gfx, cur, &temp_arena); - switch (tagline_status) { - case TAGLINE_OK: color_set(CPAIR_TAGLINE_OK, 0); break; - case TAGLINE_WARN: color_set(CPAIR_TAGLINE_WARN, 0); break; - case TAGLINE_ERR: color_set(CPAIR_TAGLINE_ERR, 0); break; + switch (msg_status) { + case MSG_OK: color_set(CPAIR_MSG_OK, 0); break; + case MSG_WARN: color_set(CPAIR_MSG_WARN, 0); break; + case MSG_ERR: color_set(CPAIR_MSG_ERR, 0); break; } - mvaddstr(getmaxy(stdscr) - 1, getmaxx(stdscr) - strlen(tagline), tagline); - tagline[0] = '\0'; + mvaddstr(getmaxy(stdscr) - 1, getmaxx(stdscr) - strlen(msg), msg); + msg[0] = '\0'; int ch = getch(); if (ch == 'q') break; @@ -932,7 +955,7 @@ int main(void) { refresh: arena_reset(&post_arena); posts_refresh(&posts, &post_arena); - tagline_set("%zu users, %zu posts, %zums", post_stats.user_count, post_stats.post_count, + msg_set("%zu users, %zu posts, %zums", post_stats.user_count, post_stats.post_count, post_stats.gather_ns / 1000000); goto resize; case '\t': |