diff --git a/input/input_driver.c b/input/input_driver.c index bcd228d495..8f5a2a746d 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1050,6 +1050,27 @@ void input_keyboard_line_append( keyboard_line->buffer = newbuf; } +void input_keyboard_line_clear(input_driver_state_t *input_st) +{ + if (input_st->keyboard_line.buffer) + free(input_st->keyboard_line.buffer); + input_st->keyboard_line.buffer = NULL; + input_st->keyboard_line.ptr = 0; + input_st->keyboard_line.size = 0; +} + +void input_keyboard_line_free(input_driver_state_t *input_st) +{ + if (input_st->keyboard_line.buffer) + free(input_st->keyboard_line.buffer); + input_st->keyboard_line.buffer = NULL; + input_st->keyboard_line.ptr = 0; + input_st->keyboard_line.size = 0; + input_st->keyboard_line.cb = NULL; + input_st->keyboard_line.userdata = NULL; + input_st->keyboard_line.enabled = false; +} + const char **input_keyboard_start_line( void *userdata, struct input_keyboard_line *keyboard_line, @@ -6313,6 +6334,23 @@ void input_driver_collect_system_input(input_driver_state_t *input_st, BIT256_SET_PTR(current_bits, ids[i][1]); } } + else if (display_kb + && current_input + && current_input->input_state) + { + /* Set RetroPad Select bit when pressing Escape while keyboard + * is open in order to clear the input window and close it */ + if (current_input->input_state( + input_st->current_data, + joypad, + sec_joypad, + &joypad_info, + (const retro_keybind_set *)input_config_binds, + (input_st->flags & INP_FLAG_KB_MAPPING_BLOCKED) ? true : false, + 0, + RETRO_DEVICE_KEYBOARD, 0, RETROK_ESCAPE)) + BIT256_SET_PTR(current_bits, RETRO_DEVICE_ID_JOYPAD_SELECT); + } } else #endif /* HAVE_MENU */ @@ -6552,14 +6590,7 @@ void input_keyboard_event(bool down, unsigned code, return; /* Line is complete, can free it now. */ - if (input_st->keyboard_line.buffer) - free(input_st->keyboard_line.buffer); - input_st->keyboard_line.buffer = NULL; - input_st->keyboard_line.ptr = 0; - input_st->keyboard_line.size = 0; - input_st->keyboard_line.cb = NULL; - input_st->keyboard_line.userdata = NULL; - input_st->keyboard_line.enabled = false; + input_keyboard_line_free(input_st); /* Unblock all hotkeys. */ input_st->flags &= ~INP_FLAG_KB_MAPPING_BLOCKED; diff --git a/input/input_driver.h b/input/input_driver.h index 84ad1b39af..c857c86e79 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -930,6 +930,9 @@ void input_keyboard_line_append( struct input_keyboard_line *keyboard_line, const char *word, size_t len); +void input_keyboard_line_clear(input_driver_state_t *input_st); +void input_keyboard_line_free(input_driver_state_t *input_st); + /** * input_keyboard_start_line: * @userdata : Userdata. diff --git a/menu/menu_driver.c b/menu/menu_driver.c index cf2c30f7c7..0b16aa44a0 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -5488,12 +5488,29 @@ unsigned menu_event( strlen(input_st->osk_grid[input_st->osk_ptr])); } + /* Cancel: Send backspace if buffer is not empty, otherwise close window */ if (BIT256_GET_PTR(p_trigger_input, menu_cancel_btn)) - input_keyboard_event(true, '\x7f', '\x7f', - 0, RETRO_DEVICE_KEYBOARD); + { + if (input_st->keyboard_line.size) + input_keyboard_event(true, '\x7f', '\x7f', 0, RETRO_DEVICE_KEYBOARD); + else + input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); + } - /* send return key to close keyboard input window */ - if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) + /* Select: Clear and close the keyboard input window */ + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + { + input_keyboard_line_clear(input_st); + input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); + } + + /* Scan: Clear the keyboard input window */ + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) + input_keyboard_line_clear(input_st); + + /* Start + Search: Send return key to close keyboard input window */ + if ( BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START) + || BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); #ifdef HAVE_MIST @@ -7849,14 +7866,7 @@ bool menu_input_dialog_start_search(void) msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SEARCH), sizeof(menu_st->input_dialog_kb_label)); - if (input_st->keyboard_line.buffer) - free(input_st->keyboard_line.buffer); - input_st->keyboard_line.buffer = NULL; - input_st->keyboard_line.ptr = 0; - input_st->keyboard_line.size = 0; - input_st->keyboard_line.cb = NULL; - input_st->keyboard_line.userdata = NULL; - input_st->keyboard_line.enabled = false; + input_keyboard_line_free(input_st); #ifdef HAVE_ACCESSIBILITY if (is_accessibility_enabled( @@ -7910,14 +7920,7 @@ bool menu_input_dialog_start(menu_input_ctx_line_t *line) menu_st->input_dialog_kb_type = line->type; menu_st->input_dialog_kb_idx = line->idx; - if (input_st->keyboard_line.buffer) - free(input_st->keyboard_line.buffer); - input_st->keyboard_line.buffer = NULL; - input_st->keyboard_line.ptr = 0; - input_st->keyboard_line.size = 0; - input_st->keyboard_line.cb = NULL; - input_st->keyboard_line.userdata = NULL; - input_st->keyboard_line.enabled = false; + input_keyboard_line_free(input_st); #ifdef HAVE_ACCESSIBILITY if (is_accessibility_enabled(