From c957d6993b935ecf8d41b434eadf84ac05036337 Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Mon, 6 Sep 2021 13:02:24 +0200 Subject: [PATCH] Add password disclosure feature --- README.md | 1 + main.c | 43 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dca5ef7..de8b25b 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ The biggest obstacle is input processing. [lv_drivers] provides an evdev interfa - On-screen keyboard control via touchscreen (tested on PinePhone) - Switching on-screen keyboard layout at runtime (layouts still to be refined, currently only supports US English and German) - Switching between light and dark theme at runtime +- Disclosing and hiding entered password at runtime ## To do diff --git a/main.c b/main.c index 85ba928..e0bded8 100644 --- a/main.c +++ b/main.c @@ -127,9 +127,12 @@ lv_img_dsc_t mouse_cursor_icon = { // Global variables bool is_dark_theme = false; +bool is_password_hidden = true; + +lv_obj_t *textarea = NULL; lv_obj_t *keyboard = NULL; -// Theming +// Helpers void set_theme(bool is_dark); @@ -138,13 +141,19 @@ void set_theme(bool is_dark) { NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_CYAN), is_dark, &montserrat_extended_32); } +void set_password_hidden(bool is_disclosed); + +void set_password_hidden(bool is_disclosed) { + lv_textarea_set_password_mode(textarea, is_password_hidden); +} + // Event callbacks void keyboard_event_ready_cb(lv_event_t *e); void keyboard_event_ready_cb(lv_event_t *e) { - lv_obj_t *textarea = lv_keyboard_get_textarea(lv_event_get_target(e)); - char *password = lv_textarea_get_text(textarea); + lv_obj_t *obj = lv_keyboard_get_textarea(lv_event_get_target(e)); + char *password = lv_textarea_get_text(obj); printf("You entered %s\n", password); abort(); } @@ -155,6 +164,15 @@ void keyboard_event_cancel_cb(lv_event_t *e) { abort(); } +void discloser_event_cb(lv_event_t *e); + +void discloser_event_cb(lv_event_t *e) { + if(lv_event_get_code(e) == LV_EVENT_VALUE_CHANGED) { + is_password_hidden = !is_password_hidden; + set_password_hidden(is_password_hidden); + } +} + void theme_switcher_event_cb(lv_event_t *e); void theme_switcher_event_cb(lv_event_t *e) { @@ -298,17 +316,32 @@ int main(void) lv_style_set_text_color(&span2->style, lv_palette_main(LV_PALETTE_RED)); // Textarea - lv_obj_t *textarea = lv_textarea_create(lv_scr_act()); + textarea = lv_textarea_create(lv_scr_act()); lv_textarea_set_one_line(textarea, true); lv_textarea_set_password_mode(textarea, true); lv_textarea_set_placeholder_text(textarea, "Enter password..."); - lv_obj_set_size(textarea, hor_res / 2, 64); + lv_obj_set_size(textarea, hor_res / 2, 64); lv_obj_align(textarea, LV_ALIGN_CENTER, 0, ver_res / 2 -keyboard_height - row_height); lv_obj_add_state(textarea, LV_STATE_FOCUSED); lv_style_t style_textarea; lv_style_init(&style_textarea); lv_style_set_text_font(&style_textarea, &montserrat_extended_32); lv_obj_add_style(textarea, &style_textarea, 0); + + // Disclosure button + lv_obj_t *discloser = lv_btn_create(lv_scr_act()); + lv_obj_align(discloser, LV_ALIGN_CENTER, hor_res / 4 + 32, ver_res / 2 -keyboard_height - row_height); + lv_obj_add_flag(discloser, LV_OBJ_FLAG_CHECKABLE); + lv_obj_set_size(discloser, 64, 64); + lv_obj_t *discloser_label = lv_label_create(discloser); + lv_style_t style_discloser_label; + lv_style_init(&style_discloser_label); + lv_style_set_text_font(&style_discloser_label, &montserrat_extended_32); + lv_obj_add_style(discloser_label, &style_discloser_label, 0); + lv_obj_center(discloser_label); + lv_label_set_text(discloser_label, LV_SYMBOL_EYE_OPEN); + lv_obj_add_event_cb(discloser, discloser_event_cb, LV_EVENT_ALL, NULL); + set_password_hidden(is_password_hidden); // Route keyboard input into textarea lv_group_t *group = lv_group_create();