readr

Minimal Terminal RSS Reader
Log | Files | Refs | README | LICENSE

commit 5a7010740b8ec1742b708881a45875e6407a8927
parent ab81a81589c7015445e182833d8d935c19561b12
Author: citbl <citbl@citbl.org>
Date:   Wed,  5 Nov 2025 23:30:56 +1000

basic vim motions added

Diffstat:
Mdocs/readr.scd | 3++-
Msrc/config.h | 2+-
Msrc/keys.c | 79++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
3 files changed, 63 insertions(+), 21 deletions(-)

diff --git a/docs/readr.scd b/docs/readr.scd @@ -36,7 +36,8 @@ https://example2.com/rss https://example3.com/rss ``` -Note that currently we load feeds before the UI, so loading readr will take O(n x loadtime) +Note that we load feeds before the UI, so loading readr will take a couple of +seconds as load feeds multi-threaded (shown with dots, 1 dot per feed). # KEY BINDINGS diff --git a/src/config.h b/src/config.h @@ -1,6 +1,6 @@ #pragma once -#define VERSION "v1.7" +#define VERSION "v1.8" // recommended, pass as chrome for reddit feeds #define USER_AGENT \ diff --git a/src/keys.c b/src/keys.c @@ -7,35 +7,26 @@ #define MAX_PANEL 1 +static void left(app_t*); +static void right(app_t*); +static void up(app_t*); +static void down(app_t*); + void handle_key(app_t* app, struct tb_event ev) { switch (ev.key) { case TB_KEY_ARROW_UP: - if (app->selected_panel == 0) { // change feed - app->selected_feed = MAX(app->selected_feed - 1, 0); - app->selected_post = 0; - } else if (app->selected_panel == 1) { // change post - app->selected_post = MAX(app->selected_post - 1, 0); - } + up(app); break; - case TB_KEY_ARROW_DOWN: - if (app->selected_panel == 0) { // change feed - app->selected_feed = MIN(app->selected_feed + 1, app->feeds_len - 1); - app->selected_post = 0; - } else if (app->selected_panel == 1) { // change post - app->selected_post - = MIN(app->selected_post + 1, app->feeds[app->selected_feed]->posts_len - 1); - } + down(app); break; - case TB_KEY_ARROW_LEFT: // change panel - app->selected_panel = MAX(app->selected_panel - 1, 0); + left(app); break; - case TB_KEY_ARROW_RIGHT: // change panel - app->selected_panel = MIN(app->selected_panel + 1, MAX_PANEL); + right(app); break; case TB_KEY_ENTER: { if (app->selected_panel == 0) { @@ -59,7 +50,20 @@ handle_key(app_t* app, struct tb_event ev) break; } - if (ev.ch == ' ') { // TB_KEY_SPACE for some reason doesn't work /shrug + switch (ev.ch) { + case 'j': + down(app); + break; + case 'k': + up(app); + break; + case 'l': + right(app); + break; + case 'h': + left(app); + break; + case ' ': if (app->selected_panel == 1) { char url[URL_CAP] = { 0 }; db_post_t* post = app->feeds[app->selected_feed]->posts[app->selected_post]; @@ -73,5 +77,42 @@ handle_key(app_t* app, struct tb_event ev) post->seen = 1; open_url(url); } + default: + break; + } +} + +static void +left(app_t* app) +{ + app->selected_panel = MAX(app->selected_panel - 1, 0); +} + +static void +right(app_t* app) +{ + app->selected_panel = MIN(app->selected_panel + 1, MAX_PANEL); +} + +static void +up(app_t* app) +{ + if (app->selected_panel == 0) { // change feed + app->selected_feed = MAX(app->selected_feed - 1, 0); + app->selected_post = 0; + } else if (app->selected_panel == 1) { // change post + app->selected_post = MAX(app->selected_post - 1, 0); + } +} + +static void +down(app_t* app) +{ + if (app->selected_panel == 0) { // change feed + app->selected_feed = MIN(app->selected_feed + 1, app->feeds_len - 1); + app->selected_post = 0; + } else if (app->selected_panel == 1) { // change post + app->selected_post + = MIN(app->selected_post + 1, app->feeds[app->selected_feed]->posts_len - 1); } }