Move more functionality to input_keyboard_ctl

This commit is contained in:
twinaphex 2016-03-23 06:44:00 +01:00
parent 56c47bbe56
commit 8f7f40b86c
3 changed files with 45 additions and 53 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;
}