readr

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

keys.c (2509B)


      1 
      2 #include "config.h"
      3 #include "db.h"
      4 #include "readr.h"
      5 #include "tui.h"
      6 #include "utils.h"
      7 
      8 #define MAX_PANEL 1
      9 
     10 static void left(app_t*);
     11 static void right(app_t*);
     12 static void up(app_t*);
     13 static void down(app_t*);
     14 
     15 void
     16 handle_key(app_t* app, struct tb_event ev)
     17 {
     18 	switch (ev.key) {
     19 	case TB_KEY_ARROW_UP:
     20 		up(app);
     21 		break;
     22 	case TB_KEY_ARROW_DOWN:
     23 		down(app);
     24 		break;
     25 	case TB_KEY_ARROW_LEFT: // change panel
     26 		left(app);
     27 		break;
     28 	case TB_KEY_ARROW_RIGHT: // change panel
     29 		right(app);
     30 		break;
     31 	case TB_KEY_ENTER: {
     32 		if (app->selected_panel == 0) {
     33 			open_url(app->feeds[app->selected_feed]->website_url);
     34 		} else if (app->selected_panel == 1) {
     35 			char url[URL_CAP] = { 0 };
     36 			db_post_t* post = app->feeds[app->selected_feed]->posts[app->selected_post];
     37 			size_t len = MIN(URL_CAP, strlen(post->link));
     38 			if (len == 0) return;
     39 			strncpy(url, post->link, len);
     40 			url[len] = '\0';
     41 			if (db_mark_as_seen(post->id)) {
     42 				fprintf(stderr, "could not mark post as seen, id %d\n", post->id);
     43 			};
     44 			post->seen = 1;
     45 			open_url(url);
     46 		}
     47 		break;
     48 	}
     49 	default:
     50 		break;
     51 	}
     52 
     53 	switch (ev.ch) {
     54 	case 'j':
     55 		down(app);
     56 		break;
     57 	case 'k':
     58 		up(app);
     59 		break;
     60 	case 'l':
     61 		right(app);
     62 		break;
     63 	case 'h':
     64 		left(app);
     65 		break;
     66 	case ' ':
     67 		if (app->selected_panel == 1) {
     68 			char url[URL_CAP] = { 0 };
     69 			db_post_t* post = app->feeds[app->selected_feed]->posts[app->selected_post];
     70 			size_t len = MIN(URL_CAP, strlen(post->comments));
     71 			if (len == 0) return;
     72 			strncpy(url, post->comments, len);
     73 			url[len] = '\0';
     74 			if (db_mark_as_seen(post->id)) {
     75 				fprintf(stderr, "could not mark post as seen, id %d\n", post->id);
     76 			}
     77 			post->seen = 1;
     78 			open_url(url);
     79 		}
     80 	default:
     81 		break;
     82 	}
     83 }
     84 
     85 static void
     86 left(app_t* app)
     87 {
     88 	app->selected_panel = MAX(app->selected_panel - 1, 0);
     89 }
     90 
     91 static void
     92 right(app_t* app)
     93 {
     94 	app->selected_panel = MIN(app->selected_panel + 1, MAX_PANEL);
     95 }
     96 
     97 static void
     98 up(app_t* app)
     99 {
    100 	if (app->selected_panel == 0) { // change feed
    101 		app->selected_feed = MAX(app->selected_feed - 1, 0);
    102 		app->selected_post = 0;
    103 	} else if (app->selected_panel == 1) { // change post
    104 		app->selected_post = MAX(app->selected_post - 1, 0);
    105 	}
    106 }
    107 
    108 static void
    109 down(app_t* app)
    110 {
    111 	if (app->selected_panel == 0) { // change feed
    112 		app->selected_feed = MIN(app->selected_feed + 1, app->feeds_len - 1);
    113 		app->selected_post = 0;
    114 	} else if (app->selected_panel == 1) { // change post
    115 		app->selected_post
    116 			= MIN(app->selected_post + 1, app->feeds[app->selected_feed]->posts_len - 1);
    117 	}
    118 }