diff --git a/command.h b/command.h index d1aa67651a..3e737e0b9f 100644 --- a/command.h +++ b/command.h @@ -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 }, diff --git a/config.def.h b/config.def.h index 0b39c4270d..fbfe69477b 100644 --- a/config.def.h +++ b/config.def.h @@ -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 */ diff --git a/config.def.keybinds.h b/config.def.keybinds.h index bbfbda2c58..f4d6a6bb28 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -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 }, diff --git a/configuration.c b/configuration.c index c9563cf380..427cad4c55 100644 --- a/configuration.c +++ b/configuration.c @@ -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); diff --git a/configuration.h b/configuration.h index 6577cfa794..112dcc1039 100644 --- a/configuration.h +++ b/configuration.h @@ -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; diff --git a/input/input_defines.h b/input/input_defines.h index 5ba2f88fe8..7c03962b2a 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -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, diff --git a/input/input_driver.c b/input/input_driver.c index 613fc9f50f..be87d0dd03 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -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) diff --git a/input/input_driver.h b/input/input_driver.h index ba4242a625..01df42819c 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -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; diff --git a/input/input_types.h b/input/input_types.h index 094559ecf0..b5b97ccb4d 100644 --- a/input/input_types.h +++ b/input/input_types.h @@ -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; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 37fbac540d..8eece68929 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -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, diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 05b4672494..85f9341d8b 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -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); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c6c0fafbb2..1c6dfb7a8f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -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" ) diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 95e3ea8165..804242281d 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -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}, diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 665d43016a..8ee4a19598 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -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; } diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index b3622ca305..73f1abe029 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -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; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index a5033e3c4c..2c7afee3ef 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -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; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index bfe9eacc56..162a14c852 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -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); diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index f485e3532b..aa58fc10f1 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -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}, diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index e3ad87e104..c267294e65 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -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: diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 753a23bb92..9b7bff3a5e 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -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, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index cc7aa7b4c7..5de1ec0953 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -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); diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 47acb97b6e..69d58706e7 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -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, diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 20ab4a9960..6c765cc3bf 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -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, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 31fda32c5f..f39de20232 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -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); diff --git a/msg_hash.h b/msg_hash.h index b070f6abd9..8941d2e49b 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -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, diff --git a/retroarch.c b/retroarch.c index ea135e5ef0..eba92c1282 100644 --- a/retroarch.c +++ b/retroarch.c @@ -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; diff --git a/runloop.c b/runloop.c index 558d1dffc3..9f86e1c214 100644 --- a/runloop.c +++ b/runloop.c @@ -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); diff --git a/tests-other/all_binds_empty.cfg b/tests-other/all_binds_empty.cfg index b672d927a1..51fe9f76d1 100644 --- a/tests-other/all_binds_empty.cfg +++ b/tests-other/all_binds_empty.cfg @@ -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"