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 }