mirror of
https://github.com/libretro/RetroArch
synced 2025-02-03 17:54:04 +00:00
Hardcoded joypad config fallbacks, and required changes to config_file
This commit is contained in:
parent
14f3d11dc2
commit
8fd84fa46c
@ -17,6 +17,7 @@ OBJ = frontend/frontend.o \
|
|||||||
movie.o \
|
movie.o \
|
||||||
gfx/gfx_common.o \
|
gfx/gfx_common.o \
|
||||||
input/input_common.o \
|
input/input_common.o \
|
||||||
|
input/autoconf_builtin.o \
|
||||||
core_options.o \
|
core_options.o \
|
||||||
patch.o \
|
patch.o \
|
||||||
compat/compat.o \
|
compat/compat.o \
|
||||||
|
@ -355,6 +355,62 @@ static config_file_t *config_file_new_internal(const char *path, unsigned depth)
|
|||||||
return conf;
|
return conf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config_file_t *config_file_new_from_string(const char *from_string)
|
||||||
|
{
|
||||||
|
struct config_file *conf = (struct config_file*)calloc(1, sizeof(*conf));
|
||||||
|
if (!conf)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!from_string)
|
||||||
|
return conf;
|
||||||
|
|
||||||
|
conf->path = NULL;
|
||||||
|
|
||||||
|
conf->include_depth = 0;
|
||||||
|
|
||||||
|
size_t pos = 0;
|
||||||
|
size_t len = strlen(from_string);
|
||||||
|
|
||||||
|
while (pos < len)
|
||||||
|
{
|
||||||
|
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';
|
||||||
|
|
||||||
|
if (line)
|
||||||
|
{
|
||||||
|
if (parse_line(conf, list, line))
|
||||||
|
{
|
||||||
|
if (conf->entries)
|
||||||
|
{
|
||||||
|
conf->tail->next = list;
|
||||||
|
conf->tail = list;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
conf->entries = list;
|
||||||
|
conf->tail = list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list != conf->tail)
|
||||||
|
free(list);
|
||||||
|
|
||||||
|
pos += line_len + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
config_file_t *config_file_new(const char *path)
|
config_file_t *config_file_new(const char *path)
|
||||||
{
|
{
|
||||||
return config_file_new_internal(path, 0);
|
return config_file_new_internal(path, 0);
|
||||||
|
@ -41,6 +41,8 @@ typedef struct config_file config_file_t;
|
|||||||
// Loads a config file. Returns NULL if file doesn't exist.
|
// Loads a config file. Returns NULL if file doesn't exist.
|
||||||
// NULL path will create an empty config file.
|
// NULL path will create an empty config file.
|
||||||
config_file_t *config_file_new(const char *path);
|
config_file_t *config_file_new(const char *path);
|
||||||
|
// Load a config file from a string.
|
||||||
|
config_file_t *config_file_new_from_string(const char *from_string);
|
||||||
// Frees config file.
|
// Frees config file.
|
||||||
void config_file_free(config_file_t *conf);
|
void config_file_free(config_file_t *conf);
|
||||||
|
|
||||||
|
153
input/autoconf_builtin.c
Normal file
153
input/autoconf_builtin.c
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#include "input_common.h"
|
||||||
|
|
||||||
|
// 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 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 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 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 = \"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\
|
||||||
|
",
|
||||||
|
|
||||||
|
NULL
|
||||||
|
};
|
@ -829,15 +829,50 @@ void input_config_autoconfigure_joypad(unsigned index, const char *name, const c
|
|||||||
if (!name)
|
if (!name)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!*g_settings.input.autoconfig_dir)
|
// false = load from both cfg files and internal
|
||||||
return;
|
bool internal_only = (!*g_settings.input.autoconfig_dir);
|
||||||
|
|
||||||
struct string_list *list = dir_list_new(g_settings.input.autoconfig_dir, "cfg", false);
|
|
||||||
if (!list)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char ident[1024];
|
char ident[1024];
|
||||||
char input_driver[1024];
|
char input_driver[1024];
|
||||||
|
|
||||||
|
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);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
config_file_free(conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct string_list *list = dir_list_new(g_settings.input.autoconfig_dir, "cfg", false);
|
||||||
|
if ((!list) && (!internal_only))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!internal_only)
|
||||||
|
{
|
||||||
for (size_t i = 0; i < list->size; i++)
|
for (size_t i = 0; i < list->size; i++)
|
||||||
{
|
{
|
||||||
*ident = *input_driver = '\0';
|
*ident = *input_driver = '\0';
|
||||||
@ -868,6 +903,8 @@ void input_config_autoconfigure_joypad(unsigned index, const char *name, const c
|
|||||||
else
|
else
|
||||||
config_file_free(conf);
|
config_file_free(conf);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
string_list_free(list);
|
string_list_free(list);
|
||||||
}
|
}
|
||||||
|
@ -135,6 +135,8 @@ struct input_key_map
|
|||||||
};
|
};
|
||||||
extern const struct input_key_map input_config_key_map[];
|
extern const struct input_key_map input_config_key_map[];
|
||||||
|
|
||||||
|
extern const char* const input_builtin_autoconfs[];
|
||||||
|
|
||||||
const char *input_config_get_prefix(unsigned player, bool meta);
|
const char *input_config_get_prefix(unsigned player, bool meta);
|
||||||
|
|
||||||
void input_config_parse_key(config_file_t *conf, const char *prefix, const char *btn,
|
void input_config_parse_key(config_file_t *conf, const char *prefix, const char *btn,
|
||||||
|
@ -254,6 +254,8 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\input\input_common.c">
|
<ClCompile Include="..\..\input\input_common.c">
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\input\autoconf_builtin.c">
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\message.c">
|
<ClCompile Include="..\..\message.c">
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\movie.c">
|
<ClCompile Include="..\..\movie.c">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user