readr

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

keys.c (2032B)


      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 void
     11 handle_key(app_t* app, struct tb_event ev)
     12 {
     13 	switch (ev.key) {
     14 	case TB_KEY_ARROW_UP:
     15 		if (app->selected_panel == 0) { // change feed
     16 			app->selected_feed = MAX(app->selected_feed - 1, 0);
     17 			app->selected_post = 0;
     18 		} else if (app->selected_panel == 1) { // change post
     19 			app->selected_post = MAX(app->selected_post - 1, 0);
     20 		}
     21 		break;
     22 
     23 	case TB_KEY_ARROW_DOWN:
     24 		if (app->selected_panel == 0) { // change feed
     25 			app->selected_feed = MIN(app->selected_feed + 1, app->feeds_len - 1);
     26 			app->selected_post = 0;
     27 		} else if (app->selected_panel == 1) { // change post
     28 			app->selected_post
     29 				= MIN(app->selected_post + 1, app->feeds[app->selected_feed]->posts_len - 1);
     30 		}
     31 		break;
     32 
     33 	case TB_KEY_ARROW_LEFT: // change panel
     34 		app->selected_panel = MAX(app->selected_panel - 1, 0);
     35 		break;
     36 
     37 	case TB_KEY_ARROW_RIGHT: // change panel
     38 		app->selected_panel = MIN(app->selected_panel + 1, MAX_PANEL);
     39 		break;
     40 	case TB_KEY_ENTER: {
     41 		if (app->selected_panel == 1) {
     42 			char url[URL_CAP] = { 0 };
     43 			db_post_t* post = app->feeds[app->selected_feed]->posts[app->selected_post];
     44 			size_t len = MIN(URL_CAP, strlen(post->link));
     45 			if (len == 0) return;
     46 			strncpy(url, post->link, len);
     47 			url[len] = '\0';
     48 			if (db_mark_as_seen(post->id)) {
     49 				fprintf(stderr, "could not mark post as seen, id %d\n", post->id);
     50 			};
     51 			post->seen = 1;
     52 			open_url(url);
     53 		}
     54 		break;
     55 	}
     56 	default:
     57 		break;
     58 	}
     59 
     60 	if (ev.ch == ' ') { // TB_KEY_SPACE for some reason doesn't work /shrug
     61 		if (app->selected_panel == 1) {
     62 			char url[URL_CAP] = { 0 };
     63 			db_post_t* post = app->feeds[app->selected_feed]->posts[app->selected_post];
     64 			size_t len = MIN(URL_CAP, strlen(post->comments));
     65 			if (len == 0) return;
     66 			strncpy(url, post->comments, len);
     67 			url[len] = '\0';
     68 			if (db_mark_as_seen(post->id)) {
     69 				fprintf(stderr, "could not mark post as seen, id %d\n", post->id);
     70 			}
     71 			post->seen = 1;
     72 			open_url(url);
     73 		}
     74 	}
     75 }