diff options
author | wrmr | 2025-08-24 21:30:51 -0400 |
---|---|---|
committer | wrmr | 2025-08-24 21:30:51 -0400 |
commit | 82ff02b24c6fd4933e210da751575ebde0aff932 (patch) | |
tree | be3ca865793db44e37c7d9e16772228e4e9d5524 /main.c | |
parent | 5ff39608e0eb40043564945d52f4234f62d0285d (diff) |
edit ~/.binkpfp with `p`!
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 40 |
1 files changed, 27 insertions, 13 deletions
@@ -220,10 +220,11 @@ void pfp_load(Pfp *pfp, Str src, Arena *a) { } } -User *user_load(Str name, Str binkdir, Arena *a) { +User *user_load(Str name, Str homedir, Str binkdir, Arena *a) { + (void)binkdir; User *u = new(a, User); u->name = str_dup(name, a); - FILE *f = fopen(cstr_fmt(a, "%S/.client/pfp.txt", binkdir), "r/o"); + FILE *f = fopen(cstr_fmt(a, "%S/.binkpfp", homedir), "r/o"); Str pfp_src = {0}; if (f) { read_all(f, &pfp_src, a); @@ -300,18 +301,20 @@ void post_stats_fini(PostStats *ps) { * (a) absolute; and * (b) allocated either statically or within arena @a */ -void posts_gather_from(PostList *posts, Str username, const char *path, Arena *a) { +void posts_gather_from(PostList *posts, Str username, Str homedir, Arena *a) { + const char *path = cstr_fmt(a, "%S/.bink", homedir); DIR *d = opendir(path); if (!d) return; post_stats.user_count++; - User *user = user_load(username, str_from_cstr(path), a); + Str binkdir = str_from_cstr(path); + User *user = user_load(username, homedir, binkdir, a); for (struct dirent *de; (de = readdir(d)); ) { if (*de->d_name == '.') continue; Post p = { 0 }; if (str_to_timespec(str_from_cstr(de->d_name), &p.timestamp)) continue; if (timestamp_invalid(&p.timestamp)) continue; p.user = user; - p.path = cstr_fmt(a, "%s/%s", path, de->d_name); + p.path = cstr_fmt(a, "%S/%s", binkdir, de->d_name); DA_PUSH(posts, p); } closedir(d); @@ -323,10 +326,10 @@ void posts_gather(PostList *posts, Arena *a) { for (struct dirent *de; (de = readdir(d)); ) { if (*de->d_name == '.') continue; posts_gather_from(posts, str_from_cstr(de->d_name), - cstr_fmt(a, "/home/%s/.bink", de->d_name), a); + str_fmt(a, "/home/%s", de->d_name), a); } closedir(d); - posts_gather_from(posts, S("our"), "/town/our/data/.bink", a); + posts_gather_from(posts, S("our"), S("/town/our/data"), a); } void posts_load(PostList *posts, Arena *a) { @@ -542,8 +545,17 @@ char *get_editor(void) { return editor; } +void init_curses(void); +void fini_curses(void); +int edit_file(const char *path, Arena *temp) { + fini_curses(); + int r = system(cstr_fmt(temp, "%s %s", get_editor(), path)); + init_curses(); + return r; +} + void edit_post(Post *post, Arena *temp) { - system(cstr_fmt(temp, "%s %s", get_editor(), post->path)); + edit_file(post->path, temp); } void ensure_dotbink_exists(Arena *temp) { @@ -565,7 +577,7 @@ void new_post(Arena *temp) { const char *tmpf = cstr_fmt(temp, "/tmp/cbink_%s_%U%09u.txt", getlogin(), (uint64_t)ts.tv_sec, (uint32_t)ts.tv_nsec); - if (system(cstr_fmt(temp, "%s %s", get_editor(), tmpf))) return; + if (edit_file(tmpf, temp)) return; Str body = { 0 }; FILE *f = fopen(tmpf, "r/o"); @@ -699,20 +711,22 @@ int main(void) { case 0x15 /* ^U */: cur = gfx_line_skip(&gfx, cur, -HALF_PAGE_LEN); break; + case 'e': if (is_post_mine(&posts.data[cur])) { - fini_curses(); edit_post(&posts.data[cur], &temp_arena); - init_curses(); goto refresh; } else { log_warn("not your post to edit!"); break; } + + case 'p': + edit_file(cstr_fmt(&temp_arena, "/home/%s/.binkpfp", getlogin()), &temp_arena); + goto refresh; + case 'c': - fini_curses(); new_post(&temp_arena); - init_curses(); /* fallthrough */ case 'r': refresh: |