Turbo Fire overhaul (#17633)

This commit is contained in:
sonninnos 2025-02-28 06:15:22 +02:00 committed by GitHub
parent 7a7c208c85
commit b62cc87e84
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 779 additions and 282 deletions

View File

@ -228,6 +228,8 @@ enum event_command
CMD_EVENT_DISK_APPEND_IMAGE,
/* Stops rumbling. */
CMD_EVENT_RUMBLE_STOP,
/* Toggles turbo fire. */
CMD_EVENT_TURBO_FIRE_TOGGLE,
/* Toggles mouse grab. */
CMD_EVENT_GRAB_MOUSE_TOGGLE,
/* Toggles game focus. */
@ -490,6 +492,7 @@ static const struct cmd_map map[] = {
{ "RECORDING_TOGGLE", RARCH_RECORDING_TOGGLE },
{ "STREAMING_TOGGLE", RARCH_STREAMING_TOGGLE },
{ "TURBO_FIRE_TOGGLE", RARCH_TURBO_FIRE_TOGGLE },
{ "GRAB_MOUSE_TOGGLE", RARCH_GRAB_MOUSE_TOGGLE },
{ "GAME_FOCUS_TOGGLE", RARCH_GAME_FOCUS_TOGGLE },
{ "FULLSCREEN_TOGGLE", RARCH_FULLSCREEN_TOGGLE_KEY },

View File

@ -1567,11 +1567,13 @@
#define DEFAULT_ANALOG_SENSITIVITY 1.0f
/* Describes speed of which turbo-enabled buttons toggle. */
#define DEFAULT_TURBO_ENABLE true
#define DEFAULT_TURBO_PERIOD 6
#define DEFAULT_TURBO_DUTY_CYCLE 3
#define DEFAULT_TURBO_DUTY_CYCLE 0
#define DEFAULT_TURBO_MODE 0
#define DEFAULT_TURBO_DEFAULT_BTN RETRO_DEVICE_ID_JOYPAD_B
#define DEFAULT_ALLOW_TURBO_DPAD false
#define DEFAULT_TURBO_BIND -1
#define DEFAULT_TURBO_BUTTON RETRO_DEVICE_ID_JOYPAD_B
#define DEFAULT_TURBO_ALLOW_DPAD false
/* Enable automatic mouse grab by default
* only on Android */

View File

@ -271,7 +271,7 @@ static const struct retro_keybind retro_keybinds_1[] = {
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO, RETROK_UNKNOWN,
RARCH_TURBO_ENABLE, NO_BTN, NO_BTN, 0,
true
},
@ -528,6 +528,13 @@ static const struct retro_keybind retro_keybinds_1[] = {
RARCH_STREAMING_TOGGLE, NO_BTN, NO_BTN, 0,
true
},
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
MENU_ENUM_LABEL_VALUE_INPUT_META_TURBO_FIRE_TOGGLE, RETROK_UNKNOWN,
RARCH_TURBO_FIRE_TOGGLE, NO_BTN, NO_BTN, 0,
true
},
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
@ -906,7 +913,7 @@ static const struct retro_keybind retro_keybinds_1[] = {
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO, RETROK_UNKNOWN,
RARCH_TURBO_ENABLE, NO_BTN, NO_BTN, 0,
true
},
@ -1163,6 +1170,13 @@ static const struct retro_keybind retro_keybinds_1[] = {
RARCH_STREAMING_TOGGLE, NO_BTN, NO_BTN, 0,
true
},
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
MENU_ENUM_LABEL_VALUE_INPUT_META_TURBO_FIRE_TOGGLE, RETROK_UNKNOWN,
RARCH_TURBO_FIRE_TOGGLE, NO_BTN, NO_BTN, 0,
true
},
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
@ -1541,7 +1555,7 @@ static const struct retro_keybind retro_keybinds_1[] = {
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO, RETROK_UNKNOWN,
RARCH_TURBO_ENABLE, NO_BTN, NO_BTN, 0,
true
},
@ -1808,6 +1822,13 @@ static const struct retro_keybind retro_keybinds_1[] = {
RARCH_STREAMING_TOGGLE, NO_BTN, NO_BTN, 0,
true
},
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
MENU_ENUM_LABEL_VALUE_INPUT_META_TURBO_FIRE_TOGGLE, RETROK_UNKNOWN,
RARCH_TURBO_FIRE_TOGGLE, NO_BTN, NO_BTN, 0,
true
},
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
@ -2190,7 +2211,7 @@ static const struct retro_keybind retro_keybinds_rest[] = {
{
NULL, NULL,
AXIS_NONE, AXIS_NONE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO, RETROK_UNKNOWN,
RARCH_TURBO_ENABLE, NO_BTN, NO_BTN, 0,
true
},

View File

@ -330,7 +330,7 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = {
DECLARE_BIND(gun_dpad_left, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT),
DECLARE_BIND(gun_dpad_right, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT),
DECLARE_BIND(turbo, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE),
DECLARE_BIND(turbo, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO),
DECLARE_META_BIND(2, enable_hotkey, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY),
#ifdef HAVE_MENU
@ -382,6 +382,7 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = {
DECLARE_META_BIND(2, recording_toggle, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE),
DECLARE_META_BIND(2, streaming_toggle, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE),
DECLARE_META_BIND(2, turbo_fire_toggle, RARCH_TURBO_FIRE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_TURBO_FIRE_TOGGLE),
DECLARE_META_BIND(2, grab_mouse_toggle, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE),
DECLARE_META_BIND(2, game_focus_toggle, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE),
DECLARE_META_BIND(2, toggle_fullscreen, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY),
@ -2151,7 +2152,8 @@ static struct config_bool_setting *populate_settings_bool(
#endif
SETTING_BOOL("keyboard_gamepad_enable", &settings->bools.input_keyboard_gamepad_enable, true, DEFAULT_INPUT_KEYBOARD_GAMEPAD_ENABLE, false);
SETTING_BOOL("input_autodetect_enable", &settings->bools.input_autodetect_enable, true, DEFAULT_INPUT_AUTODETECT_ENABLE, false);
SETTING_BOOL("input_allow_turbo_dpad", &settings->bools.input_allow_turbo_dpad, true, DEFAULT_ALLOW_TURBO_DPAD, false);
SETTING_BOOL("input_turbo_enable", &settings->bools.input_turbo_enable, true, DEFAULT_TURBO_ENABLE, false);
SETTING_BOOL("input_turbo_allow_dpad", &settings->bools.input_turbo_allow_dpad, true, DEFAULT_TURBO_ALLOW_DPAD, false);
SETTING_BOOL("input_auto_mouse_grab", &settings->bools.input_auto_mouse_grab, true, DEFAULT_INPUT_AUTO_MOUSE_GRAB, false);
SETTING_BOOL("input_remap_binds_enable", &settings->bools.input_remap_binds_enable, true, true, false);
SETTING_BOOL("input_remap_sort_by_controller_enable", &settings->bools.input_remap_sort_by_controller_enable, true, false, false);
@ -2512,9 +2514,9 @@ static struct config_uint_setting *populate_settings_uint(
SETTING_UINT("input_bind_timeout", &settings->uints.input_bind_timeout, true, DEFAULT_INPUT_BIND_TIMEOUT, false);
SETTING_UINT("input_bind_hold", &settings->uints.input_bind_hold, true, DEFAULT_INPUT_BIND_HOLD, false);
SETTING_UINT("input_turbo_period", &settings->uints.input_turbo_period, true, DEFAULT_TURBO_PERIOD, false);
SETTING_UINT("input_duty_cycle", &settings->uints.input_turbo_duty_cycle, true, DEFAULT_TURBO_DUTY_CYCLE, false);
SETTING_UINT("input_turbo_mode", &settings->uints.input_turbo_mode, true, DEFAULT_TURBO_MODE, false);
SETTING_UINT("input_turbo_default_button", &settings->uints.input_turbo_default_button, true, DEFAULT_TURBO_DEFAULT_BTN, false);
SETTING_UINT("input_turbo_duty_cycle", &settings->uints.input_turbo_duty_cycle, true, DEFAULT_TURBO_DUTY_CYCLE, false);
SETTING_UINT("input_turbo_mode", &settings->uints.input_turbo_mode, true, DEFAULT_TURBO_MODE, false);
SETTING_UINT("input_turbo_button", &settings->uints.input_turbo_button, true, DEFAULT_TURBO_BUTTON, false);
SETTING_UINT("input_max_users", &settings->uints.input_max_users, true, DEFAULT_INPUT_MAX_USERS, false);
SETTING_UINT("input_menu_toggle_gamepad_combo", &settings->uints.input_menu_toggle_gamepad_combo, true, DEFAULT_MENU_TOGGLE_GAMEPAD_COMBO, false);
SETTING_UINT("input_poll_type_behavior", &settings->uints.input_poll_type_behavior, true, DEFAULT_INPUT_POLL_TYPE_BEHAVIOR, false);
@ -2701,6 +2703,7 @@ static struct config_int_setting *populate_settings_int(
#ifdef HAVE_OVERLAY
SETTING_INT("input_overlay_lightgun_port", &settings->ints.input_overlay_lightgun_port, true, DEFAULT_INPUT_OVERLAY_LIGHTGUN_PORT, false);
#endif
SETTING_INT("input_turbo_bind", &settings->ints.input_turbo_bind, true, DEFAULT_TURBO_BIND, false);
*size = count;
@ -5947,11 +5950,15 @@ bool input_remapping_load_file(void *data, const char *path)
config_file_t *conf = (config_file_t*)data;
settings_t *settings = config_st;
runloop_state_t *runloop_st = runloop_state_get_ptr();
char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][8] = {
"b", "y", "select", "start",
"up", "down", "left", "right",
"a", "x", "l", "r", "l2", "r2",
"l3", "r3", "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" };
char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][8] =
{
"b", "y", "select", "start",
"up", "down", "left", "right",
"a", "x", "l", "r",
"l2", "r2", "l3", "r3",
"l_x+", "l_x-", "l_y+", "l_y-",
"r_x+", "r_x-", "r_y+", "r_y-"
};
if ( !conf
|| string_is_empty(path))
@ -6042,17 +6049,39 @@ bool input_remapping_load_file(void *data, const char *path)
}
}
_len = strlcpy(s1, prefix, sizeof(s1));
strlcpy(s1 + _len, "_analog_dpad_mode", sizeof(s1) - _len);
CONFIG_GET_INT_BASE(conf, settings, uints.input_analog_dpad_mode[i], s1);
_len = strlcpy(s1, "input_libretro_device_p", sizeof(s1));
strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len);
CONFIG_GET_INT_BASE(conf, settings, uints.input_libretro_device[i], s1);
_len = strlcpy(s1, prefix, sizeof(s1));
strlcpy(s1 + _len, "_analog_dpad_mode", sizeof(s1) - _len);
CONFIG_GET_INT_BASE(conf, settings, uints.input_analog_dpad_mode[i], s1);
_len = strlcpy(s1, "input_remap_port_p", sizeof(s1));
strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len);
CONFIG_GET_INT_BASE(conf, settings, uints.input_remap_ports[i], s1);
/* Turbo fire settings */
_len = strlcpy(s1, "input_turbo_enable", sizeof(s1));
CONFIG_GET_BOOL_BASE(conf, settings, bools.input_turbo_enable, s1);
_len = strlcpy(s1, "input_turbo_allow_dpad", sizeof(s1));
CONFIG_GET_BOOL_BASE(conf, settings, bools.input_turbo_allow_dpad, s1);
_len = strlcpy(s1, "input_turbo_mode", sizeof(s1));
CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_mode, s1);
_len = strlcpy(s1, "input_turbo_bind", sizeof(s1));
CONFIG_GET_INT_BASE(conf, settings, ints.input_turbo_bind, s1);
_len = strlcpy(s1, "input_turbo_button", sizeof(s1));
CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_button, s1);
_len = strlcpy(s1, "input_turbo_period", sizeof(s1));
CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_period, s1);
_len = strlcpy(s1, "input_turbo_duty_cycle", sizeof(s1));
CONFIG_GET_INT_BASE(conf, settings, uints.input_turbo_duty_cycle, s1);
}
input_remapping_update_port_map();
@ -6167,7 +6196,12 @@ bool input_remapping_save_file(const char *path)
else
{
if (remap_id == RARCH_UNMAPPED)
config_set_int(conf, _ident, -1);
{
if (string_is_empty(runloop_st->system.input_desc_btn[i][j]))
config_unset(conf, _ident);
else
config_set_int(conf, _ident, -1);
}
else
config_set_int(conf, _ident,
settings->uints.input_remap_ids[i][j]);
@ -6200,7 +6234,12 @@ bool input_remapping_save_file(const char *path)
else
{
if (remap_id == RARCH_UNMAPPED)
config_set_int(conf, _ident, -1);
{
if (string_is_empty(runloop_st->system.input_desc_btn[i][j]))
config_unset(conf, _ident);
else
config_set_int(conf, _ident, -1);
}
else
config_set_int(conf, _ident,
settings->uints.input_remap_ids[i][j]);
@ -6228,6 +6267,28 @@ bool input_remapping_save_file(const char *path)
_len = strlcpy(s1, "input_remap_port_p", sizeof(s1));
strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len);
config_set_int(conf, s1, settings->uints.input_remap_ports[i]);
/* Turbo fire settings */
_len = strlcpy(s1, "input_turbo_enable", sizeof(s1));
config_set_string(conf, s1, settings->bools.input_turbo_enable ? "true" : "false");
_len = strlcpy(s1, "input_turbo_allow_dpad", sizeof(s1));
config_set_string(conf, s1, settings->bools.input_turbo_allow_dpad ? "true" : "false");
_len = strlcpy(s1, "input_turbo_mode", sizeof(s1));
config_set_int(conf, s1, settings->uints.input_turbo_mode);
_len = strlcpy(s1, "input_turbo_bind", sizeof(s1));
config_set_int(conf, s1, settings->ints.input_turbo_bind);
_len = strlcpy(s1, "input_turbo_button", sizeof(s1));
config_set_int(conf, s1, settings->uints.input_turbo_button);
_len = strlcpy(s1, "input_turbo_period", sizeof(s1));
config_set_int(conf, s1, settings->uints.input_turbo_period);
_len = strlcpy(s1, "input_turbo_duty_cycle", sizeof(s1));
config_set_int(conf, s1, settings->uints.input_turbo_duty_cycle);
}
ret = config_file_write(conf, path, true);

View File

@ -144,6 +144,7 @@ typedef struct settings
#ifdef HAVE_OVERLAY
int input_overlay_lightgun_port;
#endif
int input_turbo_bind;
} ints;
struct
@ -194,7 +195,7 @@ typedef struct settings
unsigned input_turbo_period;
unsigned input_turbo_duty_cycle;
unsigned input_turbo_mode;
unsigned input_turbo_default_button;
unsigned input_turbo_button;
unsigned input_bind_timeout;
unsigned input_bind_hold;
@ -710,7 +711,8 @@ typedef struct settings
bool input_small_keyboard_enable;
bool input_keyboard_gamepad_enable;
bool input_auto_mouse_grab;
bool input_allow_turbo_dpad;
bool input_turbo_enable;
bool input_turbo_allow_dpad;
bool input_hotkey_device_merge;
#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT)
bool input_nowinkey_enable;

View File

@ -166,6 +166,7 @@ enum
RARCH_RECORDING_TOGGLE,
RARCH_STREAMING_TOGGLE,
RARCH_TURBO_FIRE_TOGGLE,
RARCH_GRAB_MOUSE_TOGGLE,
RARCH_GAME_FOCUS_TOGGLE,
RARCH_FULLSCREEN_TOGGLE_KEY,
@ -230,21 +231,6 @@ enum input_turbo_mode
INPUT_TURBO_MODE_LAST
};
enum input_turbo_default_button
{
INPUT_TURBO_DEFAULT_BUTTON_B = 0,
INPUT_TURBO_DEFAULT_BUTTON_Y,
INPUT_TURBO_DEFAULT_BUTTON_A,
INPUT_TURBO_DEFAULT_BUTTON_X,
INPUT_TURBO_DEFAULT_BUTTON_L,
INPUT_TURBO_DEFAULT_BUTTON_R,
INPUT_TURBO_DEFAULT_BUTTON_L2,
INPUT_TURBO_DEFAULT_BUTTON_R2,
INPUT_TURBO_DEFAULT_BUTTON_L3,
INPUT_TURBO_DEFAULT_BUTTON_R3,
INPUT_TURBO_DEFAULT_BUTTON_LAST
};
enum input_device_reservation_type
{
INPUT_DEVICE_RESERVATION_NONE = 0,

View File

@ -1507,14 +1507,25 @@ static int16_t input_state_device(
/* Don't allow turbo for D-pad unless explicitly allowed. */
if ( (id < RETRO_DEVICE_ID_JOYPAD_UP)
|| ( ((settings->bools.input_allow_turbo_dpad)
|| ( ((settings->bools.input_turbo_allow_dpad || settings->ints.input_turbo_bind != -1)
|| (id > RETRO_DEVICE_ID_JOYPAD_RIGHT))
&& (id <= RETRO_DEVICE_ID_JOYPAD_R3)))
{
/*
* Apply turbo button if activated.
*/
unsigned turbo_mode = settings->uints.input_turbo_mode;
uint8_t turbo_period = settings->uints.input_turbo_period;
uint8_t turbo_duty_cycle = settings->uints.input_turbo_duty_cycle;
uint8_t turbo_mode = settings->uints.input_turbo_mode;
int8_t turbo_bind = settings->ints.input_turbo_bind;
if (turbo_duty_cycle == 0)
turbo_duty_cycle = turbo_period / 2;
/* Clear underlying button to prevent duplicates. */
if ( input_st->turbo_btns.frame_enable[port]
&& (int)id == settings->ints.input_turbo_bind)
res = 0;
if (turbo_mode > INPUT_TURBO_MODE_CLASSIC_TOGGLE)
{
@ -1529,27 +1540,13 @@ static int16_t input_state_device(
input_st->turbo_btns.turbo_pressed[port] &= ~(1 << 31);
else if (input_st->turbo_btns.turbo_pressed[port] >= 0)
{
unsigned turbo_button = settings->uints.input_turbo_button;
unsigned remap_button = settings->uints.input_remap_ids[port][turbo_button];
input_st->turbo_btns.turbo_pressed[port] |= (1 << 31);
/* Toggle turbo for selected buttons. */
if (input_st->turbo_btns.enable[port]
!= (1 << settings->uints.input_turbo_default_button))
{
static const int button_map[]={
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_Y,
RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_X,
RETRO_DEVICE_ID_JOYPAD_L,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L2,
RETRO_DEVICE_ID_JOYPAD_R2,
RETRO_DEVICE_ID_JOYPAD_L3,
RETRO_DEVICE_ID_JOYPAD_R3};
input_st->turbo_btns.enable[port] = 1 << button_map[
MIN(
ARRAY_SIZE(button_map) - 1,
settings->uints.input_turbo_default_button)];
}
if (input_st->turbo_btns.enable[port] != (1 << remap_button))
input_st->turbo_btns.enable[port] = (1 << remap_button);
input_st->turbo_btns.mode1_enable[port] ^= 1;
}
@ -1571,20 +1568,15 @@ static int16_t input_state_device(
}
}
/* Hold mode stops turbo on release */
else if (
turbo_mode == INPUT_TURBO_MODE_SINGLEBUTTON_HOLD
&& input_st->turbo_btns.enable[port]
&& input_st->turbo_btns.mode1_enable[port])
else if ((turbo_mode == INPUT_TURBO_MODE_SINGLEBUTTON_HOLD)
&& (input_st->turbo_btns.enable[port])
&& (input_st->turbo_btns.mode1_enable[port]))
input_st->turbo_btns.mode1_enable[port] = 0;
if (!res && input_st->turbo_btns.mode1_enable[port] &&
input_st->turbo_btns.enable[port] & (1 << id))
{
/* If turbo button is enabled for this key ID */
res = (( input_st->turbo_btns.count
% settings->uints.input_turbo_period)
< settings->uints.input_turbo_duty_cycle);
}
if ( (!res)
&& (input_st->turbo_btns.mode1_enable[port])
&& (input_st->turbo_btns.enable[port] & (1 << id)))
res = ((input_st->turbo_btns.count % turbo_period) < turbo_duty_cycle);
}
else if (turbo_mode == INPUT_TURBO_MODE_CLASSIC)
{
@ -1600,9 +1592,7 @@ static int16_t input_state_device(
if (input_st->turbo_btns.enable[port] & (1 << id))
/* if turbo button is enabled for this key ID */
res = ((input_st->turbo_btns.count
% settings->uints.input_turbo_period)
< settings->uints.input_turbo_duty_cycle);
res = ((input_st->turbo_btns.count % turbo_period) < turbo_duty_cycle);
}
else
input_st->turbo_btns.enable[port] &= ~(1 << id);
@ -1625,17 +1615,13 @@ static int16_t input_state_device(
}
}
else
{
input_st->turbo_btns.turbo_pressed[port] &= ~(1 << id);
}
if (res)
{
if (input_st->turbo_btns.enable[port] & (1 << id))
/* If turbo button is enabled for this key ID */
res = (( input_st->turbo_btns.count
% settings->uints.input_turbo_period)
< settings->uints.input_turbo_duty_cycle);
res = ((input_st->turbo_btns.count % turbo_period) < turbo_duty_cycle);
}
}
}
@ -6407,17 +6393,24 @@ void input_driver_poll(void)
* when mapping analog stick to dpad input. */
for (i = 0; i < max_users; i++)
{
uint16_t button_id = RARCH_TURBO_ENABLE;
if (settings->ints.input_turbo_bind != -1)
button_id = settings->ints.input_turbo_bind;
joypad_info[i].axis_threshold = input_axis_threshold;
joypad_info[i].joy_idx = settings->uints.input_joypad_index[i];
joypad_info[i].auto_binds = input_autoconf_binds[joypad_info[i].joy_idx];
input_st->turbo_btns.frame_enable[i] = (*input_st->libretro_input_binds[i])[RARCH_TURBO_ENABLE].valid ?
input_st->turbo_btns.frame_enable[i] =
(*input_st->libretro_input_binds[i])[button_id].valid
&& settings->bools.input_turbo_enable ?
input_state_wrap(input_st->current_driver, input_st->current_data,
joypad, sec_joypad, &joypad_info[i],
(*input_st->libretro_input_binds),
(input_st->flags & INP_FLAG_KB_MAPPING_BLOCKED) ? true : false,
(unsigned)i,
RETRO_DEVICE_JOYPAD, 0, RARCH_TURBO_ENABLE) : 0;
RETRO_DEVICE_JOYPAD, 0, button_id) : 0;
}
#ifdef HAVE_OVERLAY
@ -6960,12 +6953,17 @@ void input_remapping_cache_global_config(void)
RARCH_OVERRIDE_SETTING_LIBRETRO_DEVICE, &i))
device = settings->uints.input_libretro_device[i];
input_st->old_analog_dpad_mode[i] = settings->uints.input_analog_dpad_mode[i];
input_st->old_libretro_device[i] = device;
input_st->remapping_cache.analog_dpad_mode[i] = settings->uints.input_analog_dpad_mode[i];
input_st->remapping_cache.libretro_device[i] = device;
}
input_st->flags |= INP_FLAG_OLD_ANALOG_DPAD_MODE_SET
| INP_FLAG_OLD_LIBRETRO_DEVICE_SET;
input_st->remapping_cache.turbo_enable = settings->bools.input_turbo_enable;
input_st->remapping_cache.turbo_allow_dpad = settings->bools.input_turbo_allow_dpad;
input_st->remapping_cache.turbo_bind = settings->ints.input_turbo_bind;
input_st->remapping_cache.turbo_mode = settings->uints.input_turbo_mode;
input_st->remapping_cache.turbo_button = settings->uints.input_turbo_button;
input_st->remapping_cache.turbo_period = settings->uints.input_turbo_period;
input_st->remapping_cache.turbo_duty_cycle = settings->uints.input_turbo_duty_cycle;
}
void input_remapping_restore_global_config(bool clear_cache, bool restore_analog_dpad_mode)
@ -6979,27 +6977,47 @@ void input_remapping_restore_global_config(bool clear_cache, bool restore_analog
for (i = 0; i < MAX_USERS; i++)
{
if ( (input_st->flags & INP_FLAG_OLD_ANALOG_DPAD_MODE_SET)
&& restore_analog_dpad_mode
&& (settings->uints.input_analog_dpad_mode[i] !=
input_st->old_analog_dpad_mode[i]))
if (restore_analog_dpad_mode)
configuration_set_uint(settings,
settings->uints.input_analog_dpad_mode[i],
input_st->old_analog_dpad_mode[i]);
input_st->remapping_cache.analog_dpad_mode[i]);
if ( (input_st->flags & INP_FLAG_OLD_LIBRETRO_DEVICE_SET)
&& (settings->uints.input_libretro_device[i] !=
input_st->old_libretro_device[i]))
configuration_set_uint(settings,
settings->uints.input_libretro_device[i],
input_st->old_libretro_device[i]);
configuration_set_uint(settings,
settings->uints.input_libretro_device[i],
input_st->remapping_cache.libretro_device[i]);
}
configuration_set_bool(settings,
settings->bools.input_turbo_enable,
input_st->remapping_cache.turbo_enable);
configuration_set_bool(settings,
settings->bools.input_turbo_allow_dpad,
input_st->remapping_cache.turbo_allow_dpad);
configuration_set_int(settings,
settings->ints.input_turbo_bind,
input_st->remapping_cache.turbo_bind);
configuration_set_uint(settings,
settings->uints.input_turbo_mode,
input_st->remapping_cache.turbo_mode);
configuration_set_uint(settings,
settings->uints.input_turbo_button,
input_st->remapping_cache.turbo_button);
configuration_set_uint(settings,
settings->uints.input_turbo_period,
input_st->remapping_cache.turbo_period);
configuration_set_uint(settings,
settings->uints.input_turbo_duty_cycle,
input_st->remapping_cache.turbo_duty_cycle);
end:
if (clear_cache)
input_st->flags &= ~(INP_FLAG_OLD_ANALOG_DPAD_MODE_SET
| INP_FLAG_OLD_LIBRETRO_DEVICE_SET
| INP_FLAG_REMAPPING_CACHE_ACTIVE);
input_st->flags &= ~INP_FLAG_REMAPPING_CACHE_ACTIVE;
}
void input_remapping_update_port_map(void)

View File

@ -151,11 +151,9 @@ enum input_driver_state_flags
INP_FLAG_BLOCK_LIBRETRO_INPUT = (1 << 4),
INP_FLAG_BLOCK_POINTER_INPUT = (1 << 5),
INP_FLAG_GRAB_MOUSE_STATE = (1 << 6),
INP_FLAG_OLD_ANALOG_DPAD_MODE_SET = (1 << 7),
INP_FLAG_OLD_LIBRETRO_DEVICE_SET = (1 << 8),
INP_FLAG_REMAPPING_CACHE_ACTIVE = (1 << 9),
INP_FLAG_DEFERRED_WAIT_KEYS = (1 << 10),
INP_FLAG_WAIT_INPUT_RELEASE = (1 << 11)
INP_FLAG_REMAPPING_CACHE_ACTIVE = (1 << 7),
INP_FLAG_DEFERRED_WAIT_KEYS = (1 << 8),
INP_FLAG_WAIT_INPUT_RELEASE = (1 << 9)
};
#ifdef HAVE_BSV_MOVIE
@ -554,10 +552,9 @@ typedef struct
turbo_buttons_t turbo_btns; /* int32_t alignment */
input_mapper_t mapper; /* uint32_t alignment */
input_remap_cache_t remapping_cache;
input_device_info_t input_device_info[MAX_INPUT_DEVICES]; /* unsigned alignment */
input_mouse_info_t input_mouse_info[MAX_INPUT_DEVICES];
unsigned old_analog_dpad_mode[MAX_USERS];
unsigned old_libretro_device[MAX_USERS];
unsigned osk_last_codepoint;
unsigned osk_last_codepoint_len;
unsigned input_hotkey_block_counter;

View File

@ -112,6 +112,19 @@ typedef struct input_mapper
input_bits_t buttons[MAX_USERS];
} input_mapper_t;
typedef struct
{
unsigned analog_dpad_mode[MAX_USERS];
unsigned libretro_device[MAX_USERS];
unsigned turbo_mode;
unsigned turbo_button;
unsigned turbo_period;
unsigned turbo_duty_cycle;
int turbo_bind;
bool turbo_enable;
bool turbo_allow_dpad;
} input_remap_cache_t;
typedef struct input_game_focus_state
{
bool enabled;

View File

@ -1009,6 +1009,10 @@ MSG_HASH(
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX,
"deferred_dropdown_box_list_disk_index"
)
MSG_HASH(
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND,
"deferred_dropdown_box_list_input_retropad_bind"
)
MSG_HASH(
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE,
"deferred_dropdown_box_list_input_device_type"
@ -1944,10 +1948,6 @@ MSG_HASH(
MENU_ENUM_LABEL_INPUT_DRIVER,
"input_driver"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_DUTY_CYCLE,
"input_duty_cycle"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_RETROPAD_BINDS,
"input_retropad_binds"
@ -2188,10 +2188,6 @@ MSG_HASH(
MENU_ENUM_LABEL_INPUT_TOUCH_ENABLE,
"input_touch_enable"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_TURBO_PERIOD,
"input_turbo_period"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_USER_10_BINDS,
"10_input_binds_list"
@ -6597,8 +6593,20 @@ MSG_HASH(
"input_turbo_mode"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_TURBO_DEFAULT_BUTTON,
"input_turbo_default_button"
MENU_ENUM_LABEL_INPUT_TURBO_BIND,
"input_turbo_bind"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_TURBO_BUTTON,
"input_turbo_button"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_TURBO_PERIOD,
"input_turbo_period"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_TURBO_DUTY_CYCLE,
"input_turbo_duty_cycle"
)
MSG_HASH(
MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD,

View File

@ -500,9 +500,6 @@ int msg_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len)
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE), len);
}
break;
case MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD), len);
break;
default:
if (string_is_empty(s))
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE), len);

View File

@ -3553,22 +3553,35 @@ MSG_HASH(
MSG_INPUT_BIND_HOLD,
"Hold"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE,
"Turbo Fire"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_TURBO_ENABLE,
"Disabled stops all turbo fire operations."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD,
"Turbo Period"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD,
"The period (in frames) when turbo-enabled buttons are pressed."
"The period in frames when turbo-enabled buttons are pressed."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_DUTY_CYCLE,
"Turbo Duty Cycle"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE,
MENU_ENUM_SUBLABEL_INPUT_TURBO_DUTY_CYCLE,
"The number of frames from the Turbo Period the buttons are held down for. If this number is equal to or greater than the Turbo Period, the buttons will never release."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_TURBO_DUTY_CYCLE_HALF,
"Half Period"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_MODE,
"Turbo Mode"
@ -3595,34 +3608,42 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_HELP_TURBO_MODE_CLASSIC,
"Classic mode, two-button operation. Hold a button and tap the Turbo button to activate the press-release sequence.\nTurbo button can be assigned in Settings/Input/Port 1 Controls."
"Classic mode, two-button operation. Hold a button and tap the Turbo button to activate the press-release sequence.\nTurbo bind can be assigned in Settings/Input/Port X Controls."
)
MSG_HASH(
MENU_ENUM_LABEL_HELP_TURBO_MODE_CLASSIC_TOGGLE,
"Classic toggle mode, two-button operation. Hold a button and tap the Turbo button to enable turbo for that button. To disable turbo: hold the button and press the Turbo button again.\nTurbo button can be assigned in Settings/Input/Port 1 Controls."
"Classic toggle mode, two-button operation. Hold a button and tap the Turbo button to enable turbo for that button. To disable turbo: hold the button and press the Turbo button again.\nTurbo bind can be assigned in Settings/Input/Port X Controls."
)
MSG_HASH(
MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON,
"Toggle mode. Press the Turbo button once to activate the press-release sequence for the selected default button, press it once again to switch it off.\nTurbo button can be assigned in Settings/Input/Port 1 Controls."
"Toggle mode. Press the Turbo button once to activate the press-release sequence for the selected default button, press it once again to switch it off.\nTurbo bind can be assigned in Settings/Input/Port X Controls."
)
MSG_HASH(
MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON_HOLD,
"Hold mode. The press-release sequence for the selected default button is active as long as Turbo button is held down.\nTurbo button can be assigned in Settings/Input/Port 1 Controls.\nTo emulate the autofire function of the home computer era, set Turbo and default buttons to be the same as the joystick fire button."
"Hold mode. The press-release sequence for the selected default button is active as long as Turbo button is held down.\nTurbo bind can be assigned in Settings/Input/Port X Controls.\nTo emulate the autofire function of the home computer era, set Bind and Button to the same joystick fire button."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_DEFAULT_BUTTON,
"Turbo Default Button"
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BIND,
"Turbo Bind"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_TURBO_DEFAULT_BUTTON,
"Default active button for Turbo Mode 'Single Button'."
MENU_ENUM_SUBLABEL_INPUT_TURBO_BIND,
"Turbo activating RetroPad bind. Empty uses the port-specific bind."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_ALLOW_TURBO_DPAD,
"Allow Turbo D-Pad Directions"
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BUTTON,
"Turbo Button"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_ALLOW_TURBO_DPAD,
MENU_ENUM_SUBLABEL_INPUT_TURBO_BUTTON,
"Target turbo button in 'Single Button' mode."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ALLOW_DPAD,
"Turbo Allow D-Pad Directions"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_TURBO_ALLOW_DPAD,
"If enabled, digital directional inputs (also known as d-pad or 'hatswitch') can be turbo."
)
MSG_HASH(
@ -3631,7 +3652,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_TURBO_FIRE_SETTINGS,
"Change turbo fire settings.\nNote: the turbo function requires mapping a turbo button to your input device in the corresponding 'Port X Controls' menu."
"Change turbo fire settings."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_HAPTIC_FEEDBACK_SETTINGS,
@ -4116,6 +4137,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_META_REPLAY_SLOT_MINUS,
"Decrements the currently selected replay slot index."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_META_TURBO_FIRE_TOGGLE,
"Turbo Fire (Toggle)"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_META_TURBO_FIRE_TOGGLE,
"Switches turbo fire on/off."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE,
"Grab Mouse (Toggle)"
@ -4504,7 +4533,7 @@ MSG_HASH(
"Gun D-Pad Right"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO,
"Turbo"
)

View File

@ -681,6 +681,7 @@ GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_playlist_sort_mode
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_manual_content_scan_system_name, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME)
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_manual_content_scan_core_name, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME)
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_disk_index, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX)
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_input_retropad_bind, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_RETROPAD_BIND)
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_input_device_type, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_TYPE)
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_input_description, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION)
GENERIC_DEFERRED_PUSH_GENERAL(deferred_push_dropdown_box_list_input_description_kbd, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION_KBD)
@ -729,6 +730,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_LEFT_THUMBNAIL_MODE, deferred_push_dropdown_box_list_playlist_left_thumbnail_mode},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_PLAYLIST_SORT_MODE, deferred_push_dropdown_box_list_playlist_sort_mode},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX, deferred_push_dropdown_box_list_disk_index},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND, deferred_push_dropdown_box_list_input_retropad_bind},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE, deferred_push_dropdown_box_list_input_device_type},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION, deferred_push_dropdown_box_list_input_description},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION_KBD, deferred_push_dropdown_box_list_input_description_kbd},

View File

@ -138,31 +138,40 @@ static int action_left_cheat(unsigned type, const char *label,
static int action_left_input_desc(unsigned type, const char *label,
bool wraparound)
{
unsigned btn_idx;
unsigned user_idx;
unsigned btn_idx;
unsigned remap_idx;
unsigned bind_idx;
unsigned mapped_port;
settings_t *settings = config_get_ptr();
rarch_system_info_t *sys_info = &runloop_state_get_ptr()->system;
if (!settings || !sys_info)
return 0;
user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8);
btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx;
mapped_port = settings->uints.input_remap_ports[user_idx];
if (settings->uints.input_remap_ids[user_idx][btn_idx] == RARCH_UNMAPPED)
settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_CUSTOM_BIND_LIST_END - 1;
remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx];
remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx];
for (bind_idx = 0; bind_idx < RARCH_ANALOG_BIND_LIST_END; bind_idx++)
{
if (input_config_bind_order[bind_idx] == remap_idx)
break;
}
if (bind_idx > 0)
/* Search for the last input desc bind */
if (remap_idx == RARCH_UNMAPPED)
{
uint8_t i;
for (i = 0; i < RARCH_ANALOG_BIND_LIST_END; i++)
{
if (string_is_empty(sys_info->input_desc_btn[mapped_port][i]))
break;
}
settings->uints.input_remap_ids[user_idx][btn_idx] = input_config_bind_order[i - 1];
}
else if (bind_idx > 0)
{
if (bind_idx > RARCH_ANALOG_BIND_LIST_END)
settings->uints.input_remap_ids[user_idx][btn_idx]--;
@ -175,19 +184,6 @@ static int action_left_input_desc(unsigned type, const char *label,
}
else if (bind_idx == 0)
settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_UNMAPPED;
else
settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_CUSTOM_BIND_LIST_END - 1;
remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx];
/* skip the not used buttons (unless they are at the end by calling the right desc function recursively
also skip all the axes until analog remapping is implemented */
if (remap_idx != RARCH_UNMAPPED)
{
if ((string_is_empty(sys_info->input_desc_btn[mapped_port][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) /*||
(remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)*/)
action_left_input_desc(type, label, wraparound);
}
return 0;
}

View File

@ -287,6 +287,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl)
return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME;
case ACTION_OK_DL_DROPDOWN_BOX_LIST_DISK_INDEX:
return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX;
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND:
return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND;
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE:
return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE;
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION:
@ -894,6 +896,15 @@ int generic_action_ok_displaylist_push(
info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX;
dl_type = DISPLAYLIST_GENERIC;
break;
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND:
info.type = type;
info.directory_ptr = idx;
info_path = path;
info_label = msg_hash_to_str(
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND);
info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND;
dl_type = DISPLAYLIST_GENERIC;
break;
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE:
info.type = type;
info.directory_ptr = idx;
@ -7477,6 +7488,31 @@ static int action_ok_push_dropdown_item_microphone_device(const char *path,
}
#endif
static int action_ok_push_dropdown_item_input_retropad_bind(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
rarch_setting_t *setting;
enum msg_hash_enums enum_idx;
retro_ctx_controller_info_t pad;
unsigned port = 0;
unsigned device = 0;
const char *menu_path = NULL;
menu_entries_get_last_stack(&menu_path, NULL, NULL, NULL, NULL);
enum_idx = (enum msg_hash_enums)atoi(menu_path);
setting = menu_setting_find_enum(enum_idx);
if (!setting)
return -1;
if ((int)entry_idx < 0)
*setting->value.target.integer = -1;
else
*setting->value.target.integer = input_config_bind_order[entry_idx];
return action_cancel_pop_default(NULL, NULL, 0, 0);
}
static int action_ok_push_dropdown_item_input_device_type(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
@ -9485,6 +9521,9 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs,
case MENU_SETTING_DROPDOWN_ITEM_DISK_INDEX:
BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_disk_index);
break;
case MENU_SETTING_DROPDOWN_ITEM_INPUT_RETROPAD_BIND:
BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_input_retropad_bind);
break;
case MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_TYPE:
BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_input_device_type);
break;

View File

@ -171,7 +171,6 @@ static int action_right_input_desc_kbd(unsigned type, const char *label,
return 0;
}
/* TODO/FIXME: incomplete, lacks error checking */
static int action_right_input_desc(unsigned type, const char *label,
bool wraparound)
{
@ -190,38 +189,26 @@ static int action_right_input_desc(unsigned type, const char *label,
break;
}
if (bind_idx < RARCH_CUSTOM_BIND_LIST_END - 1)
{
if (bind_idx > RARCH_ANALOG_BIND_LIST_END)
settings->uints.input_remap_ids[user_idx][btn_idx]++;
else
{
if (bind_idx < RARCH_ANALOG_BIND_LIST_END - 1)
{
bind_idx++;
bind_idx = input_config_bind_order[bind_idx];
}
else if (bind_idx == RARCH_ANALOG_BIND_LIST_END - 1)
bind_idx = RARCH_UNMAPPED;
else
bind_idx = input_config_bind_order[0];
settings->uints.input_remap_ids[user_idx][btn_idx] = bind_idx;
}
}
else if (bind_idx == RARCH_CUSTOM_BIND_LIST_END - 1)
settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_UNMAPPED;
if (bind_idx > RARCH_ANALOG_BIND_LIST_END)
settings->uints.input_remap_ids[user_idx][btn_idx]++;
else
settings->uints.input_remap_ids[user_idx][btn_idx] = input_config_bind_order[0];
remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx];
/* skip the not used buttons (unless they are at the end by calling the right desc function recursively
also skip all the axes until analog remapping is implemented */
if (remap_idx != RARCH_UNMAPPED)
{
if ((string_is_empty(sys_info->input_desc_btn[mapped_port][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END))
action_right_input_desc(type, label, wraparound);
if (bind_idx < RARCH_ANALOG_BIND_LIST_END - 1)
{
bind_idx++;
bind_idx = input_config_bind_order[bind_idx];
}
else if (bind_idx == RARCH_ANALOG_BIND_LIST_END - 1)
bind_idx = RARCH_UNMAPPED;
else
bind_idx = input_config_bind_order[0];
settings->uints.input_remap_ids[user_idx][btn_idx] = bind_idx;
}
/* Empty is always last, so right jumps to first */
if (string_is_empty(sys_info->input_desc_btn[mapped_port][remap_idx]))
settings->uints.input_remap_ids[user_idx][btn_idx] = input_config_bind_order[0];
}
return 0;

View File

@ -462,6 +462,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_screenshot, ME
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_recording_toggle, MENU_ENUM_SUBLABEL_INPUT_META_RECORDING_TOGGLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_streaming_toggle, MENU_ENUM_SUBLABEL_INPUT_META_STREAMING_TOGGLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_turbo_fire_toggle, MENU_ENUM_SUBLABEL_INPUT_META_TURBO_FIRE_TOGGLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_grab_mouse_toggle, MENU_ENUM_SUBLABEL_INPUT_META_GRAB_MOUSE_TOGGLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_game_focus_toggle, MENU_ENUM_SUBLABEL_INPUT_META_GAME_FOCUS_TOGGLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_meta_fullscreen_toggle_key, MENU_ENUM_SUBLABEL_INPUT_META_FULLSCREEN_TOGGLE_KEY)
@ -566,11 +567,13 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_touch_vmouse_gesture, MENU_
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_button_axis_threshold, MENU_ENUM_SUBLABEL_INPUT_BUTTON_AXIS_THRESHOLD)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_analog_deadzone, MENU_ENUM_SUBLABEL_INPUT_ANALOG_DEADZONE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_analog_sensitivity, MENU_ENUM_SUBLABEL_INPUT_ANALOG_SENSITIVITY)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_enable, MENU_ENUM_SUBLABEL_INPUT_TURBO_ENABLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_period, MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_duty_cycle, MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_duty_cycle, MENU_ENUM_SUBLABEL_INPUT_TURBO_DUTY_CYCLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_mode, MENU_ENUM_SUBLABEL_INPUT_TURBO_MODE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_default_button, MENU_ENUM_SUBLABEL_INPUT_TURBO_DEFAULT_BUTTON)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_allow_turbo_dpad, MENU_ENUM_SUBLABEL_INPUT_ALLOW_TURBO_DPAD)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_bind, MENU_ENUM_SUBLABEL_INPUT_TURBO_BIND)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_button, MENU_ENUM_SUBLABEL_INPUT_TURBO_BUTTON)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_allow_dpad, MENU_ENUM_SUBLABEL_INPUT_TURBO_ALLOW_DPAD)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_rumble_gain, MENU_ENUM_SUBLABEL_INPUT_RUMBLE_GAIN)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_vertical_sync, MENU_ENUM_SUBLABEL_VIDEO_VSYNC)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_adaptive_vsync, MENU_ENUM_SUBLABEL_VIDEO_ADAPTIVE_VSYNC)
@ -2405,6 +2408,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_meta_streaming_toggle);
return 0;
case RARCH_TURBO_FIRE_TOGGLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_meta_turbo_fire_toggle);
return 0;
case RARCH_GRAB_MOUSE_TOGGLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_meta_grab_mouse_toggle);
return 0;
@ -4584,8 +4590,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_VIDEO_ADAPTIVE_VSYNC:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_adaptive_vsync);
break;
case MENU_ENUM_LABEL_INPUT_DUTY_CYCLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_duty_cycle);
case MENU_ENUM_LABEL_INPUT_TURBO_ENABLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_enable);
break;
case MENU_ENUM_LABEL_INPUT_TURBO_DUTY_CYCLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_duty_cycle);
break;
case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_period);
@ -4593,11 +4602,14 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_INPUT_TURBO_MODE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_mode);
break;
case MENU_ENUM_LABEL_INPUT_TURBO_DEFAULT_BUTTON:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_default_button);
case MENU_ENUM_LABEL_INPUT_TURBO_BIND:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_bind);
break;
case MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_allow_turbo_dpad);
case MENU_ENUM_LABEL_INPUT_TURBO_BUTTON:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_button);
break;
case MENU_ENUM_LABEL_INPUT_TURBO_ALLOW_DPAD:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_allow_dpad);
break;
case MENU_ENUM_LABEL_INPUT_RUMBLE_GAIN:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_rumble_gain);

View File

@ -1833,6 +1833,7 @@ int menu_cbs_init_bind_title(menu_file_list_cbs_t *cbs,
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME, action_get_title_dropdown_manual_content_scan_system_name_item},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME, action_get_title_dropdown_manual_content_scan_core_name_item},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX, action_get_title_dropdown_disk_index},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND, action_get_title_dropdown_item},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE, action_get_title_dropdown_item},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION, action_get_title_dropdown_input_description},
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION_KBD, action_get_title_dropdown_input_description_kbd},

View File

@ -3522,6 +3522,65 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
return xmb->textures.list[XMB_TEXTURE_INPUT_SETTINGS];
case MENU_ENUM_LABEL_INPUT_TURBO_FIRE_SETTINGS:
return xmb->textures.list[XMB_TEXTURE_INPUT_TURBO];
case MENU_ENUM_LABEL_INPUT_TURBO_BIND:
case MENU_ENUM_LABEL_INPUT_TURBO_BUTTON:
{
settings_t *settings = config_get_ptr();
int turbo_bind = settings->ints.input_turbo_bind;
if (enum_idx == MENU_ENUM_LABEL_INPUT_TURBO_BUTTON)
turbo_bind = settings->uints.input_turbo_button;
switch (turbo_bind)
{
case RETRO_DEVICE_ID_JOYPAD_UP:
return xmb->textures.list[XMB_TEXTURE_INPUT_DPAD_U];
case RETRO_DEVICE_ID_JOYPAD_DOWN:
return xmb->textures.list[XMB_TEXTURE_INPUT_DPAD_D];
case RETRO_DEVICE_ID_JOYPAD_LEFT:
return xmb->textures.list[XMB_TEXTURE_INPUT_DPAD_L];
case RETRO_DEVICE_ID_JOYPAD_RIGHT:
return xmb->textures.list[XMB_TEXTURE_INPUT_DPAD_R];
case RETRO_DEVICE_ID_JOYPAD_B:
return xmb->textures.list[XMB_TEXTURE_INPUT_BTN_D];
case RETRO_DEVICE_ID_JOYPAD_A:
return xmb->textures.list[XMB_TEXTURE_INPUT_BTN_R];
case RETRO_DEVICE_ID_JOYPAD_Y:
return xmb->textures.list[XMB_TEXTURE_INPUT_BTN_L];
case RETRO_DEVICE_ID_JOYPAD_X:
return xmb->textures.list[XMB_TEXTURE_INPUT_BTN_U];
case RETRO_DEVICE_ID_JOYPAD_SELECT:
return xmb->textures.list[XMB_TEXTURE_INPUT_SELECT];
case RETRO_DEVICE_ID_JOYPAD_START:
return xmb->textures.list[XMB_TEXTURE_INPUT_START];
case RETRO_DEVICE_ID_JOYPAD_L:
return xmb->textures.list[XMB_TEXTURE_INPUT_LB];
case RETRO_DEVICE_ID_JOYPAD_R:
return xmb->textures.list[XMB_TEXTURE_INPUT_RB];
case RETRO_DEVICE_ID_JOYPAD_L2:
return xmb->textures.list[XMB_TEXTURE_INPUT_LT];
case RETRO_DEVICE_ID_JOYPAD_R2:
return xmb->textures.list[XMB_TEXTURE_INPUT_RT];
case RETRO_DEVICE_ID_JOYPAD_L3:
case RETRO_DEVICE_ID_JOYPAD_R3:
return xmb->textures.list[XMB_TEXTURE_INPUT_STCK_P];
case 19: /* Left Analog Up */
case 23: /* Right Analog Up */
return xmb->textures.list[XMB_TEXTURE_INPUT_STCK_U];
case 18: /* Left Analog Down */
case 22: /* Right Analog Down */
return xmb->textures.list[XMB_TEXTURE_INPUT_STCK_D];
case 17: /* Left Analog Left */
case 21: /* Right Analog Left */
return xmb->textures.list[XMB_TEXTURE_INPUT_STCK_L];
case 16: /* Left Analog Right */
case 20: /* Right Analog Right */
return xmb->textures.list[XMB_TEXTURE_INPUT_STCK_R];
default:
break;
}
break;
}
case MENU_ENUM_LABEL_LATENCY_SETTINGS:
case MENU_ENUM_LABEL_CONTENT_SHOW_LATENCY:
case MENU_ENUM_LABEL_SETTINGS_SHOW_LATENCY:

View File

@ -54,6 +54,7 @@ enum
ACTION_OK_DL_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME,
ACTION_OK_DL_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME,
ACTION_OK_DL_DROPDOWN_BOX_LIST_DISK_INDEX,
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND,
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE,
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION,
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION_KBD,

View File

@ -5492,6 +5492,71 @@ static int menu_displaylist_parse_microphone_device_list(
}
#endif
static int menu_displaylist_parse_input_retropad_bind_list(
file_list_t *info_list, const char *info_path,
settings_t *settings)
{
char name[64];
char id[4];
size_t menu_index = 0;
unsigned count = 0;
unsigned i = 0;
rarch_system_info_t *sys_info = &runloop_state_get_ptr()->system;
enum msg_hash_enums enum_idx = (enum msg_hash_enums)atoi(info_path);
rarch_setting_t *setting = menu_setting_find_enum(enum_idx);
struct menu_state *menu_st = menu_state_get_ptr();
bool turbo_bind = enum_idx == MENU_ENUM_LABEL_INPUT_TURBO_BIND;
if (!sys_info || !setting)
return 0;
if (turbo_bind && menu_entries_append(info_list,
"---",
"-1",
MENU_ENUM_LABEL_NO_ITEMS,
MENU_SETTING_DROPDOWN_ITEM_INPUT_RETROPAD_BIND,
0, -1, NULL))
{
count++;
menu_index++;
}
for (i = 0; i < RARCH_ANALOG_BIND_LIST_END; i++)
{
int retro_id = input_config_bind_order[i];
const struct retro_keybind *keyptr =
&input_config_binds[0][retro_id];
snprintf(id, sizeof(id), "%d", retro_id);
strlcpy(name, msg_hash_to_str(keyptr->enum_idx), sizeof(name));
if (!turbo_bind && i >= RARCH_FIRST_CUSTOM_BIND)
continue;
/* Add menu entry */
if (menu_entries_append(info_list,
name,
id,
MENU_ENUM_LABEL_NO_ITEMS,
MENU_SETTING_DROPDOWN_ITEM_INPUT_RETROPAD_BIND,
0, i, NULL))
{
if ((int)retro_id == *setting->value.target.integer)
{
menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)info_list->list[menu_index].actiondata;
if (cbs)
cbs->checked = true;
menu_st->selection_ptr = menu_index;
}
count++;
menu_index++;
}
}
return count;
}
static int menu_displaylist_parse_input_device_type_list(
file_list_t *info_list, const char *info_path)
{
@ -7121,15 +7186,25 @@ unsigned menu_displaylist_build_list(
case DISPLAYLIST_INPUT_TURBO_FIRE_SETTINGS_LIST:
{
menu_displaylist_build_info_t build_list[] = {
{MENU_ENUM_LABEL_INPUT_TURBO_PERIOD, PARSE_ONLY_UINT},
{MENU_ENUM_LABEL_INPUT_DUTY_CYCLE, PARSE_ONLY_UINT},
{MENU_ENUM_LABEL_INPUT_TURBO_ENABLE, PARSE_ONLY_BOOL},
{MENU_ENUM_LABEL_INPUT_TURBO_MODE, PARSE_ONLY_UINT},
{MENU_ENUM_LABEL_INPUT_TURBO_DEFAULT_BUTTON, PARSE_ONLY_UINT},
{MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD, PARSE_ONLY_BOOL},
{MENU_ENUM_LABEL_INPUT_TURBO_BIND, PARSE_ONLY_INT},
{MENU_ENUM_LABEL_INPUT_TURBO_BUTTON, PARSE_ONLY_UINT},
{MENU_ENUM_LABEL_INPUT_TURBO_ALLOW_DPAD, PARSE_ONLY_BOOL},
{MENU_ENUM_LABEL_INPUT_TURBO_PERIOD, PARSE_ONLY_UINT},
{MENU_ENUM_LABEL_INPUT_TURBO_DUTY_CYCLE, PARSE_ONLY_UINT},
};
for (i = 0; i < ARRAY_SIZE(build_list); i++)
{
if ( build_list[i].enum_idx == MENU_ENUM_LABEL_INPUT_TURBO_ALLOW_DPAD
&& settings->uints.input_turbo_mode > INPUT_TURBO_MODE_CLASSIC_TOGGLE)
continue;
if ( build_list[i].enum_idx == MENU_ENUM_LABEL_INPUT_TURBO_BUTTON
&& settings->uints.input_turbo_mode <= INPUT_TURBO_MODE_CLASSIC_TOGGLE)
continue;
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
build_list[i].enum_idx, build_list[i].parse_type,
false) == 0)
@ -14237,6 +14312,21 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
info->flags |= MD_FLAG_NEED_REFRESH
| MD_FLAG_NEED_PUSH;
break;
case DISPLAYLIST_DROPDOWN_LIST_INPUT_RETROPAD_BIND:
menu_entries_clear(info->list);
count = menu_displaylist_parse_input_retropad_bind_list(
info->list, info->path, settings);
if (count == 0)
if (menu_entries_append(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY),
msg_hash_to_str(MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY),
MENU_ENUM_LABEL_NO_ENTRIES_TO_DISPLAY,
FILE_TYPE_NONE, 0, 0, NULL))
count++;
info->flags |= MD_FLAG_NEED_REFRESH
| MD_FLAG_NEED_PUSH;
break;
case DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_TYPE:
menu_entries_clear(info->list);
count = menu_displaylist_parse_input_device_type_list(info->list, info->path);

View File

@ -75,6 +75,7 @@ enum menu_displaylist_ctl_state
DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME,
DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME,
DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX,
DISPLAYLIST_DROPDOWN_LIST_INPUT_RETROPAD_BIND,
DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_TYPE,
DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION,
DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION_KBD,

View File

@ -109,6 +109,7 @@ enum menu_settings_type
MENU_SETTING_DROPDOWN_ITEM_MANUAL_CONTENT_SCAN_SYSTEM_NAME,
MENU_SETTING_DROPDOWN_ITEM_MANUAL_CONTENT_SCAN_CORE_NAME,
MENU_SETTING_DROPDOWN_ITEM_DISK_INDEX,
MENU_SETTING_DROPDOWN_ITEM_INPUT_RETROPAD_BIND,
MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_TYPE,
MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_INDEX,
MENU_SETTING_DROPDOWN_ITEM_INPUT_SELECT_RESERVED_DEVICE,

View File

@ -2698,6 +2698,118 @@ static int setting_action_ok_uint(
return 1;
}
static int setting_action_ok_retropad_bind(
rarch_setting_t *setting, size_t idx, bool wraparound)
{
char enum_idx[16];
if (!setting)
return -1;
snprintf(enum_idx, sizeof(enum_idx), "%d", setting->enum_idx);
generic_action_ok_displaylist_push(
enum_idx, /* we will pass the enumeration index of the string as a path */
NULL, NULL, 0, idx, 0,
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND);
return 1;
}
static int setting_action_left_retropad_bind(
rarch_setting_t *setting, size_t idx, bool wraparound)
{
int value = 0;
int step = 1;
int i = 0;
bool overflowed = false;
if (!setting)
return -1;
value = *setting->value.target.integer;
if (value < 0)
overflowed = true;
else if (input_config_bind_order[value] == 0)
*setting->value.target.integer = -1;
else
{
for (i = 0; i < setting->max + 1; i++)
{
if ((int)input_config_bind_order[i] == value)
{
*setting->value.target.integer = input_config_bind_order[i - step];
break;
}
}
}
i -= step;
if (setting->flags & SD_FLAG_ENFORCE_MINRANGE)
{
if (overflowed || i < setting->min)
{
settings_t *settings = config_get_ptr();
if (settings &&
settings->bools.menu_navigation_wraparound_enable)
{
unsigned max = (unsigned)setting->max;
*setting->value.target.integer = input_config_bind_order[max];
}
}
}
return 0;
}
static int setting_action_right_retropad_bind(
rarch_setting_t *setting, size_t idx, bool wraparound)
{
int value = 0;
int step = 1;
int i = 0;
if (!setting)
return -1;
value = *setting->value.target.integer;
if (value < 0)
*setting->value.target.integer = input_config_bind_order[0];
else
{
for (i = 0; i < setting->max + 1; i++)
{
if ((int)input_config_bind_order[i] == value)
{
*setting->value.target.integer = input_config_bind_order[i + step];
break;
}
}
}
i += step;
if (setting->flags & SD_FLAG_ENFORCE_MAXRANGE)
{
if (i > setting->max)
{
settings_t *settings = config_get_ptr();
int min = (int)setting->min;
if (settings && settings->bools.menu_navigation_wraparound_enable)
{
if (min < 0)
*setting->value.target.integer = min;
else
*setting->value.target.integer = input_config_bind_order[min];
}
}
}
return 0;
}
#if defined(HAVE_NETWORKING)
static void setting_action_ok_color_rgb_cb(void *userdata, const char *line)
{
@ -6721,38 +6833,43 @@ static size_t setting_get_string_representation_turbo_mode(
return 0;
}
static size_t setting_get_string_representation_turbo_default_button(
static size_t setting_get_string_representation_turbo_duty_cycle(
rarch_setting_t *setting, char *s, size_t len)
{
if (setting)
{
switch (*setting->value.target.unsigned_integer)
{
case INPUT_TURBO_DEFAULT_BUTTON_B:
return strlcpy(s, "B", len);
case INPUT_TURBO_DEFAULT_BUTTON_Y:
return strlcpy(s, "Y", len);
case INPUT_TURBO_DEFAULT_BUTTON_A:
return strlcpy(s, "A", len);
case INPUT_TURBO_DEFAULT_BUTTON_X:
return strlcpy(s, "X", len);
case INPUT_TURBO_DEFAULT_BUTTON_L:
return strlcpy(s, "L", len);
case INPUT_TURBO_DEFAULT_BUTTON_R:
return strlcpy(s, "R", len);
case INPUT_TURBO_DEFAULT_BUTTON_L2:
return strlcpy(s, "L2", len);
case INPUT_TURBO_DEFAULT_BUTTON_R2:
return strlcpy(s, "R2", len);
case INPUT_TURBO_DEFAULT_BUTTON_L3:
return strlcpy(s, "L3", len);
case INPUT_TURBO_DEFAULT_BUTTON_R3:
return strlcpy(s, "R3", len);
case 0:
return strlcpy(s,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TURBO_DUTY_CYCLE_HALF), len);
default:
return snprintf(s, len, "%d", *setting->value.target.unsigned_integer);
}
}
return 0;
}
static size_t setting_get_string_representation_retropad_bind(
rarch_setting_t *setting, char *s, size_t len)
{
if (setting)
{
settings_t *settings = config_get_ptr();
int retro_id = *setting->value.target.integer;
if (retro_id < 0)
return strlcpy(s, "---", len);
else
{
const struct retro_keybind *keyptr =
&input_config_binds[0][retro_id];
return strlcpy(s, msg_hash_to_str(keyptr->enum_idx), len);
}
}
return 0;
}
static size_t setting_get_string_representation_poll_type_behavior(
rarch_setting_t *setting, char *s, size_t len)
@ -15725,6 +15842,96 @@ static bool setting_append_list(
START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group);
CONFIG_BOOL(
list, list_info,
&settings->bools.input_turbo_enable,
MENU_ENUM_LABEL_INPUT_TURBO_ENABLE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE,
DEFAULT_TURBO_ENABLE,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE
);
CONFIG_UINT(
list, list_info,
&settings->uints.input_turbo_mode,
MENU_ENUM_LABEL_INPUT_TURBO_MODE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_MODE,
DEFAULT_TURBO_MODE,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
(*list)[list_info->index - 1].action_left = &setting_uint_action_left_with_refresh;
(*list)[list_info->index - 1].action_right = &setting_uint_action_right_with_refresh;
(*list)[list_info->index - 1].get_string_representation =
&setting_get_string_representation_turbo_mode;
menu_settings_list_current_add_range(list, list_info, 0, (INPUT_TURBO_MODE_LAST-1), 1, true, true);
CONFIG_INT(
list, list_info,
&settings->ints.input_turbo_bind,
MENU_ENUM_LABEL_INPUT_TURBO_BIND,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BIND,
DEFAULT_TURBO_BIND,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
(*list)[list_info->index - 1].action_ok = &setting_action_ok_retropad_bind;
(*list)[list_info->index - 1].action_left = &setting_action_left_retropad_bind;
(*list)[list_info->index - 1].action_right = &setting_action_right_retropad_bind;
(*list)[list_info->index - 1].offset_by = -1;
(*list)[list_info->index - 1].get_string_representation =
&setting_get_string_representation_retropad_bind;
menu_settings_list_current_add_range(list, list_info, -1, (RARCH_ANALOG_BIND_LIST_END-1), 1, true, true);
CONFIG_UINT(
list, list_info,
&settings->uints.input_turbo_button,
MENU_ENUM_LABEL_INPUT_TURBO_BUTTON,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_BUTTON,
DEFAULT_TURBO_BUTTON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
(*list)[list_info->index - 1].action_ok = &setting_action_ok_retropad_bind;
(*list)[list_info->index - 1].action_left = &setting_action_left_retropad_bind;
(*list)[list_info->index - 1].action_right = &setting_action_right_retropad_bind;
(*list)[list_info->index - 1].get_string_representation =
&setting_get_string_representation_retropad_bind;
menu_settings_list_current_add_range(list, list_info, 0, (RARCH_FIRST_CUSTOM_BIND-1), 1, true, true);
CONFIG_BOOL(
list, list_info,
&settings->bools.input_turbo_allow_dpad,
MENU_ENUM_LABEL_INPUT_TURBO_ALLOW_DPAD,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ALLOW_DPAD,
DEFAULT_TURBO_ALLOW_DPAD,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE
);
CONFIG_UINT(
list, list_info,
&settings->uints.input_turbo_period,
@ -15739,13 +15946,12 @@ static bool setting_append_list(
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
(*list)[list_info->index - 1].offset_by = 1;
menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
CONFIG_UINT(
list, list_info,
&settings->uints.input_turbo_duty_cycle,
MENU_ENUM_LABEL_INPUT_DUTY_CYCLE,
MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE,
MENU_ENUM_LABEL_INPUT_TURBO_DUTY_CYCLE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_DUTY_CYCLE,
DEFAULT_TURBO_DUTY_CYCLE,
&group_info,
&subgroup_info,
@ -15753,59 +15959,9 @@ static bool setting_append_list(
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
(*list)[list_info->index - 1].offset_by = 1;
menu_settings_list_current_add_range(list, list_info, 1, 100, 1, true, true);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
CONFIG_UINT(
list, list_info,
&settings->uints.input_turbo_mode,
MENU_ENUM_LABEL_INPUT_TURBO_MODE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_MODE,
DEFAULT_TURBO_MODE,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
(*list)[list_info->index - 1].get_string_representation =
&setting_get_string_representation_turbo_mode;
menu_settings_list_current_add_range(list, list_info, 0, (INPUT_TURBO_MODE_LAST-1), 1, true, true);
CONFIG_UINT(
list, list_info,
&settings->uints.input_turbo_default_button,
MENU_ENUM_LABEL_INPUT_TURBO_DEFAULT_BUTTON,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_DEFAULT_BUTTON,
DEFAULT_TURBO_DEFAULT_BTN,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
(*list)[list_info->index - 1].get_string_representation =
&setting_get_string_representation_turbo_default_button;
menu_settings_list_current_add_range(list, list_info, 0, (INPUT_TURBO_DEFAULT_BUTTON_LAST-1), 1, true, true);
CONFIG_BOOL(
list, list_info,
&settings->bools.input_allow_turbo_dpad,
MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD,
MENU_ENUM_LABEL_VALUE_INPUT_ALLOW_TURBO_DPAD,
DEFAULT_ALLOW_TURBO_DPAD,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE
);
&setting_get_string_representation_turbo_duty_cycle;
menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true);
END_SUB_GROUP(list, list_info, parent_group);

View File

@ -904,7 +904,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS_BEGIN,
MENU_LABEL(INPUT_TURBO_PERIOD),
MENU_LABEL(INPUT_TURBO_ENABLE),
MENU_LABEL(INPUT_TURBO_MODE),
MENU_ENUM_LABEL_VALUE_TURBO_MODE_CLASSIC,
MENU_ENUM_LABEL_VALUE_TURBO_MODE_CLASSIC_TOGGLE,
@ -914,8 +914,15 @@ enum msg_hash_enums
MENU_ENUM_LABEL_HELP_TURBO_MODE_CLASSIC_TOGGLE,
MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON,
MENU_ENUM_LABEL_HELP_TURBO_MODE_SINGLEBUTTON_HOLD,
MENU_LABEL(INPUT_TURBO_DEFAULT_BUTTON),
MENU_LABEL(INPUT_ALLOW_TURBO_DPAD),
MENU_LABEL(INPUT_TURBO_BIND),
MENU_LABEL(INPUT_TURBO_BUTTON),
MENU_LABEL(INPUT_TURBO_ALLOW_DPAD),
MENU_LABEL(INPUT_TURBO_PERIOD),
MENU_LABEL(INPUT_TURBO_DUTY_CYCLE),
MENU_ENUM_LABEL_VALUE_TURBO_DUTY_CYCLE_HALF,
MENU_LABEL(INPUT_TURBO_DEFAULT_BUTTON), /* Deprecated */
MENU_LABEL(INPUT_ALLOW_TURBO_DPAD), /* Deprecated */
MENU_LABEL(INPUT_DUTY_CYCLE), /* Deprecated */
/* MENU_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX,
MENU_ENUM_LABEL_INPUT_PLAYER2_JOYPAD_INDEX,
@ -1097,7 +1104,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN,
MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT,
MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE,
MENU_ENUM_LABEL_VALUE_INPUT_TURBO,
MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY,
MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE,
@ -1144,6 +1151,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE,
MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE,
MENU_ENUM_LABEL_VALUE_INPUT_META_TURBO_FIRE_TOGGLE,
MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE,
MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE,
MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,
@ -1243,6 +1251,7 @@ enum msg_hash_enums
MENU_ENUM_SUBLABEL_INPUT_META_RECORDING_TOGGLE,
MENU_ENUM_SUBLABEL_INPUT_META_STREAMING_TOGGLE,
MENU_ENUM_SUBLABEL_INPUT_META_TURBO_FIRE_TOGGLE,
MENU_ENUM_SUBLABEL_INPUT_META_GRAB_MOUSE_TOGGLE,
MENU_ENUM_SUBLABEL_INPUT_META_GAME_FOCUS_TOGGLE,
MENU_ENUM_SUBLABEL_INPUT_META_FULLSCREEN_TOGGLE_KEY,
@ -1272,7 +1281,6 @@ enum msg_hash_enums
MENU_LABEL(INPUT_USER_BINDS),
MENU_ENUM_SUBLABEL_INPUT_USER_REMAPS,
MENU_LABEL(INPUT_DUTY_CYCLE),
MENU_LABEL(INPUT_AUTODETECT_ENABLE),
#if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT)
MENU_LABEL(INPUT_NOWINKEY_ENABLE),
@ -2007,6 +2015,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_SYSTEM_NAME,
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_MANUAL_CONTENT_SCAN_CORE_NAME,
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX,
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_RETROPAD_BIND,
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE,
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION,
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION_KBD,

View File

@ -5148,6 +5148,10 @@ bool command_event(enum event_command cmd, void *data)
}
}
break;
case CMD_EVENT_TURBO_FIRE_TOGGLE:
configuration_set_bool(settings,
settings->bools.input_turbo_enable, !settings->bools.input_turbo_enable);
break;
case CMD_EVENT_GRAB_MOUSE_TOGGLE:
{
bool ret = false;

View File

@ -5583,6 +5583,9 @@ static enum runloop_state_enum runloop_check_state(
/* Check fullscreen hotkey */
HOTKEY_CHECK(RARCH_FULLSCREEN_TOGGLE_KEY, CMD_EVENT_FULLSCREEN_TOGGLE, true, NULL);
/* Check turbo toggle hotkey */
HOTKEY_CHECK(RARCH_TURBO_FIRE_TOGGLE, CMD_EVENT_TURBO_FIRE_TOGGLE, true, NULL);
/* Check mouse grab hotkey */
HOTKEY_CHECK(RARCH_GRAB_MOUSE_TOGGLE, CMD_EVENT_GRAB_MOUSE_TOGGLE, true, NULL);

View File

@ -11,7 +11,6 @@ input_ai_service = "nul"
input_ai_service_axis = "nul"
input_ai_service_btn = "nul"
input_ai_service_mbtn = "nul"
input_allow_turbo_dpad = "false"
input_analog_deadzone = "0.000000"
input_analog_sensitivity = "1.000000"
input_audio_mute = "nul"