mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
Merge pull request #11992 from sonninnos/device-index-dropdown
Submenu for Device Index
This commit is contained in:
commit
e4f8f64336
@ -688,6 +688,10 @@ MSG_HASH(
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE,
|
||||
"deferred_dropdown_box_list_input_device_type"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX,
|
||||
"deferred_dropdown_box_list_input_device_index"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION,
|
||||
"deferred_dropdown_box_list_input_description"
|
||||
|
@ -651,6 +651,7 @@ GENERIC_DEFERRED_PUSH_CLEAR_GENERAL(deferred_push_dropdown_box_list_manual_conte
|
||||
GENERIC_DEFERRED_PUSH_CLEAR_GENERAL(deferred_push_dropdown_box_list_manual_content_scan_core_name, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME)
|
||||
GENERIC_DEFERRED_PUSH_CLEAR_GENERAL(deferred_push_dropdown_box_list_disk_index, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX)
|
||||
GENERIC_DEFERRED_PUSH_CLEAR_GENERAL(deferred_push_dropdown_box_list_input_device_type, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_TYPE)
|
||||
GENERIC_DEFERRED_PUSH_CLEAR_GENERAL(deferred_push_dropdown_box_list_input_device_index, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_INDEX)
|
||||
GENERIC_DEFERRED_PUSH_CLEAR_GENERAL(deferred_push_dropdown_box_list_input_description, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION)
|
||||
GENERIC_DEFERRED_PUSH_CLEAR_GENERAL(deferred_push_dropdown_box_list_input_description_kbd, PUSH_DEFAULT, DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION_KBD)
|
||||
|
||||
@ -682,6 +683,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
|
||||
{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_DEVICE_TYPE, deferred_push_dropdown_box_list_input_device_type},
|
||||
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX, deferred_push_dropdown_box_list_input_device_index},
|
||||
{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},
|
||||
{MENU_ENUM_LABEL_DEFERRED_BROWSE_URL_LIST, deferred_push_browse_url_list},
|
||||
|
@ -283,6 +283,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl)
|
||||
return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_DISK_INDEX;
|
||||
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_DEVICE_INDEX:
|
||||
return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX;
|
||||
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION:
|
||||
return MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION;
|
||||
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION_KBD:
|
||||
@ -681,6 +683,15 @@ int generic_action_ok_displaylist_push(const char *path,
|
||||
info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_TYPE;
|
||||
dl_type = DISPLAYLIST_GENERIC;
|
||||
break;
|
||||
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX:
|
||||
info.type = type;
|
||||
info.directory_ptr = idx;
|
||||
info_path = path;
|
||||
info_label = msg_hash_to_str(
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX);
|
||||
info.enum_idx = MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX;
|
||||
dl_type = DISPLAYLIST_GENERIC;
|
||||
break;
|
||||
case ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION:
|
||||
info.type = type;
|
||||
info.directory_ptr = idx;
|
||||
@ -6278,10 +6289,11 @@ static int action_ok_push_dropdown_item_input_device_type(const char *path,
|
||||
unsigned device = 0;
|
||||
|
||||
const char *menu_path = NULL;
|
||||
enum msg_hash_enums enum_idx;
|
||||
rarch_setting_t *setting;
|
||||
menu_entries_get_last_stack(&menu_path, NULL, NULL, NULL, NULL);
|
||||
|
||||
enum msg_hash_enums enum_idx = (enum msg_hash_enums)atoi(menu_path);
|
||||
rarch_setting_t *setting = menu_setting_find_enum(enum_idx);
|
||||
enum_idx = (enum msg_hash_enums)atoi(menu_path);
|
||||
setting = menu_setting_find_enum(enum_idx);
|
||||
|
||||
if (!setting)
|
||||
return menu_cbs_exit();
|
||||
@ -6299,6 +6311,26 @@ static int action_ok_push_dropdown_item_input_device_type(const char *path,
|
||||
return action_cancel_pop_default(NULL, NULL, 0, 0);
|
||||
}
|
||||
|
||||
static int action_ok_push_dropdown_item_input_device_index(const char *path,
|
||||
const char *label, unsigned type, size_t idx, size_t entry_idx)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
|
||||
const char *menu_path = NULL;
|
||||
enum msg_hash_enums enum_idx;
|
||||
rarch_setting_t *setting;
|
||||
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 menu_cbs_exit();
|
||||
|
||||
settings->uints.input_joypad_map[setting->index_offset] = entry_idx;
|
||||
|
||||
return action_cancel_pop_default(NULL, NULL, 0, 0);
|
||||
}
|
||||
|
||||
static int action_ok_push_dropdown_item_input_description(const char *path,
|
||||
const char *label, unsigned type, size_t idx, size_t entry_idx)
|
||||
{
|
||||
@ -7808,6 +7840,9 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs,
|
||||
case MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_TYPE:
|
||||
BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_input_device_type);
|
||||
break;
|
||||
case MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_INDEX:
|
||||
BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_input_device_index);
|
||||
break;
|
||||
case MENU_SETTING_DROPDOWN_ITEM_INPUT_DESCRIPTION:
|
||||
BIND_ACTION_OK(cbs, action_ok_push_dropdown_item_input_description);
|
||||
break;
|
||||
|
@ -298,6 +298,11 @@ static int action_get_title_dropdown_item(
|
||||
(enum_idx <= MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE_LAST))
|
||||
enum_idx = MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE;
|
||||
|
||||
/* Device Index */
|
||||
if ((enum_idx >= MENU_ENUM_LABEL_INPUT_DEVICE_INDEX) &&
|
||||
(enum_idx <= MENU_ENUM_LABEL_INPUT_DEVICE_INDEX_LAST))
|
||||
enum_idx = MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX;
|
||||
|
||||
{
|
||||
const char *title = msg_hash_to_str(enum_idx);
|
||||
|
||||
@ -1649,6 +1654,7 @@ int menu_cbs_init_bind_title(menu_file_list_cbs_t *cbs,
|
||||
{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_DEVICE_TYPE, action_get_title_dropdown_item},
|
||||
{MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX, 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},
|
||||
{MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS, action_get_quick_menu_views_settings_list},
|
||||
|
@ -60,6 +60,7 @@ enum
|
||||
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_DEVICE_TYPE,
|
||||
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX,
|
||||
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION,
|
||||
ACTION_OK_DL_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION_KBD,
|
||||
ACTION_OK_DL_OPEN_ARCHIVE,
|
||||
|
@ -4138,6 +4138,115 @@ end:
|
||||
return count;
|
||||
}
|
||||
|
||||
static int menu_displaylist_parse_input_device_index_list(menu_displaylist_info_t *info)
|
||||
{
|
||||
rarch_system_info_t *system = runloop_get_system_info();
|
||||
settings_t *settings = config_get_ptr();
|
||||
|
||||
enum msg_hash_enums enum_idx = (enum msg_hash_enums)atoi(info->path);
|
||||
rarch_setting_t *setting = menu_setting_find_enum(enum_idx);
|
||||
size_t menu_index = 0;
|
||||
unsigned count = 0;
|
||||
|
||||
unsigned i = 0;
|
||||
unsigned port = 0;
|
||||
unsigned map = 0;
|
||||
int current_device = -1;
|
||||
unsigned max_devices = input_config_get_device_count();
|
||||
|
||||
char device_id[10];
|
||||
char device_label[128];
|
||||
const char *device_name = NULL;
|
||||
|
||||
device_id[0] = '\0';
|
||||
device_label[0] = '\0';
|
||||
|
||||
if (!system || !settings || !setting)
|
||||
goto end;
|
||||
|
||||
port = setting->index_offset;
|
||||
map = settings->uints.input_joypad_map[port];
|
||||
|
||||
if (port >= MAX_USERS)
|
||||
goto end;
|
||||
|
||||
for (i = max_devices + 1; i--;)
|
||||
{
|
||||
snprintf(device_id, sizeof(device_id), "%d", i);
|
||||
|
||||
device_label[0] = '\0';
|
||||
device_name = NULL;
|
||||
|
||||
if (i < max_devices)
|
||||
{
|
||||
device_name = input_config_get_device_display_name(i) ?
|
||||
input_config_get_device_display_name(i) : input_config_get_device_name(i);
|
||||
|
||||
if (!string_is_empty(device_name))
|
||||
{
|
||||
unsigned idx = input_config_get_device_name_index(i);
|
||||
|
||||
/*if idx is non-zero, it's part of a set*/
|
||||
if (idx > 0)
|
||||
snprintf(device_label, sizeof(device_label),
|
||||
"%s (#%u)",
|
||||
device_name,
|
||||
idx);
|
||||
else
|
||||
strlcpy(device_label, device_name, sizeof(device_label));
|
||||
}
|
||||
else
|
||||
snprintf(device_label, sizeof(device_label),
|
||||
"%s (%s #%u)",
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PORT),
|
||||
map);
|
||||
}
|
||||
else
|
||||
strlcpy(device_label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), sizeof(device_label));
|
||||
|
||||
/* Add menu entry */
|
||||
if (menu_entries_append_enum(info->list,
|
||||
device_label,
|
||||
device_id,
|
||||
MENU_ENUM_LABEL_INPUT_BIND_DEVICE_INDEX,
|
||||
MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_INDEX,
|
||||
0, i))
|
||||
{
|
||||
/* Add checkmark if input is currently
|
||||
* mapped to this entry */
|
||||
if (i == map)
|
||||
{
|
||||
menu_entries_set_checked(info->list, menu_index, true);
|
||||
menu_navigation_set_selection(menu_index);
|
||||
current_device = i;
|
||||
}
|
||||
|
||||
count++;
|
||||
menu_index++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Disabled is the last device, which is the first entry */
|
||||
if (current_device < 0)
|
||||
{
|
||||
menu_entries_set_checked(info->list, 0, true);
|
||||
menu_navigation_set_selection(0);
|
||||
}
|
||||
|
||||
end:
|
||||
/* Fallback */
|
||||
if (count == 0)
|
||||
if (menu_entries_append_enum(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))
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int menu_displaylist_parse_input_description_list(menu_displaylist_info_t *info)
|
||||
{
|
||||
unsigned count = 0;
|
||||
@ -11146,6 +11255,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
|
||||
info->need_refresh = true;
|
||||
info->need_push = true;
|
||||
break;
|
||||
case DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_INDEX:
|
||||
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
|
||||
count = menu_displaylist_parse_input_device_index_list(info);
|
||||
info->need_refresh = true;
|
||||
info->need_push = true;
|
||||
break;
|
||||
case DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION:
|
||||
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
|
||||
count = menu_displaylist_parse_input_description_list(info);
|
||||
|
@ -68,6 +68,7 @@ enum menu_displaylist_ctl_state
|
||||
DISPLAYLIST_DROPDOWN_LIST_MANUAL_CONTENT_SCAN_CORE_NAME,
|
||||
DISPLAYLIST_DROPDOWN_LIST_DISK_INDEX,
|
||||
DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_TYPE,
|
||||
DISPLAYLIST_DROPDOWN_LIST_INPUT_DEVICE_INDEX,
|
||||
DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION,
|
||||
DISPLAYLIST_DROPDOWN_LIST_INPUT_DESCRIPTION_KBD,
|
||||
DISPLAYLIST_CDROM_DETAIL_INFO,
|
||||
|
@ -84,6 +84,7 @@ enum menu_settings_type
|
||||
MENU_SETTING_DROPDOWN_ITEM_MANUAL_CONTENT_SCAN_CORE_NAME,
|
||||
MENU_SETTING_DROPDOWN_ITEM_DISK_INDEX,
|
||||
MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_TYPE,
|
||||
MENU_SETTING_DROPDOWN_ITEM_INPUT_DEVICE_INDEX,
|
||||
MENU_SETTING_DROPDOWN_ITEM_INPUT_DESCRIPTION,
|
||||
MENU_SETTING_DROPDOWN_ITEM_INPUT_DESCRIPTION_KBD,
|
||||
MENU_SETTING_DROPDOWN_SETTING_CORE_OPTIONS_ITEM,
|
||||
|
@ -2777,6 +2777,22 @@ static int setting_action_ok_libretro_device_type(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setting_action_ok_bind_device(
|
||||
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_DEVICE_INDEX);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setting_string_action_left_string_options(
|
||||
rarch_setting_t* setting, size_t idx, bool wraparound)
|
||||
{
|
||||
@ -7963,7 +7979,11 @@ static bool setting_append_list_input_player_options(
|
||||
(*list)[list_info->index - 1].action_left = &setting_action_left_bind_device;
|
||||
(*list)[list_info->index - 1].action_right = &setting_action_right_bind_device;
|
||||
(*list)[list_info->index - 1].action_select = &setting_action_right_bind_device;
|
||||
(*list)[list_info->index - 1].get_string_representation = &get_string_representation_bind_device;
|
||||
(*list)[list_info->index - 1].action_ok = &setting_action_ok_bind_device;
|
||||
(*list)[list_info->index - 1].get_string_representation =
|
||||
&get_string_representation_bind_device;
|
||||
MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info,
|
||||
(enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_DEVICE_INDEX + user));
|
||||
|
||||
CONFIG_ACTION_ALT(
|
||||
list, list_info,
|
||||
|
@ -729,6 +729,8 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE_LAST = MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE + MAX_USERS,
|
||||
MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE,
|
||||
MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE_LAST = MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE + MAX_USERS,
|
||||
MENU_ENUM_LABEL_INPUT_DEVICE_INDEX,
|
||||
MENU_ENUM_LABEL_INPUT_DEVICE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_DEVICE_INDEX + MAX_USERS,
|
||||
MENU_ENUM_LABEL_INPUT_SETTINGS_BEGIN,
|
||||
|
||||
MENU_LABEL(INPUT_HOTKEY_BINDS),
|
||||
@ -747,6 +749,7 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_INPUT_PLAYER4_JOYPAD_INDEX,
|
||||
MENU_ENUM_LABEL_INPUT_PLAYER5_JOYPAD_INDEX,
|
||||
MENU_ENUM_LABEL_INPUT_BIND_DEVICE_TYPE,
|
||||
MENU_ENUM_LABEL_INPUT_BIND_DEVICE_INDEX,
|
||||
MENU_ENUM_LABEL_INPUT_DRIVER_LINUXRAW,
|
||||
MENU_ENUM_LABEL_INPUT_DRIVER_UDEV,
|
||||
MENU_ENUM_LABEL_INPUT_USER_1_BINDS,
|
||||
@ -1414,6 +1417,7 @@ enum msg_hash_enums
|
||||
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_DEVICE_TYPE,
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DEVICE_INDEX,
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION,
|
||||
MENU_ENUM_LABEL_DEFERRED_DROPDOWN_BOX_LIST_INPUT_DESCRIPTION_KBD,
|
||||
MENU_ENUM_LABEL_DEFERRED_MIXER_STREAM_SETTINGS_LIST,
|
||||
|
Loading…
x
Reference in New Issue
Block a user