keys.c (2598B)
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 // MAX was causing unsigned int wraparound 102 if (app->selected_feed == 0) return; 103 app->selected_feed -= 1; 104 app->selected_post = 0; 105 } else if (app->selected_panel == 1) { // change post 106 if (app->selected_post == 0) return; 107 app->selected_post -= 1; 108 } 109 } 110 111 static void 112 down(app_t* app) 113 { 114 if (app->selected_panel == 0) { // change feed 115 if (app->selected_feed == app->feeds_len - 1) return; 116 app->selected_feed += 1; 117 app->selected_post = 0; 118 } else if (app->selected_panel == 1) { // change post 119 if (app->selected_post == app->feeds[app->selected_feed]->posts_len - 1) return; 120 app->selected_post += 1; 121 } 122 }