mirror of
https://github.com/CTCaer/RetroArch.git
synced 2025-01-19 01:12:33 +00:00
Various fixups to the internal autoconf system
This commit is contained in:
parent
8fd84fa46c
commit
50e4dfb57c
@ -365,23 +365,17 @@ config_file_t *config_file_new_from_string(const char *from_string)
|
||||
return conf;
|
||||
|
||||
conf->path = NULL;
|
||||
|
||||
conf->include_depth = 0;
|
||||
|
||||
size_t pos = 0;
|
||||
size_t len = strlen(from_string);
|
||||
struct string_list *lines = string_split(from_string, "\n");
|
||||
if (!lines)
|
||||
return conf;
|
||||
|
||||
while (pos < len)
|
||||
for (size_t i = 0; i < lines->size; i++)
|
||||
{
|
||||
struct config_entry_list *list = (struct config_entry_list*)calloc(1, sizeof(*list));
|
||||
|
||||
size_t next_newline_pos = strchr(from_string + pos, '\n') - (char*)from_string;
|
||||
if (next_newline_pos > len)
|
||||
next_newline_pos = len;
|
||||
size_t line_len = next_newline_pos - pos;
|
||||
char *line = (char*)malloc(line_len + 1);
|
||||
strncpy(line, from_string+pos, line_len);
|
||||
line[line_len] = '\0';
|
||||
char* line = lines->elems[i].data;
|
||||
|
||||
if (line)
|
||||
{
|
||||
@ -398,15 +392,13 @@ config_file_t *config_file_new_from_string(const char *from_string)
|
||||
conf->tail = list;
|
||||
}
|
||||
}
|
||||
|
||||
free(line);
|
||||
}
|
||||
|
||||
if (list != conf->tail)
|
||||
free(list);
|
||||
|
||||
pos += line_len + 1;
|
||||
}
|
||||
|
||||
string_list_free(lines);
|
||||
|
||||
return conf;
|
||||
}
|
||||
|
@ -1,153 +1,80 @@
|
||||
#include "input_common.h"
|
||||
|
||||
#define DECL_BTN(btn, bind) "input_" #btn "_btn = " #bind "\n"
|
||||
#define DECL_AXIS(axis, bind) "input_" #axis "_axis = " #bind "\n"
|
||||
|
||||
#define XINPUT_DEFAULT_BINDS \
|
||||
DECL_BTN(a,1)\
|
||||
DECL_BTN(b,0)\
|
||||
DECL_BTN(x,3)\
|
||||
DECL_BTN(y,2)\
|
||||
DECL_BTN(start, 6)\
|
||||
DECL_BTN(select,7)\
|
||||
DECL_BTN(up,h0up)\
|
||||
DECL_BTN(down,h0down)\
|
||||
DECL_BTN(left,h0left)\
|
||||
DECL_BTN(right,h0right)\
|
||||
DECL_BTN(l, 4)\
|
||||
DECL_BTN(r, 5)\
|
||||
DECL_BTN(l3,8)\
|
||||
DECL_BTN(r3,9)\
|
||||
DECL_AXIS(l2, +4)\
|
||||
DECL_AXIS(r2, +5)\
|
||||
DECL_AXIS(l_x_plus, +0)\
|
||||
DECL_AXIS(l_x_minus, -0)\
|
||||
DECL_AXIS(l_y_plus, -1)\
|
||||
DECL_AXIS(l_y_minus, +1)\
|
||||
DECL_AXIS(r_x_plus, +2)\
|
||||
DECL_AXIS(r_x_minus, -2)\
|
||||
DECL_AXIS(r_y_plus, -3)\
|
||||
DECL_AXIS(r_y_minus, +3)
|
||||
|
||||
// Some hardcoded autoconfig information. Will be used for pads with no autoconfig cfg files.
|
||||
// All 4 almost-identical 360 pads are included, could be reduced with some fiddling.
|
||||
const char* const input_builtin_autoconfs[] =
|
||||
{
|
||||
"\
|
||||
input_device = \"XInput Controller (Player 1)\" \n\
|
||||
input_driver = \"winxinput\" \n\
|
||||
input_b_btn = \"0\" \n\
|
||||
input_y_btn = \"2\" \n\
|
||||
input_select_btn = \"7\" \n\
|
||||
input_start_btn = \"6\" \n\
|
||||
input_up_btn = \"h0up\" \n\
|
||||
input_down_btn = \"h0down\" \n\
|
||||
input_left_btn = \"h0left\" \n\
|
||||
input_right_btn = \"h0right\" \n\
|
||||
input_a_btn = \"1\" \n\
|
||||
input_x_btn = \"3\" \n\
|
||||
input_l_btn = \"4\" \n\
|
||||
input_r_btn = \"5\" \n\
|
||||
input_l2_axis = \"+4\" \n\
|
||||
input_r2_axis = \"+5\" \n\
|
||||
input_l3_btn = \"8\" \n\
|
||||
input_r3_btn = \"9\" \n\
|
||||
input_l_x_plus_axis = \"+0\" \n\
|
||||
input_l_x_minus_axis = \"-0\" \n\
|
||||
input_l_y_plus_axis = \"-1\" \n\
|
||||
input_l_y_minus_axis = \"+1\" \n\
|
||||
input_r_x_plus_axis = \"+2\" \n\
|
||||
input_r_x_minus_axis = \"-2\" \n\
|
||||
input_r_y_plus_axis = \"-3\" \n\
|
||||
input_r_y_minus_axis = \"+3\" \n\
|
||||
",
|
||||
"input_device = \"XInput Controller (Player 1)\" \n"
|
||||
"input_driver = \"winxinput\" \n"
|
||||
XINPUT_DEFAULT_BINDS,
|
||||
|
||||
"\
|
||||
input_device = \"XInput Controller (Player 2)\" \n\
|
||||
input_driver = \"winxinput\" \n\
|
||||
input_b_btn = \"0\" \n\
|
||||
input_y_btn = \"2\" \n\
|
||||
input_select_btn = \"7\" \n\
|
||||
input_start_btn = \"6\" \n\
|
||||
input_up_btn = \"h0up\" \n\
|
||||
input_down_btn = \"h0down\" \n\
|
||||
input_left_btn = \"h0left\" \n\
|
||||
input_right_btn = \"h0right\" \n\
|
||||
input_a_btn = \"1\" \n\
|
||||
input_x_btn = \"3\" \n\
|
||||
input_l_btn = \"4\" \n\
|
||||
input_r_btn = \"5\" \n\
|
||||
input_l2_axis = \"+4\" \n\
|
||||
input_r2_axis = \"+5\" \n\
|
||||
input_l3_btn = \"8\" \n\
|
||||
input_r3_btn = \"9\" \n\
|
||||
input_l_x_plus_axis = \"+0\" \n\
|
||||
input_l_x_minus_axis = \"-0\" \n\
|
||||
input_l_y_plus_axis = \"-1\" \n\
|
||||
input_l_y_minus_axis = \"+1\" \n\
|
||||
input_r_x_plus_axis = \"+2\" \n\
|
||||
input_r_x_minus_axis = \"-2\" \n\
|
||||
input_r_y_plus_axis = \"-3\" \n\
|
||||
input_r_y_minus_axis = \"+3\" \n\
|
||||
",
|
||||
"input_device = \"XInput Controller (Player 2)\" \n"
|
||||
"input_driver = \"winxinput\" \n"
|
||||
XINPUT_DEFAULT_BINDS,
|
||||
|
||||
"\
|
||||
input_device = \"XInput Controller (Player 3)\" \n\
|
||||
input_driver = \"winxinput\" \n\
|
||||
input_b_btn = \"0\" \n\
|
||||
input_y_btn = \"2\" \n\
|
||||
input_select_btn = \"7\" \n\
|
||||
input_start_btn = \"6\" \n\
|
||||
input_up_btn = \"h0up\" \n\
|
||||
input_down_btn = \"h0down\" \n\
|
||||
input_left_btn = \"h0left\" \n\
|
||||
input_right_btn = \"h0right\" \n\
|
||||
input_a_btn = \"1\" \n\
|
||||
input_x_btn = \"3\" \n\
|
||||
input_l_btn = \"4\" \n\
|
||||
input_r_btn = \"5\" \n\
|
||||
input_l2_axis = \"+4\" \n\
|
||||
input_r2_axis = \"+5\" \n\
|
||||
input_l3_btn = \"8\" \n\
|
||||
input_r3_btn = \"9\" \n\
|
||||
input_l_x_plus_axis = \"+0\" \n\
|
||||
input_l_x_minus_axis = \"-0\" \n\
|
||||
input_l_y_plus_axis = \"-1\" \n\
|
||||
input_l_y_minus_axis = \"+1\" \n\
|
||||
input_r_x_plus_axis = \"+2\" \n\
|
||||
input_r_x_minus_axis = \"-2\" \n\
|
||||
input_r_y_plus_axis = \"-3\" \n\
|
||||
input_r_y_minus_axis = \"+3\" \n\
|
||||
",
|
||||
"input_device = \"XInput Controller (Player 3)\" \n"
|
||||
"input_driver = \"winxinput\" \n"
|
||||
XINPUT_DEFAULT_BINDS,
|
||||
|
||||
"\
|
||||
input_device = \"XInput Controller (Player 4)\" \n\
|
||||
input_driver = \"winxinput\" \n\
|
||||
input_b_btn = \"0\" \n\
|
||||
input_y_btn = \"2\" \n\
|
||||
input_select_btn = \"7\" \n\
|
||||
input_start_btn = \"6\" \n\
|
||||
input_up_btn = \"h0up\" \n\
|
||||
input_down_btn = \"h0down\" \n\
|
||||
input_left_btn = \"h0left\" \n\
|
||||
input_right_btn = \"h0right\" \n\
|
||||
input_a_btn = \"1\" \n\
|
||||
input_x_btn = \"3\" \n\
|
||||
input_l_btn = \"4\" \n\
|
||||
input_r_btn = \"5\" \n\
|
||||
input_l2_axis = \"+4\" \n\
|
||||
input_r2_axis = \"+5\" \n\
|
||||
input_l3_btn = \"8\" \n\
|
||||
input_r3_btn = \"9\" \n\
|
||||
input_l_x_plus_axis = \"+0\" \n\
|
||||
input_l_x_minus_axis = \"-0\" \n\
|
||||
input_l_y_plus_axis = \"-1\" \n\
|
||||
input_l_y_minus_axis = \"+1\" \n\
|
||||
input_r_x_plus_axis = \"+2\" \n\
|
||||
input_r_x_minus_axis = \"-2\" \n\
|
||||
input_r_y_plus_axis = \"-3\" \n\
|
||||
input_r_y_minus_axis = \"+3\" \n\
|
||||
",
|
||||
"input_device = \"XInput Controller (Player 4)\" \n"
|
||||
"input_driver = \"winxinput\" \n"
|
||||
XINPUT_DEFAULT_BINDS,
|
||||
|
||||
"\
|
||||
input_device = \"Dual Trigger 3-in-1\" \n\
|
||||
input_driver = \"dinput\" \n\
|
||||
input_b_btn = \"1\" \n\
|
||||
input_y_btn = \"0\" \n\
|
||||
input_select_btn = \"8\" \n\
|
||||
input_start_btn = \"9\" \n\
|
||||
input_up_btn = \"h0up\" \n\
|
||||
input_down_btn = \"h0down\" \n\
|
||||
input_left_btn = \"h0left\" \n\
|
||||
input_right_btn = \"h0right\" \n\
|
||||
input_a_btn = \"2\" \n\
|
||||
input_x_btn = \"3\" \n\
|
||||
input_l_btn = \"4\" \n\
|
||||
input_r_btn = \"5\" \n\
|
||||
input_l2_btn = \"6\" \n\
|
||||
input_r2_btn = \"7\" \n\
|
||||
input_l3_btn = \"10\" \n\
|
||||
input_r3_btn = \"11\" \n\
|
||||
input_l_x_plus_axis = \"+0\" \n\
|
||||
input_l_x_minus_axis = \"-0\" \n\
|
||||
input_l_y_plus_axis = \"+1\" \n\
|
||||
input_l_y_minus_axis = \"-1\" \n\
|
||||
input_r_x_plus_axis = \"+2\" \n\
|
||||
input_r_x_minus_axis = \"-2\" \n\
|
||||
input_r_y_plus_axis = \"+5\" \n\
|
||||
input_r_y_minus_axis = \"-5\" \n\
|
||||
",
|
||||
"input_device = \"Dual Trigger 3-in-1\" \n"
|
||||
"input_driver = \"dinput\" \n"
|
||||
DECL_BTN(a,2)
|
||||
DECL_BTN(b,1)
|
||||
DECL_BTN(x,3)
|
||||
DECL_BTN(y,0)
|
||||
DECL_BTN(start, 9)
|
||||
DECL_BTN(select,8)
|
||||
DECL_BTN(up,h0up)
|
||||
DECL_BTN(down,h0down)
|
||||
DECL_BTN(left,h0left)
|
||||
DECL_BTN(right,h0right)
|
||||
DECL_BTN(l, 4)
|
||||
DECL_BTN(r, 5)
|
||||
DECL_BTN(l2, 6)
|
||||
DECL_BTN(r2, 7)
|
||||
DECL_BTN(l3,10)
|
||||
DECL_BTN(r3,11)
|
||||
DECL_AXIS(l_x_plus, +0)
|
||||
DECL_AXIS(l_x_minus, -0)
|
||||
DECL_AXIS(l_y_plus, +1)
|
||||
DECL_AXIS(l_y_minus, -1)
|
||||
DECL_AXIS(r_x_plus, +2)
|
||||
DECL_AXIS(r_x_minus, -2)
|
||||
DECL_AXIS(r_y_plus, +5)
|
||||
DECL_AXIS(r_y_minus, -5)
|
||||
,
|
||||
|
||||
NULL
|
||||
};
|
||||
|
@ -810,6 +810,38 @@ static void input_autoconfigure_joypad_conf(config_file_t *conf, struct retro_ke
|
||||
}
|
||||
}
|
||||
|
||||
static bool input_try_autoconfigure_joypad_from_conf(config_file_t *conf, unsigned index, const char *name, const char *driver, bool block_osd_spam)
|
||||
{
|
||||
if (!conf)
|
||||
return false;
|
||||
|
||||
char ident[1024];
|
||||
char input_driver[1024];
|
||||
|
||||
*ident = *input_driver = '\0';
|
||||
|
||||
config_get_array(conf, "input_device", ident, sizeof(ident));
|
||||
config_get_array(conf, "input_driver", input_driver, sizeof(input_driver));
|
||||
|
||||
if (!strcmp(ident, name) && !strcmp(driver, input_driver))
|
||||
{
|
||||
g_settings.input.autoconfigured[index] = true;
|
||||
input_autoconfigure_joypad_conf(conf, g_settings.input.autoconf_binds[index]);
|
||||
|
||||
char msg[512];
|
||||
snprintf(msg, sizeof(msg), "Joypad port #%u (%s) configured.",
|
||||
index, name);
|
||||
|
||||
if (!block_osd_spam)
|
||||
msg_queue_push(g_extern.msg_queue, msg, 0, 60);
|
||||
RARCH_LOG("%s\n", msg);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void input_config_autoconfigure_joypad(unsigned index, const char *name, const char *driver)
|
||||
{
|
||||
if (!g_settings.input.autodetect_enable)
|
||||
@ -832,80 +864,35 @@ void input_config_autoconfigure_joypad(unsigned index, const char *name, const c
|
||||
// false = load from both cfg files and internal
|
||||
bool internal_only = (!*g_settings.input.autoconfig_dir);
|
||||
|
||||
char ident[1024];
|
||||
char input_driver[1024];
|
||||
|
||||
// First internal
|
||||
for (size_t i = 0; input_builtin_autoconfs[i] /* array is NULL terminated */; i++)
|
||||
{
|
||||
*ident = *input_driver = '\0';
|
||||
|
||||
config_file_t *conf = config_file_new_from_string(input_builtin_autoconfs[i]);
|
||||
if (!conf)
|
||||
continue;
|
||||
|
||||
config_get_array(conf, "input_device", ident, sizeof(ident));
|
||||
config_get_array(conf, "input_driver", input_driver, sizeof(input_driver));
|
||||
|
||||
|
||||
if (!strcmp(ident, name) && !strcmp(driver, input_driver))
|
||||
{
|
||||
g_settings.input.autoconfigured[index] = true;
|
||||
input_autoconfigure_joypad_conf(conf, g_settings.input.autoconf_binds[index]);
|
||||
|
||||
char msg[512];
|
||||
snprintf(msg, sizeof(msg), "Joypad port #%u (%s) configured.",
|
||||
index, name);
|
||||
|
||||
if (!block_osd_spam)
|
||||
msg_queue_push(g_extern.msg_queue, msg, 0, 60);
|
||||
RARCH_LOG("%s\n", msg);
|
||||
|
||||
config_file_free(conf);
|
||||
bool success = input_try_autoconfigure_joypad_from_conf(conf, index, name, driver, block_osd_spam);
|
||||
config_file_free(conf);
|
||||
if (success)
|
||||
break;
|
||||
}
|
||||
else
|
||||
config_file_free(conf);
|
||||
}
|
||||
|
||||
// Now try files
|
||||
struct string_list *list = dir_list_new(g_settings.input.autoconfig_dir, "cfg", false);
|
||||
if ((!list) && (!internal_only))
|
||||
if (!list)
|
||||
return;
|
||||
|
||||
if (!internal_only)
|
||||
{
|
||||
for (size_t i = 0; i < list->size; i++)
|
||||
{
|
||||
*ident = *input_driver = '\0';
|
||||
|
||||
config_file_t *conf = config_file_new(list->elems[i].data);
|
||||
if (!conf)
|
||||
continue;
|
||||
|
||||
config_get_array(conf, "input_device", ident, sizeof(ident));
|
||||
config_get_array(conf, "input_driver", input_driver, sizeof(input_driver));
|
||||
|
||||
if (!strcmp(ident, name) && !strcmp(driver, input_driver))
|
||||
{
|
||||
g_settings.input.autoconfigured[index] = true;
|
||||
input_autoconfigure_joypad_conf(conf, g_settings.input.autoconf_binds[index]);
|
||||
|
||||
char msg[512];
|
||||
snprintf(msg, sizeof(msg), "Joypad port #%u (%s) configured.",
|
||||
index, name);
|
||||
|
||||
if (!block_osd_spam)
|
||||
msg_queue_push(g_extern.msg_queue, msg, 0, 60);
|
||||
RARCH_LOG("%s\n", msg);
|
||||
|
||||
config_file_free(conf);
|
||||
bool success = input_try_autoconfigure_joypad_from_conf(conf, index, name, driver, block_osd_spam);
|
||||
config_file_free(conf);
|
||||
if (success)
|
||||
break;
|
||||
}
|
||||
else
|
||||
config_file_free(conf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
string_list_free(list);
|
||||
}
|
||||
#else
|
||||
|
Loading…
x
Reference in New Issue
Block a user