diff options
author | wrmr | 2025-06-24 20:00:42 -0400 |
---|---|---|
committer | wrmr | 2025-06-24 20:00:42 -0400 |
commit | 7a2944c2bffa2092cb68d484477f6a4768396304 (patch) | |
tree | e170f081988d4456831cacff05982d8ed0f5abec /main.c | |
parent | 29ffe89fd2a2028e43ca3aef0dfe20a37348dab9 (diff) |
basically just some mild code organization/consistency tweaks
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 129 |
1 files changed, 65 insertions, 64 deletions
diff --git a/main.c b/main.c index 46d186c..fccd383 100644 --- a/main.c +++ b/main.c @@ -121,8 +121,6 @@ int timestamp_invalid(struct timespec *ts) { return 0; } -/* formatting */ - /* posts */ typedef struct Post { @@ -149,11 +147,11 @@ int ts_cmp(const struct timespec *a, const struct timespec *b) { } int post_cmp(const void *a, const void *b) { - const Post *pa = (const Post *)a; - const Post *pb = (const Post *)b; - return -ts_cmp(&pa->timestamp, &pb->timestamp); + return -ts_cmp(&((const Post *)a)->timestamp, &((const Post *)b)->timestamp); } +/* post indexing */ + /* @path must be both * (a) absolute; and * (b) allocated either statically or within arena @a @@ -210,22 +208,7 @@ void posts_refresh(PostList *posts, Arena *a) { posts_load(posts, a); } -/* display */ - -typedef struct { - Post *src; - Str text; - int lines; - struct { - unsigned drawn : 1; - unsigned has_mention : 1; - }; -} GfxPost; - -typedef struct { - int len; - GfxPost *posts; -} Gfx; +/* word wrapping */ static inline int ch_space(char c) { return c <= 0x20; @@ -255,6 +238,23 @@ int str_cat_wrap(Str *out, Str s, int width, Arena *a) { return lines; } +/* display */ + +typedef struct { + Post *src; + Str text; + int lines; + struct { + unsigned drawn : 1; + unsigned has_mention : 1; + }; +} GfxPost; + +typedef struct { + int len; + GfxPost *posts; +} Gfx; + int gfx_post_width(void) { return getmaxx(stdscr) - GFX_MARGIN_X * 2 - 2; } @@ -343,30 +343,23 @@ void gfx_draw(Gfx *gfx, int cur) { } } -/* main */ - -void init_curses(void) { - setlocale(LC_ALL, ""); - initscr(); - start_color(); - init_color(COLOR_BLACK, 0, 0, 0); - cbreak(); - noecho(); - intrflush(stdscr, FALSE); - keypad(stdscr, TRUE); - curs_set(0); - - init_pair(CPAIR_BORDER, COLOR_BLUE, COLOR_BLACK); - init_pair(CPAIR_USER, COLOR_YELLOW, COLOR_BLACK); - init_pair(CPAIR_TIME, COLOR_BLUE, COLOR_BLACK); - init_pair(CPAIR_TEXT, COLOR_WHITE, COLOR_BLACK); - init_pair(CPAIR_MENTION, COLOR_BLACK, COLOR_WHITE); +/* will skip at least one post, so not suitable for just scrolling one line at + * a time like bink.py does */ +int gfx_line_skip(Gfx *gfx, int cur, 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; } -void fini_curses(void) { - curs_set(1); - endwin(); -} +/* post creation & editing */ char *get_editor(void) { char *editor = getenv("EDITOR"); @@ -374,7 +367,7 @@ char *get_editor(void) { return editor; } -int my_post(Post *post) { +int is_post_mine(Post *post) { return str_eql(post->user, str_from_cstr(getlogin())); } @@ -432,23 +425,31 @@ void new_post(Arena *temp) { fclose(f); } -/* 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; +/* main */ + +void init_curses(void) { + setlocale(LC_ALL, ""); + initscr(); + start_color(); + init_color(COLOR_BLACK, 0, 0, 0); + cbreak(); + noecho(); + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + curs_set(0); + + init_pair(CPAIR_BORDER, COLOR_BLUE, COLOR_BLACK); + init_pair(CPAIR_USER, COLOR_YELLOW, COLOR_BLACK); + init_pair(CPAIR_TIME, COLOR_BLUE, COLOR_BLACK); + init_pair(CPAIR_TEXT, COLOR_WHITE, COLOR_BLACK); + init_pair(CPAIR_MENTION, COLOR_BLACK, COLOR_WHITE); +} + +void fini_curses(void) { + curs_set(1); + endwin(); } -/* might crash on zero posts? */ int main(void) { /* init */ @@ -502,22 +503,22 @@ int main(void) { break; case ' ': case KEY_NPAGE: - cur = line_skip(cur, &gfx, PAGE_LEN); + cur = gfx_line_skip(&gfx, cur, PAGE_LEN); break; case 'd': case 0x04 /* ^D */: - cur = line_skip(cur, &gfx, HALF_PAGE_LEN); + cur = gfx_line_skip(&gfx, cur, HALF_PAGE_LEN); break; case 'b': case KEY_PPAGE: - cur = line_skip(cur, &gfx, -PAGE_LEN); + cur = gfx_line_skip(&gfx, cur, -PAGE_LEN); break; case 'u': case 0x15 /* ^U */: - cur = line_skip(cur, &gfx, -HALF_PAGE_LEN); + cur = gfx_line_skip(&gfx, cur, -HALF_PAGE_LEN); break; case 'e': - if (my_post(&posts.data[cur])) { + if (is_post_mine(&posts.data[cur])) { fini_curses(); edit_post(&posts.data[cur], &temp_arena); init_curses(); |