(Menu) Refactor two input settings

This commit is contained in:
twinaphex 2014-09-08 22:12:22 +02:00
parent b42ed89d23
commit 1c1194cdca
4 changed files with 152 additions and 171 deletions

View File

@ -90,32 +90,7 @@ static int menu_info_screen_iterate(unsigned action)
strlcpy(needle, label, sizeof(needle));
}
if (needle[0] == '\0' || setting_data_get_description(needle, msg, sizeof(msg)) == -1)
{
switch (info_type)
{
case MENU_SETTINGS_BIND_DEVICE:
snprintf(msg, sizeof(msg),
" -- Input Device. \n"
" \n"
"Picks which gamepad to use for player N. \n"
"The name of the pad is available."
);
break;
case MENU_SETTINGS_BIND_DEVICE_TYPE:
snprintf(msg, sizeof(msg),
" -- Input Device Type. \n"
" \n"
"Picks which device type to use. This is \n"
"relevant for the libretro core itself."
);
break;
default:
snprintf(msg, sizeof(msg),
"-- No info on this item available. --\n");
}
}
setting_data_get_description(needle, msg, sizeof(msg));
if (driver.video_data && driver.menu_ctx &&
driver.menu_ctx->render_messagebox)
@ -613,6 +588,89 @@ static int menu_setting_set(unsigned id, const char *label,
if (driver.menu->need_refresh)
gfx_shader_resolve_parameters(NULL, driver.menu->shader);
#endif
}
else if (!strcmp(label, "input_bind_device_id"))
{
int *p = &g_settings.input.joypad_map[port];
if (action == MENU_ACTION_START)
*p = port;
else if (action == MENU_ACTION_LEFT)
(*p)--;
else if (action == MENU_ACTION_RIGHT)
(*p)++;
if (*p < -1)
*p = -1;
else if (*p >= MAX_PLAYERS)
*p = MAX_PLAYERS - 1;
}
else if (!strcmp(label, "input_bind_device_type"))
{
unsigned current_device, current_index, i, devices[128];
const struct retro_controller_info *desc;
unsigned types = 0;
devices[types++] = RETRO_DEVICE_NONE;
devices[types++] = RETRO_DEVICE_JOYPAD;
/* Only push RETRO_DEVICE_ANALOG as default if we use an
* older core which doesn't use SET_CONTROLLER_INFO. */
if (!g_extern.system.num_ports)
devices[types++] = RETRO_DEVICE_ANALOG;
desc = port < g_extern.system.num_ports ?
&g_extern.system.ports[port] : NULL;
if (desc)
{
for (i = 0; i < desc->num_types; i++)
{
unsigned id = desc->types[i].id;
if (types < ARRAY_SIZE(devices) &&
id != RETRO_DEVICE_NONE &&
id != RETRO_DEVICE_JOYPAD)
devices[types++] = id;
}
}
current_device = g_settings.input.libretro_device[port];
current_index = 0;
for (i = 0; i < types; i++)
{
if (current_device == devices[i])
{
current_index = i;
break;
}
}
bool updated = true;
switch (action)
{
case MENU_ACTION_START:
current_device = RETRO_DEVICE_JOYPAD;
break;
case MENU_ACTION_LEFT:
current_device = devices
[(current_index + types - 1) % types];
break;
case MENU_ACTION_RIGHT:
case MENU_ACTION_OK:
current_device = devices
[(current_index + 1) % types];
break;
default:
updated = false;
}
if (updated)
{
g_settings.input.libretro_device[port] = current_device;
pretro_set_controller_port_device(port, current_device);
}
}
else
{
@ -635,22 +693,6 @@ static int menu_setting_set(unsigned id, const char *label,
driver.menu->need_refresh = true;
port = driver.menu->current_pad;
break;
case MENU_SETTINGS_BIND_DEVICE:
{
int *p = &g_settings.input.joypad_map[port];
if (action == MENU_ACTION_START)
*p = port;
else if (action == MENU_ACTION_LEFT)
(*p)--;
else if (action == MENU_ACTION_RIGHT)
(*p)++;
if (*p < -1)
*p = -1;
else if (*p >= MAX_PLAYERS)
*p = MAX_PLAYERS - 1;
}
break;
case MENU_SETTINGS_BIND_ANALOG_MODE:
switch (action)
{
@ -675,75 +717,6 @@ static int menu_setting_set(unsigned id, const char *label,
break;
}
break;
case MENU_SETTINGS_BIND_DEVICE_TYPE:
{
unsigned current_device, current_index, i, devices[128];
const struct retro_controller_info *desc;
unsigned types = 0;
devices[types++] = RETRO_DEVICE_NONE;
devices[types++] = RETRO_DEVICE_JOYPAD;
/* Only push RETRO_DEVICE_ANALOG as default if we use an
* older core which doesn't use SET_CONTROLLER_INFO. */
if (!g_extern.system.num_ports)
devices[types++] = RETRO_DEVICE_ANALOG;
desc = port < g_extern.system.num_ports ?
&g_extern.system.ports[port] : NULL;
if (desc)
{
for (i = 0; i < desc->num_types; i++)
{
unsigned id = desc->types[i].id;
if (types < ARRAY_SIZE(devices) &&
id != RETRO_DEVICE_NONE &&
id != RETRO_DEVICE_JOYPAD)
devices[types++] = id;
}
}
current_device = g_settings.input.libretro_device[port];
current_index = 0;
for (i = 0; i < types; i++)
{
if (current_device == devices[i])
{
current_index = i;
break;
}
}
bool updated = true;
switch (action)
{
case MENU_ACTION_START:
current_device = RETRO_DEVICE_JOYPAD;
break;
case MENU_ACTION_LEFT:
current_device = devices
[(current_index + types - 1) % types];
break;
case MENU_ACTION_RIGHT:
case MENU_ACTION_OK:
current_device = devices
[(current_index + 1) % types];
break;
default:
updated = false;
}
if (updated)
{
g_settings.input.libretro_device[port] = current_device;
pretro_set_controller_port_device(port, current_device);
}
break;
}
case MENU_SETTINGS_CUSTOM_BIND_MODE:
if (action == MENU_ACTION_LEFT || action == MENU_ACTION_RIGHT)
driver.menu->bind_mode_keyboard =

View File

@ -104,8 +104,6 @@ typedef enum
MENU_SETTINGS_SHADER_PASS_SCALE_LAST = MENU_SETTINGS_SHADER_PASS_SCALE_0 + (GFX_MAX_SHADERS - 1),
MENU_SETTINGS_BIND_PLAYER,
MENU_SETTINGS_BIND_DEVICE,
MENU_SETTINGS_BIND_DEVICE_TYPE,
MENU_SETTINGS_BIND_ANALOG_MODE,
// Match up with libretro order for simplicity.

View File

@ -442,10 +442,8 @@ int menu_entries_push_list(menu_handle_t *menu,
file_list_clear(list);
file_list_push(list, "Player", "",
MENU_SETTINGS_BIND_PLAYER, 0);
file_list_push(list, "Device", "",
MENU_SETTINGS_BIND_DEVICE, 0);
file_list_push(list, "Device Type", "",
MENU_SETTINGS_BIND_DEVICE_TYPE, 0);
file_list_push(list, "Device", "input_bind_device_id", 0, 0);
file_list_push(list, "Device Type", "input_bind_device_type", 0, 0);
file_list_push(list, "Analog D-pad Mode", "",
MENU_SETTINGS_BIND_ANALOG_MODE, 0);
add_setting_entry(menu,list,"input_axis_threshold", 0, setting_data);

View File

@ -1507,6 +1507,20 @@ int setting_data_get_description(const char *label, char *msg,
else if (!strcmp(label, "menu_toggle"))
snprintf(msg, sizeof_msg,
" -- Toggles menu.");
else if (!strcmp(label, "input_bind_device_id"))
snprintf(msg, sizeof_msg,
" -- Input Device. \n"
" \n"
"Picks which gamepad to use for player N. \n"
"The name of the pad is available."
);
else if (!strcmp(label, "input_bind_device_type"))
snprintf(msg, sizeof_msg,
" -- Input Device Type. \n"
" \n"
"Picks which device type to use. This is \n"
"relevant for the libretro core itself."
);
else
snprintf(msg, sizeof_msg,
"-- No info on this item is available. --\n");
@ -1732,6 +1746,58 @@ void setting_data_get_label(char *type_str,
driver.menu->shader, type_str, type_str_size,
menu_label, label, type);
}
else if (!strcmp(label, "input_bind_device_id"))
{
int map = g_settings.input.joypad_map
[driver.menu->current_pad];
if (map >= 0 && map < MAX_PLAYERS)
{
const char *device_name =
g_settings.input.device_names[map];
if (*device_name)
strlcpy(type_str, device_name, type_str_size);
else
snprintf(type_str, type_str_size,
"N/A (port #%d)", map);
}
else
strlcpy(type_str, "Disabled", type_str_size);
}
else if (!strcmp(label, "input_bind_device_type"))
{
const struct retro_controller_description *desc = NULL;
if (driver.menu->current_pad < g_extern.system.num_ports)
desc = libretro_find_controller_description(
&g_extern.system.ports[driver.menu->current_pad],
g_settings.input.libretro_device
[driver.menu->current_pad]);
const char *name = desc ? desc->desc : NULL;
if (!name)
{
/* Find generic name. */
switch (g_settings.input.libretro_device
[driver.menu->current_pad])
{
case RETRO_DEVICE_NONE:
name = "None";
break;
case RETRO_DEVICE_JOYPAD:
name = "RetroPad";
break;
case RETRO_DEVICE_ANALOG:
name = "RetroPad w/ Analog";
break;
default:
name = "Unknown";
break;
}
}
strlcpy(type_str, name, type_str_size);
}
else if (type >= MENU_SETTINGS_PERF_COUNTERS_BEGIN
&& type <= MENU_SETTINGS_PERF_COUNTERS_END)
menu_common_setting_set_label_perf(type_str, type_str_size, w, type,
@ -1806,25 +1872,6 @@ void setting_data_get_label(char *type_str,
snprintf(type_str, type_str_size, "#%u",
driver.menu->current_pad + 1);
break;
case MENU_SETTINGS_BIND_DEVICE:
{
int map = g_settings.input.joypad_map
[driver.menu->current_pad];
if (map >= 0 && map < MAX_PLAYERS)
{
const char *device_name =
g_settings.input.device_names[map];
if (*device_name)
strlcpy(type_str, device_name, type_str_size);
else
snprintf(type_str, type_str_size,
"N/A (port #%d)", map);
}
else
strlcpy(type_str, "Disabled", type_str_size);
}
break;
case MENU_SETTINGS_BIND_ANALOG_MODE:
{
static const char *modes[] = {
@ -1839,41 +1886,6 @@ void setting_data_get_label(char *type_str,
type_str_size);
}
break;
case MENU_SETTINGS_BIND_DEVICE_TYPE:
{
const struct retro_controller_description *desc = NULL;
if (driver.menu->current_pad < g_extern.system.num_ports)
desc = libretro_find_controller_description(
&g_extern.system.ports[driver.menu->current_pad],
g_settings.input.libretro_device
[driver.menu->current_pad]);
const char *name = desc ? desc->desc : NULL;
if (!name)
{
/* Find generic name. */
switch (g_settings.input.libretro_device
[driver.menu->current_pad])
{
case RETRO_DEVICE_NONE:
name = "None";
break;
case RETRO_DEVICE_JOYPAD:
name = "RetroPad";
break;
case RETRO_DEVICE_ANALOG:
name = "RetroPad w/ Analog";
break;
default:
name = "Unknown";
break;
}
}
strlcpy(type_str, name, type_str_size);
}
break;
case MENU_SETTINGS_CUSTOM_BIND_MODE:
strlcpy(type_str, driver.menu->bind_mode_keyboard ?
"RetroKeyboard" : "RetroPad", type_str_size);