From 8fd84fa46cb2f1a0bb1c179f55ce9428ce249b59 Mon Sep 17 00:00:00 2001
From: pinumbernumber <1337rz@gmail.com>
Date: Wed, 4 Sep 2013 21:57:13 +0100
Subject: [PATCH] Hardcoded joypad config fallbacks, and required changes to
config_file
---
Makefile.win | 1 +
conf/config_file.c | 56 ++++++++
conf/config_file.h | 2 +
input/autoconf_builtin.c | 153 ++++++++++++++++++++++
input/input_common.c | 53 ++++++--
input/input_common.h | 2 +
msvc/msvc-2010/RetroArch-msvc2010.vcxproj | 2 +
7 files changed, 261 insertions(+), 8 deletions(-)
create mode 100644 input/autoconf_builtin.c
diff --git a/Makefile.win b/Makefile.win
index 635e573ff4..f4ea879abf 100644
--- a/Makefile.win
+++ b/Makefile.win
@@ -17,6 +17,7 @@ OBJ = frontend/frontend.o \
movie.o \
gfx/gfx_common.o \
input/input_common.o \
+ input/autoconf_builtin.o \
core_options.o \
patch.o \
compat/compat.o \
diff --git a/conf/config_file.c b/conf/config_file.c
index 8fcbd92ceb..7ecf97e60a 100644
--- a/conf/config_file.c
+++ b/conf/config_file.c
@@ -355,6 +355,62 @@ static config_file_t *config_file_new_internal(const char *path, unsigned depth)
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)
{
return config_file_new_internal(path, 0);
diff --git a/conf/config_file.h b/conf/config_file.h
index 8ae7554181..ad366e84ca 100644
--- a/conf/config_file.h
+++ b/conf/config_file.h
@@ -41,6 +41,8 @@ typedef struct config_file config_file_t;
// Loads a config file. Returns NULL if file doesn't exist.
// NULL path will create an empty config file.
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.
void config_file_free(config_file_t *conf);
diff --git a/input/autoconf_builtin.c b/input/autoconf_builtin.c
new file mode 100644
index 0000000000..fea7a4ce91
--- /dev/null
+++ b/input/autoconf_builtin.c
@@ -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
+};
diff --git a/input/input_common.c b/input/input_common.c
index fb799e3884..52b1f2a67f 100644
--- a/input/input_common.c
+++ b/input/input_common.c
@@ -829,25 +829,23 @@ void input_config_autoconfigure_joypad(unsigned index, const char *name, const c
if (!name)
return;
- if (!*g_settings.input.autoconfig_dir)
- return;
-
- struct string_list *list = dir_list_new(g_settings.input.autoconfig_dir, "cfg", false);
- if (!list)
- return;
+ // false = load from both cfg files and internal
+ bool internal_only = (!*g_settings.input.autoconfig_dir);
char ident[1024];
char input_driver[1024];
- for (size_t i = 0; i < list->size; i++)
+
+ 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(list->elems[i].data);
+ 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))
{
@@ -868,6 +866,45 @@ void input_config_autoconfigure_joypad(unsigned index, const char *name, const c
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++)
+ {
+ *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);
+ break;
+ }
+ else
+ config_file_free(conf);
+ }
+ }
+
string_list_free(list);
}
diff --git a/input/input_common.h b/input/input_common.h
index dc118ff4e1..ffc08d99a3 100644
--- a/input/input_common.h
+++ b/input/input_common.h
@@ -135,6 +135,8 @@ struct input_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);
void input_config_parse_key(config_file_t *conf, const char *prefix, const char *btn,
diff --git a/msvc/msvc-2010/RetroArch-msvc2010.vcxproj b/msvc/msvc-2010/RetroArch-msvc2010.vcxproj
index 45bbb6b6cd..9ebc1423fc 100644
--- a/msvc/msvc-2010/RetroArch-msvc2010.vcxproj
+++ b/msvc/msvc-2010/RetroArch-msvc2010.vcxproj
@@ -254,6 +254,8 @@
+
+