diff --git a/config.def.h b/config.def.h index a1213335c9..701c5a0b01 100644 --- a/config.def.h +++ b/config.def.h @@ -1508,6 +1508,7 @@ #define DEFAULT_TURBO_DUTY_CYCLE 3 #define DEFAULT_TURBO_MODE 0 #define DEFAULT_TURBO_DEFAULT_BTN RETRO_DEVICE_ID_JOYPAD_B +#define DEFAULT_ALLOW_TURBO_DPAD false #if TARGET_OS_IPHONE #define DEFAULT_INPUT_KEYBOARD_GAMEPAD_ENABLE false diff --git a/configuration.c b/configuration.c index a39b64e5be..4bdaa69509 100644 --- a/configuration.c +++ b/configuration.c @@ -2069,6 +2069,7 @@ 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_auto_mouse_grab", &settings->bools.input_auto_mouse_grab, true, false, false); SETTING_BOOL("input_remap_binds_enable", &settings->bools.input_remap_binds_enable, true, true, false); SETTING_BOOL("all_users_control_menu", &settings->bools.input_all_users_control_menu, true, DEFAULT_ALL_USERS_CONTROL_MENU, false); diff --git a/configuration.h b/configuration.h index 7610a04d18..786f1f439c 100644 --- a/configuration.h +++ b/configuration.h @@ -671,6 +671,7 @@ typedef struct settings bool input_small_keyboard_enable; bool input_keyboard_gamepad_enable; bool input_auto_mouse_grab; + bool input_allow_turbo_dpad; #if defined(HAVE_DINPUT) || defined(HAVE_WINRAWINPUT) bool input_nowinkey_enable; #endif diff --git a/input/input_driver.c b/input/input_driver.c index f3b01581cd..177d5df2b8 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1262,9 +1262,10 @@ static int16_t input_state_device( #endif } - /* Don't allow turbo for D-pad. */ + /* Don't allow turbo for D-pad unless explicitly allowed. */ if ( (id < RETRO_DEVICE_ID_JOYPAD_UP) - || ( (id > RETRO_DEVICE_ID_JOYPAD_RIGHT) + || ( ((settings->bools.input_allow_turbo_dpad) + || (id > RETRO_DEVICE_ID_JOYPAD_RIGHT)) && (id <= RETRO_DEVICE_ID_JOYPAD_R3))) { /* diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 7c8418600b..c227a5a524 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -6378,6 +6378,10 @@ MSG_HASH( MENU_ENUM_LABEL_INPUT_TURBO_DEFAULT_BUTTON, "input_turbo_default_button" ) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD, + "input_allow_turbo_dpad" + ) MSG_HASH( MENU_ENUM_LABEL_MENU_VIEWS_SETTINGS, "menu_views_settings" diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 9b311726e0..96b07440dc 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -484,6 +484,9 @@ 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 80ac699b02..875ba9e18e 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3279,6 +3279,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_TURBO_DEFAULT_BUTTON, "Default active button for Turbo Mode 'Single Button'." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ALLOW_TURBO_DPAD, + "Allow Turbo D-Pad Directions" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_ALLOW_TURBO_DPAD, + "If enabled, digital directional inputs (also known as d-pad or 'hatswitch') can be turbo." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_TURBO_FIRE_SETTINGS, "Turbo Fire" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 520595fd5b..530d73d95c 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -552,6 +552,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_period, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_duty_cycle, MENU_ENUM_SUBLABEL_INPUT_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_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) @@ -4436,6 +4437,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_INPUT_TURBO_DEFAULT_BUTTON: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_turbo_default_button); break; + case MENU_ENUM_LABEL_INPUT_ALLOW_TURBO_DPAD: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_allow_turbo_dpad); + break; case MENU_ENUM_LABEL_INPUT_RUMBLE_GAIN: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_rumble_gain); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index bebbe61d88..ee71e2dc8e 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -6759,6 +6759,7 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_INPUT_DUTY_CYCLE, PARSE_ONLY_UINT}, {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}, }; for (i = 0; i < ARRAY_SIZE(build_list); i++) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index c835500cde..80a43f75c7 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -15241,6 +15241,22 @@ static bool setting_append_list( &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 + ); + END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); diff --git a/msg_hash.h b/msg_hash.h index ff20ed6534..1cc171886c 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -887,6 +887,7 @@ enum msg_hash_enums 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_ENUM_LABEL_INPUT_PLAYER1_JOYPAD_INDEX, MENU_ENUM_LABEL_INPUT_PLAYER2_JOYPAD_INDEX,