readr

Minimal RSS reader (WIP)
Log | Files | Refs | README | LICENSE

commit 65d913e706558b49fa1d004b043119bfd599e50b
parent 39f7911506b8e593009c0fff0d43675987354a86
Author: citbl <citbl@citbl.org>
Date:   Wed,  8 Oct 2025 23:00:08 +1000

volatile seen status and more UI impr

Diffstat:
MTODO | 2+-
Mkeys.c | 2++
Mreadr.h | 1+
Mrender.c | 46+++++++++++++++++++++++++++++++---------------
4 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/TODO b/TODO @@ -1,7 +1,7 @@ show more show domains show ending (html|pdf) -caching +caching, persist links and seen instant display background fetching status bar diff --git a/keys.c b/keys.c @@ -45,6 +45,7 @@ handle_key(app_t* app, struct tb_event ev) if (len == 0) return; strncpy(url, &post->data[post->link.start], len); url[len] = '\0'; + post->seen = 1; open_url(url); } break; @@ -61,6 +62,7 @@ handle_key(app_t* app, struct tb_event ev) if (len == 0) return; strncpy(url, &post->data[post->comments.start], len); url[len] = '\0'; + post->seen = 1; open_url(url); } } diff --git a/readr.h b/readr.h @@ -15,6 +15,7 @@ typedef struct { const char* data; size_t data_len; slice_t title, link, comments, desc, date, author; + int seen; } post_t; typedef struct { diff --git a/render.c b/render.c @@ -58,30 +58,46 @@ draw_background(void) void render(app_t* app) { + int i; uintattr_t color; + size_t title_len; + char title[TITLE_CAP] = { 0 }; + post_t* post; + feed_t* feed; + feed_t* selected_feed = app->feeds[app->selected_feed]; draw_background(); - draw_bars(); - int i; for (i = 0; i < app->feeds_len; i++) { - const feed_t* feed = app->feeds[i]; - color = (app->selected_panel == 0 && i == app->selected_feed) ? (FEED_COLOR | TB_REVERSE) - : (FEED_COLOR); + feed = app->feeds[i]; + + if (app->selected_panel == 0 && i == app->selected_feed) + color = (FEED_COLOR | TB_REVERSE | TB_BRIGHT | TB_BOLD); + else if (i == app->selected_feed) + color = (FEED_COLOR | TB_BOLD); + else + color = (FEED_COLOR | TB_DIM); + tb_print(2, 4 + i, color, BACK_COLOR, feed->title ? feed->title : "N/A"); } - char title[TITLE_CAP] = { 0 }; - feed_t* feed = app->feeds[app->selected_feed]; - - for (i = 0; i < feed->posts_len; i++) { - const post_t* post = feed->posts[i]; - size_t len = MIN(TITLE_CAP, post->title.len); - strncpy(title, &post->data[post->title.start], len); - title[len] = '\0'; - color = (app->selected_panel == 1 && i == app->selected_post) ? (POST_COLOR | TB_REVERSE) - : (POST_COLOR); + for (i = 0; i < selected_feed->posts_len; i++) { + post = selected_feed->posts[i]; + title_len = MIN(TITLE_CAP, post->title.len); + strncpy(title, &post->data[post->title.start], title_len); + title[title_len] = '\0'; + + if (app->selected_panel == 1 && i == app->selected_post) + if (post->seen) + color = (POST_COLOR | TB_REVERSE | TB_DIM); + else + color = (POST_COLOR | TB_REVERSE | TB_BRIGHT | TB_BOLD); + else if (post->seen) + color = (SEEN_COLOR); + else + color = (POST_COLOR); + tb_print(FEED_CAP + 10, 4 + i, color, BACK_COLOR, title); }