diff --git a/include/camera.h b/include/camera.h index ec123ac..90da56a 100644 --- a/include/camera.h +++ b/include/camera.h @@ -34,13 +34,14 @@ typedef struct { u32 *texture_buffer; Handle mutex; volatile bool finished; + volatile bool success; Handle cancel; bool capturing; struct quirc* context; } qr_data; -void init_qr(EntryMode current_mode); +bool init_qr(EntryMode current_mode); void exit_qr(qr_data *data); void take_picture(void); Result http_get(char *url, const char *path); diff --git a/source/camera.c b/source/camera.c index 2d9889c..3f6c617 100644 --- a/source/camera.c +++ b/source/camera.c @@ -141,7 +141,7 @@ bool start_capture_cam(qr_data *data) void update_qr(qr_data *data, EntryMode current_mode) { hidScanInput(); - if (hidKeysDown() & KEY_R) { + if (hidKeysDown() & (KEY_R | KEY_B | KEY_TOUCH)) { exit_qr(data); return; } @@ -169,10 +169,11 @@ void update_qr(qr_data *data, EntryMode current_mode) pp2d_load_texture_memory(TEXTURE_QR, data->texture_buffer, 400, 240); pp2d_draw_texture(TEXTURE_QR, 0, 0); - pp2d_draw_rectangle(0, 216, 400, 24, RGBA8(55, 122, 168, 255)); - pp2d_draw_text_center(GFX_TOP, 220, 0.5, 0.5, RGBA8(255, 255, 255, 255), "Press \uE005 To Quit"); + + pp2d_draw_on(GFX_BOTTOM, GFX_LEFT); + pp2d_draw_text_center(GFX_BOTTOM, 4, 0.5, 0.5, RGBA8(255, 255, 255, 255), "Press \uE005 To Quit"); pp2d_end_draw(); - + int w; int h; u8 *image = (u8*) quirc_begin(data->context, &w, &h); @@ -194,12 +195,13 @@ void update_qr(qr_data *data, EntryMode current_mode) { exit_qr(data); http_get((char*)scan_data.payload, main_paths[current_mode]); + data->success = true; } } - + } -void init_qr(EntryMode current_mode) +bool init_qr(EntryMode current_mode) { qr_data *data = calloc(1, sizeof(qr_data)); data->capturing = false; @@ -211,6 +213,8 @@ void init_qr(EntryMode current_mode) data->texture_buffer = calloc(1, 400 * 240 * sizeof(u32)); while (!data->finished) update_qr(data, current_mode); + + return (bool)data->success; } /* diff --git a/source/main.c b/source/main.c index 861bc02..16a0ccd 100644 --- a/source/main.c +++ b/source/main.c @@ -108,17 +108,21 @@ static void exit_thread(void) } } -void exit_function(bool power_pressed) +void free_lists(void) { stop_install_check(); for(int i = 0; i < MODE_AMOUNT; i++) { Entry_List_s * current_list = &lists[i]; free(current_list->entries); - current_list->entries = NULL; + memset(current_list, 0, sizeof(Entry_List_s)); } - exit_thread(); +} + +void exit_function(bool power_pressed) +{ + free_lists(); svcCloseHandle(update_icons_handle); exit_screens(); exit_services(); @@ -209,8 +213,7 @@ static void load_lists(Entry_List_s * lists) { ssize_t texture_id_offset = TEXTURE_ICON; - stop_install_check(); - exit_thread(); + free_lists(); for(int i = 0; i < MODE_AMOUNT; i++) { InstallType loading_screen = INSTALL_NONE; @@ -222,8 +225,6 @@ static void load_lists(Entry_List_s * lists) draw_install(loading_screen); Entry_List_s * current_list = &lists[i]; - free(current_list->entries); - memset(current_list, 0, sizeof(Entry_List_s)); Result res = load_entries(main_paths[i], current_list, i); if(R_SUCCEEDED(res)) { @@ -353,7 +354,13 @@ int main(void) u32 out; ACU_GetWifiStatus(&out); if(out) - init_qr(current_mode); + { + + if(init_qr(current_mode)) + { + load_lists(lists); + } + } else { throw_error("Please connect to Wi-Fi before scanning QRs", ERROR_LEVEL_WARNING);