diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 674e2252f3..164c38905e 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -623,12 +623,14 @@ static int menu_custom_bind_iterate_keyboard(void *data, unsigned action) if (driver.video_data && driver.menu_ctx && driver.menu_ctx->render_messagebox) driver.menu_ctx->render_messagebox(rgui, msg); + bool timed_out = false; if (timeout <= 0) { rgui->binds.begin++; rgui->binds.target->key = RETROK_UNKNOWN; // Could be unsafe, but whatever. rgui->binds.target++; rgui->binds.timeout_end = rarch_get_time_usec() + RGUI_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000; + timed_out = true; } // binds.begin is updated in keyboard_press callback. @@ -639,7 +641,10 @@ static int menu_custom_bind_iterate_keyboard(void *data, unsigned action) // Avoid new binds triggering things right away. rgui->trigger_state = 0; rgui->old_input_state = -1ULL; - input_keyboard_wait_keys_cancel(); + + // We won't be getting any key events, so just cancel early. + if (timed_out) + input_keyboard_wait_keys_cancel(); } return 0; } diff --git a/input/keyboard_line.c b/input/keyboard_line.c index 0e31efb828..c5835a1291 100644 --- a/input/keyboard_line.c +++ b/input/keyboard_line.c @@ -130,10 +130,17 @@ void input_keyboard_wait_keys_cancel(void) void input_keyboard_event(bool down, unsigned code, uint32_t character, uint16_t mod) { - if (g_keyboard_press_cb) + static bool deferred_wait_keys; + + if (deferred_wait_keys) + { + input_keyboard_wait_keys_cancel(); + deferred_wait_keys = false; + } + else if (g_keyboard_press_cb) { if (down && code != RETROK_UNKNOWN && !g_keyboard_press_cb(g_keyboard_press_data, code)) - input_keyboard_wait_keys_cancel(); + deferred_wait_keys = true; } else if (g_keyboard_line) {