readr

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

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;
	}
}