diff --git a/driver.h b/driver.h index 95880f773c..5ab6685815 100644 --- a/driver.h +++ b/driver.h @@ -267,7 +267,6 @@ typedef struct driver rarch_remote_t *remote; #endif bool block_libretro_input; - bool flushing_input; bool nonblock_state; /* Last message given to the video driver */ diff --git a/input/input_driver.c b/input/input_driver.c index de54762164..c8ad9bab85 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -82,6 +82,7 @@ struct turbo_buttons unsigned count; }; +static bool flushing_input; static bool block_hotkey; static turbo_buttons_t turbo_btns; @@ -499,7 +500,7 @@ int16_t input_state(unsigned port, unsigned device, if (settings->input.remap_binds_enable) input_remapping_state(port, &device, &idx, &id); - if (!driver->flushing_input && !driver->block_libretro_input) + if (!flushing_input && !driver->block_libretro_input) { if (((id < RARCH_FIRST_META_KEY) || (device == RETRO_DEVICE_KEYBOARD))) res = input->input_state(driver->input_data, libretro_input_binds, port, device, idx, id); @@ -687,7 +688,8 @@ bool input_driver_ctl(enum rarch_input_ctl_state state, void *data) driver->input->free(driver->input_data); return true; case RARCH_INPUT_CTL_DESTROY: - block_hotkey = false; + flushing_input = false; + block_hotkey = false; memset(&turbo_btns, 0, sizeof(turbo_buttons_t)); if (!driver) return false; @@ -727,6 +729,14 @@ bool input_driver_ctl(enum rarch_input_ctl_state state, void *data) } return true; + case RARCH_INPUT_CTL_SET_FLUSHING_INPUT: + flushing_input = true; + break; + case RARCH_INPUT_CTL_UNSET_FLUSHING_INPUT: + flushing_input = false; + break; + case RARCH_INPUT_CTL_IS_FLUSHING_INPUT: + return flushing_input; case RARCH_INPUT_CTL_NONE: default: break; diff --git a/input/input_driver.h b/input/input_driver.h index 6b08f45bec..f7883af300 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -56,7 +56,10 @@ enum rarch_input_ctl_state RARCH_INPUT_CTL_POLL, RARCH_INPUT_CTL_FIND_DRIVER, RARCH_INPUT_CTL_GRAB_STDIN, - RARCH_INPUT_CTL_KB_MAPPING_IS_BLOCKED + RARCH_INPUT_CTL_KB_MAPPING_IS_BLOCKED, + RARCH_INPUT_CTL_SET_FLUSHING_INPUT, + RARCH_INPUT_CTL_UNSET_FLUSHING_INPUT, + RARCH_INPUT_CTL_IS_FLUSHING_INPUT }; struct retro_keybind diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 29f0d6f2e3..073e15f6d0 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -329,7 +329,7 @@ void menu_driver_toggle(bool latch) event_command(EVENT_CMD_AUDIO_START); /* Prevent stray input from going to libretro core */ - driver->flushing_input = true; + input_driver_ctl(RARCH_INPUT_CTL_SET_FLUSHING_INPUT, NULL); /* Restore libretro keyboard callback. */ if (global) diff --git a/menu/menu_input.c b/menu/menu_input.c index a6aff22f72..cd08bd8ee9 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -177,7 +177,7 @@ static void menu_input_key_end_line(void) menu_input_ctl(MENU_INPUT_CTL_UNSET_KEYBOARD_LABEL_SETTING, NULL); /* Avoid triggering states on pressing return. */ - driver->flushing_input = true; + input_driver_ctl(RARCH_INPUT_CTL_SET_FLUSHING_INPUT, NULL); } static void menu_input_search_callback(void *userdata, const char *str) @@ -744,7 +744,7 @@ int menu_input_key_bind_iterate(char *s, size_t len) if (menu_input->binds.begin > menu_input->binds.last) { /* Avoid new binds triggering things right away. */ - driver->flushing_input = true; + input_driver_ctl(RARCH_INPUT_CTL_SET_FLUSHING_INPUT, NULL); /* We won't be getting any key events, so just cancel early. */ if (timed_out) @@ -764,7 +764,7 @@ int menu_input_key_bind_iterate(char *s, size_t len) input_driver_keyboard_mapping_set_block(false); /* Avoid new binds triggering things right away. */ - driver->flushing_input = true; + input_driver_ctl(RARCH_INPUT_CTL_SET_FLUSHING_INPUT, NULL); binds.begin++; diff --git a/runloop.c b/runloop.c index 4df391bdc2..33ab6f32b0 100644 --- a/runloop.c +++ b/runloop.c @@ -818,7 +818,7 @@ static void rarch_main_iterate_linefeed_overlay(driver_t *driver, #ifdef HAVE_MENU static bool rarch_main_cmd_get_state_menu_toggle_button_combo( - driver_t *driver, settings_t *settings, + settings_t *settings, retro_input_t input, retro_input_t old_input, retro_input_t trigger_input) { @@ -844,7 +844,7 @@ static bool rarch_main_cmd_get_state_menu_toggle_button_combo( break; } - driver->flushing_input = true; + input_driver_ctl(RARCH_INPUT_CTL_SET_FLUSHING_INPUT, NULL); return true; } #endif @@ -861,7 +861,7 @@ static void rarch_main_cmd_get_state(driver_t *driver, cmd->grab_mouse_pressed = BIT64_GET(trigger_input, RARCH_GRAB_MOUSE_TOGGLE); #ifdef HAVE_MENU cmd->menu_pressed = BIT64_GET(trigger_input, RARCH_MENU_TOGGLE) || - rarch_main_cmd_get_state_menu_toggle_button_combo(driver, + rarch_main_cmd_get_state_menu_toggle_button_combo( settings, input, old_input, trigger_input); #endif @@ -974,9 +974,9 @@ int rarch_main_iterate(unsigned *sleep_ms) retro_input_t old_input = last_input; last_input = input; - if (driver->flushing_input) + if (input_driver_ctl(RARCH_INPUT_CTL_IS_FLUSHING_INPUT, NULL)) { - driver->flushing_input = false; + input_driver_ctl(RARCH_INPUT_CTL_UNSET_FLUSHING_INPUT, NULL); if (input) { input = 0; @@ -986,7 +986,7 @@ int rarch_main_iterate(unsigned *sleep_ms) * pause toggle to wake it up. */ if (main_is_paused) BIT64_SET(input, RARCH_PAUSE_TOGGLE); - driver->flushing_input = true; + input_driver_ctl(RARCH_INPUT_CTL_SET_FLUSHING_INPUT, NULL); } }