keys.c (2598B)
#include "config.h"
#include "db.h"
#include "readr.h"
#include "tui.h"
#include "utils.h"
#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:
up(app);
break;
case TB_KEY_ARROW_DOWN:
down(app);
break;
case TB_KEY_ARROW_LEFT: // change panel
left(app);
break;
case TB_KEY_ARROW_RIGHT: // change panel
right(app);
break;
case TB_KEY_ENTER: {
if (app->selected_panel == 0) {
open_url(app->feeds[app->selected_feed]->website_url);
} else if (app->selected_panel == 1) {
char url[URL_CAP] = { 0 };
db_post_t* post = app->feeds[app->selected_feed]->posts[app->selected_post];
size_t len = MIN(URL_CAP, strlen(post->link));
if (len == 0) return;
strncpy(url, post->link, len);
url[len] = '\0';
if (db_mark_as_seen(post->id)) {
fprintf(stderr, "could not mark post as seen, id %d\n", post->id);
};
post->seen = 1;
open_url(url);
}
break;
}
default:
break;
}
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];
size_t len = MIN(URL_CAP, strlen(post->comments));
if (len == 0) return;
strncpy(url, post->comments, len);
url[len] = '\0';
if (db_mark_as_seen(post->id)) {
fprintf(stderr, "could not mark post as seen, id %d\n", post->id);
}
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
// MAX was causing unsigned int wraparound
if (app->selected_feed == 0) return;
app->selected_feed -= 1;
app->selected_post = 0;
} else if (app->selected_panel == 1) { // change post
if (app->selected_post == 0) return;
app->selected_post -= 1;
}
}
static void
down(app_t* app)
{
if (app->selected_panel == 0) { // change feed
if (app->selected_feed == app->feeds_len - 1) return;
app->selected_feed += 1;
app->selected_post = 0;
} else if (app->selected_panel == 1) { // change post
if (app->selected_post == app->feeds[app->selected_feed]->posts_len - 1) return;
app->selected_post += 1;
}
}