diff --git a/ui.c b/ui.c index 7bd3cac..fad8472 100644 --- a/ui.c +++ b/ui.c @@ -106,6 +106,9 @@ void ui_set_keypad_text(const char *text) // of an empty buffer, so a single ENTER accepts it unchanged static bool keypad_text_preset = false; +// Set while handling a keypad key that was held down longer than a short tap +static bool keypad_long_press = false; + #ifdef __SD_FILE_BROWSER__ // Preset the keypad input with the first len characters of text static void ui_preset_keypad_text(const char *text, int len) @@ -7821,7 +7824,10 @@ full_keypad_click(int c, int kp_index) if (c == S_LARROW[0]) { // Backspace if (kp_index == 0) return KP_CANCEL; - --kp_index; + if (keypad_long_press) // long press erases the whole input, stay in the keypad + kp_index = 0; + else + --kp_index; } else if (kp_index < TXTINPUT_LEN) { // any other text input kp_buf[kp_index++] = c; } @@ -7854,7 +7860,9 @@ keypad_apply_touch(void) int old = selection; draw_keypad_button(selection = i); // draw new focus draw_keypad_button(old); // Erase old focus + systime_t ticks = chVTGetSystemTimeX(); touch_wait_release(); + keypad_long_press = (chVTGetSystemTimeX() - ticks) >= BUTTON_DOWN_LONG_TICKS; selection = -1; draw_keypad_button(i); // erase new focus return i; // Process input; @@ -7874,6 +7882,7 @@ ui_process_keypad(void) // invoke must not silently accept it bool preset_text = keypad_text_preset && !in_menu_command; keypad_text_preset = false; + keypad_long_press = false; if (!preset_text) kp_buf[0] = 0; if (in_menu_command) return; @@ -7899,6 +7908,7 @@ ui_process_keypad(void) } if (status == EVT_BUTTON_SINGLE_CLICK) { + keypad_long_press = false; // lever click is never a long press if (selection >= 0 && keypad_click(selection)) /* exit loop on done or cancel */ break;