diff --git a/input/input_keyboard.c b/input/input_keyboard.c index bb25091e4a..2c112ed985 100644 --- a/input/input_keyboard.c +++ b/input/input_keyboard.c @@ -199,35 +199,6 @@ const char **input_keyboard_start_line(void *userdata, return input_keyboard_line_get_buffer(g_keyboard_line); } -/** - * input_keyboard_wait_keys: - * @userdata : Userdata. - * @cb : Callback function. - * - * Waits for keys to be pressed (used for binding keys in the menu). - * Callback returns false when all polling is done. - **/ -void input_keyboard_wait_keys(void *userdata, input_keyboard_press_t cb) -{ - g_keyboard_press_cb = cb; - g_keyboard_press_data = userdata; - - /* While waiting for input, we have to block all hotkeys. */ - input_driver_keyboard_mapping_set_block(true); -} - -/** - * input_keyboard_wait_keys_cancel: - * - * Cancels function callback set by input_keyboard_wait_keys(). - **/ -void input_keyboard_wait_keys_cancel(void) -{ - g_keyboard_press_cb = NULL; - g_keyboard_press_data = NULL; - input_driver_keyboard_mapping_set_block(false); -} - /** * input_keyboard_event: * @down : Keycode was pressed down? @@ -248,14 +219,12 @@ void input_keyboard_event(bool down, unsigned code, if (down) return; - input_keyboard_wait_keys_cancel(); + input_keyboard_ctl(RARCH_INPUT_KEYBOARD_CTL_CANCEL_WAIT_KEYS, NULL); deferred_wait_keys = false; } else if (g_keyboard_press_cb) { - if (!down) - return; - if (code == RETROK_UNKNOWN) + if (!down || code == RETROK_UNKNOWN) return; if (g_keyboard_press_cb(g_keyboard_press_data, code)) return; @@ -302,6 +271,25 @@ bool input_keyboard_ctl(enum rarch_input_keyboard_ctl_state state, void *data) switch (state) { + case RARCH_INPUT_KEYBOARD_CTL_START_WAIT_KEYS: + { + input_keyboard_ctx_wait_t *keys = (input_keyboard_ctx_wait_t*)data; + + if (!keys) + return false; + + g_keyboard_press_cb = keys->cb; + g_keyboard_press_data = keys->userdata; + } + + /* While waiting for input, we have to block all hotkeys. */ + input_driver_keyboard_mapping_set_block(true); + break; + case RARCH_INPUT_KEYBOARD_CTL_CANCEL_WAIT_KEYS: + g_keyboard_press_cb = NULL; + g_keyboard_press_data = NULL; + input_driver_keyboard_mapping_set_block(false); + break; case RARCH_INPUT_KEYBOARD_CTL_DESTROY: input_driver_keyboard_linefeed_enable = false; break; diff --git a/input/input_keyboard.h b/input/input_keyboard.h index 8dd27982e3..de782b86c5 100644 --- a/input/input_keyboard.h +++ b/input/input_keyboard.h @@ -34,6 +34,16 @@ enum rarch_input_keyboard_ctl_state RARCH_INPUT_KEYBOARD_CTL_SET_LINEFEED_ENABLED, RARCH_INPUT_KEYBOARD_CTL_UNSET_LINEFEED_ENABLED, RARCH_INPUT_KEYBOARD_CTL_IS_LINEFEED_ENABLED, + + /* + * Waits for keys to be pressed (used for binding + * keys in the menu). + * Callback returns false when all polling is done. + **/ + RARCH_INPUT_KEYBOARD_CTL_START_WAIT_KEYS, + + /* Cancels keyboard wait for keys function callback. */ + RARCH_INPUT_KEYBOARD_CTL_CANCEL_WAIT_KEYS }; /* Keyboard line reader. Handles textual input in a direct fashion. */ @@ -48,6 +58,13 @@ typedef void (*input_keyboard_line_complete_t)(void *userdata, typedef bool (*input_keyboard_press_t)(void *userdata, unsigned code); +typedef struct input_keyboard_ctx_wait +{ + void *userdata; + input_keyboard_press_t cb; +} input_keyboard_ctx_wait_t; + + /** * input_keyboard_line_new: * @userdata : Userdata. @@ -123,22 +140,6 @@ void input_keyboard_event(bool down, unsigned code, uint32_t character, const char **input_keyboard_start_line(void *userdata, input_keyboard_line_complete_t cb); -/** - * input_keyboard_wait_keys: - * @userdata : Userdata. - * @cb : Callback function. - * - * Waits for keys to be pressed (used for binding keys in the menu). - * Callback returns false when all polling is done. - **/ -void input_keyboard_wait_keys(void *userdata, input_keyboard_press_t cb); - -/** - * input_keyboard_wait_keys_cancel: - * - * Cancels function callback set by input_keyboard_wait_keys(). - **/ -void input_keyboard_wait_keys_cancel(void); bool input_keyboard_ctl(enum rarch_input_keyboard_ctl_state state, void *data); diff --git a/menu/menu_input.c b/menu/menu_input.c index 17fb9969fe..7312be6f95 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -433,6 +433,7 @@ static bool menu_input_key_bind_set_mode( enum menu_input_ctl_state state, void *data) { unsigned index_offset; + input_keyboard_ctx_wait_t keys; menu_handle_t *menu = NULL; menu_input_t *menu_input = menu_input_get_ptr(); rarch_setting_t *setting = (rarch_setting_t*)data; @@ -456,8 +457,10 @@ static bool menu_input_key_bind_set_mode( menu_input->binds.timeout_end = retro_get_time_usec() + MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000; - input_keyboard_wait_keys(menu, - menu_input_key_bind_custom_bind_keyboard_cb); + keys.userdata = menu; + keys.cb = menu_input_key_bind_custom_bind_keyboard_cb; + + input_keyboard_ctl(RARCH_INPUT_KEYBOARD_CTL_START_WAIT_KEYS, &keys); return true; } @@ -600,7 +603,7 @@ static bool menu_input_key_bind_iterate(char *s, size_t len) /* We won't be getting any key events, so just cancel early. */ if (timed_out) - input_keyboard_wait_keys_cancel(); + input_keyboard_ctl(RARCH_INPUT_KEYBOARD_CTL_CANCEL_WAIT_KEYS, NULL); return true; } @@ -622,7 +625,7 @@ static bool menu_input_key_bind_iterate(char *s, size_t len) if (binds.begin > binds.last) { - input_keyboard_wait_keys_cancel(); + input_keyboard_ctl(RARCH_INPUT_KEYBOARD_CTL_CANCEL_WAIT_KEYS, NULL); return true; }