diff --git a/input/android_input.c b/input/android_input.c index 185633614f..2aa6edc96c 100644 --- a/input/android_input.c +++ b/input/android_input.c @@ -477,7 +477,8 @@ static void handle_hotplug(android_input_t *android, { strlcpy(g_settings.input.device_names[*port], name_buf, sizeof(g_settings.input.device_names[*port])); - input_config_autoconfigure_joypad(*port, name_buf, android_joypad.ident); + /* TODO - implement VID/PID? */ + input_config_autoconfigure_joypad(*port, name_buf, 0, 0, android_joypad.ident); RARCH_LOG("Port %d: %s.\n", *port, name_buf); } diff --git a/input/android_input_joypad.c b/input/android_input_joypad.c index df4f369e7c..3341fbe622 100644 --- a/input/android_input_joypad.c +++ b/input/android_input_joypad.c @@ -30,8 +30,9 @@ static bool android_joypad_init(void) strlcpy(g_settings.input.device_names[autoconf_pad], android_joypad_name(autoconf_pad), sizeof(g_settings.input.device_names[autoconf_pad])); + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(autoconf_pad, - android_joypad_name(autoconf_pad), + android_joypad_name(autoconf_pad), 0, 0, android_joypad.ident); } diff --git a/input/dinput.c b/input/dinput.c index 07e17d1783..c2fd52247e 100644 --- a/input/dinput.c +++ b/input/dinput.c @@ -778,8 +778,9 @@ static BOOL CALLBACK enum_joypad_cb(const DIDEVICEINSTANCE *inst, void *p) strlcpy(g_settings.input.device_names[g_joypad_cnt], dinput_joypad_name(g_joypad_cnt), sizeof(g_settings.input.device_names[g_joypad_cnt])); + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(g_joypad_cnt, - dinput_joypad_name(g_joypad_cnt), + dinput_joypad_name(g_joypad_cnt), 0, 0, dinput_joypad.ident); } diff --git a/input/gx_input.c b/input/gx_input.c index a6aa01cc55..0bfc19f526 100644 --- a/input/gx_input.c +++ b/input/gx_input.c @@ -258,8 +258,10 @@ static void *gx_input_init(void) strlcpy(g_settings.input.device_names[autoconf_pad], gx_joypad_name_static(gx, autoconf_pad), sizeof(g_settings.input.device_names[autoconf_pad])); + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(autoconf_pad, gx_joypad_name_static(gx, autoconf_pad), + 0, 0, gx->joypad->ident); } @@ -279,8 +281,11 @@ static void handle_hotplug(void *data, unsigned port, uint32_t ptype) strlcpy(g_settings.input.device_names[port], gx_joypad_name(port), sizeof(g_settings.input.device_names[port])); + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(port, - gx_joypad_name(port), gx_joypad.ident); + gx_joypad_name(port), + 0, 0, + gx_joypad.ident); } static void gx_input_poll(void *data) diff --git a/input/input_autodetect.c b/input/input_autodetect.c index 20a60a400e..12816a3088 100644 --- a/input/input_autodetect.c +++ b/input/input_autodetect.c @@ -37,19 +37,23 @@ static void input_autoconfigure_joypad_conf(config_file_t *conf, static bool input_try_autoconfigure_joypad_from_conf(config_file_t *conf, unsigned index, const char *name, const char *driver, - bool block_osd_spam) + const char *vid, const char *pid, bool block_osd_spam) { if (!conf) return false; - char ident[1024], ident_idx[1024]; - char input_driver[1024]; - bool cond_found_idx, cond_found_general; + char ident[PATH_MAX], ident_idx[PATH_MAX]; + char input_driver[PATH_MAX], input_vid[PATH_MAX], + input_pid[PATH_MAX]; + bool cond_found_idx, cond_found_general, + cond_found_vid = false, cond_found_pid = false; *ident = *input_driver = '\0'; config_get_array(conf, "input_device", ident, sizeof(ident)); config_get_array(conf, "input_driver", input_driver, sizeof(input_driver)); + config_get_array(conf, "input_vendor_id", input_vid, sizeof(input_vid)); + config_get_array(conf, "input_product_id", input_pid, sizeof(input_pid)); snprintf(ident_idx, sizeof(ident_idx), "%s_p%u", ident, index); @@ -57,7 +61,17 @@ static bool input_try_autoconfigure_joypad_from_conf(config_file_t *conf, cond_found_idx = !strcmp(ident_idx, name); cond_found_general = !strcmp(ident, name) && !strcmp(driver, input_driver); + if (vid != 0) + cond_found_vid = !strcmp(vid, input_vid); + if (pid != 0) + cond_found_pid = !strcmp(vid, input_pid); + /* If Vendor ID and Product ID matches, we've found our + * entry. */ + if (cond_found_vid && cond_found_pid) + goto found; + + /* Check for name match. */ if (cond_found_idx) goto found; else if (cond_found_general) @@ -81,7 +95,8 @@ found: } void input_config_autoconfigure_joypad(unsigned index, - const char *name, const char *driver) + const char *name, const char *vid, const char *pid, + const char *driver) { size_t i; @@ -113,7 +128,7 @@ void input_config_autoconfigure_joypad(unsigned index, config_file_t *conf = (config_file_t*) config_file_new_from_string(input_builtin_autoconfs[i]); bool success = input_try_autoconfigure_joypad_from_conf(conf, - index, name, driver, block_osd_spam); + index, name, driver, vid, pid, block_osd_spam); config_file_free(conf); if (success) break; @@ -134,7 +149,7 @@ void input_config_autoconfigure_joypad(unsigned index, if (!conf) continue; bool success = input_try_autoconfigure_joypad_from_conf(conf, - index, name, driver, block_osd_spam); + index, name, driver, vid, pid, block_osd_spam); config_file_free(conf); if (success) break; diff --git a/input/input_autodetect.h b/input/input_autodetect.h index b890b041d9..56d2b35565 100644 --- a/input/input_autodetect.h +++ b/input/input_autodetect.h @@ -21,7 +21,8 @@ const struct retro_keybind *input_get_auto_bind(unsigned port, unsigned id); void input_config_autoconfigure_joypad(unsigned index, - const char *name, const char *driver); + const char *name, const char *vid, const char *pid, + const char *driver); extern const char* const input_builtin_autoconfs[]; diff --git a/input/linuxraw_joypad.c b/input/linuxraw_joypad.c index 7944fd99f7..098524e279 100644 --- a/input/linuxraw_joypad.c +++ b/input/linuxraw_joypad.c @@ -151,7 +151,8 @@ static void handle_plugged_pad(void) g_pads[index].fd = -1; *g_pads[index].ident = '\0'; - input_config_autoconfigure_joypad(index, NULL, NULL); + /* TODO - implement VID/PID? */ + input_config_autoconfigure_joypad(index, NULL, 0, 0, NULL); } } // Sometimes, device will be created before acess to it is established. @@ -162,7 +163,8 @@ static void handle_plugged_pad(void) bool ret = linuxraw_joypad_init_pad(path, &g_pads[index]); if (*g_pads[index].ident && ret) - input_config_autoconfigure_joypad(index, g_pads[index].ident, "linuxraw"); + /* TODO - implement VID/PID? */ + input_config_autoconfigure_joypad(index, g_pads[index].ident, 0, 0, "linuxraw"); } } } @@ -211,13 +213,14 @@ static bool linuxraw_joypad_init(void) char path[PATH_MAX]; snprintf(path, sizeof(path), "/dev/input/js%u", i); + /* TODO - implement VID/PID? */ if (linuxraw_joypad_init_pad(path, pad)) { - input_config_autoconfigure_joypad(i, pad->ident, "linuxraw"); + input_config_autoconfigure_joypad(i, pad->ident, 0, 0, "linuxraw"); poll_pad(pad); } else - input_config_autoconfigure_joypad(i, NULL, NULL); + input_config_autoconfigure_joypad(i, NULL, 0, 0, NULL); } g_notify = inotify_init(); diff --git a/input/ps3_input_joypad.c b/input/ps3_input_joypad.c index 72c252482e..715228c1de 100644 --- a/input/ps3_input_joypad.c +++ b/input/ps3_input_joypad.c @@ -28,8 +28,10 @@ static bool ps3_joypad_init(void) strlcpy(g_settings.input.device_names[autoconf_pad], "SixAxis Controller", sizeof(g_settings.input.device_names[autoconf_pad])); + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(autoconf_pad, ps3_joypad_name(autoconf_pad), + 0, 0, ps3_joypad.ident); } diff --git a/input/psp_input_joypad.c b/input/psp_input_joypad.c index 85d734cf3d..9e990d3236 100644 --- a/input/psp_input_joypad.c +++ b/input/psp_input_joypad.c @@ -28,8 +28,10 @@ static bool psp_joypad_init(void) strlcpy(g_settings.input.device_names[autoconf_pad], psp_joypad_name(autoconf_pad), sizeof(g_settings.input.device_names[autoconf_pad])); + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(autoconf_pad, psp_joypad_name(autoconf_pad), + 0, 0, psp_joypad.ident); } diff --git a/input/qnx_input.c b/input/qnx_input.c index 752737aa47..2341e49a8b 100644 --- a/input/qnx_input.c +++ b/input/qnx_input.c @@ -304,7 +304,9 @@ static void qnx_input_autodetect_gamepad(void *data, { strlcpy(g_settings.input.device_names[port], name_buf, sizeof(g_settings.input.device_names[port])); - input_config_autoconfigure_joypad(port, name_buf, qnx->joypad); + /* TODO - implement VID/PID? */ + input_config_autoconfigure_joypad(port, name_buf, 0, 0, + qnx->joypad); controller->port = port; qnx->port_device[port] = controller; diff --git a/input/qnx_input_joypad.c b/input/qnx_input_joypad.c index 90ed28fbf8..bef5bc8993 100644 --- a/input/qnx_input_joypad.c +++ b/input/qnx_input_joypad.c @@ -28,8 +28,11 @@ static bool qnx_joypad_init(void) { strlcpy(g_settings.input.device_names[autoconf_pad], "None", sizeof(g_settings.input.device_names[autoconf_pad])); + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(autoconf_pad, - qnx_joypad_name(autoconf_pad), qnx_joypad.ident); + qnx_joypad_name(autoconf_pad), + 0, 0, + qnx_joypad.ident); } return true; diff --git a/input/sdl_joypad.c b/input/sdl_joypad.c index 7df3d45581..0d37315c8b 100644 --- a/input/sdl_joypad.c +++ b/input/sdl_joypad.c @@ -117,7 +117,9 @@ static void pad_connect(unsigned id) } strlcpy(g_settings.input.device_names[id], pad_name(id), sizeof(g_settings.input.device_names[id])); - input_config_autoconfigure_joypad(id, pad_name(id), sdl_joypad.ident); + /* TODO - implement VID/PID? */ + input_config_autoconfigure_joypad(id, pad_name(id), + 0, 0, sdl_joypad.ident); RARCH_LOG("[SDL]: Joypad #%u connected: %s.\n", id, pad_name(id)); diff --git a/input/udev_joypad.c b/input/udev_joypad.c index f88a6cee07..6c3c63f3ec 100644 --- a/input/udev_joypad.c +++ b/input/udev_joypad.c @@ -301,8 +301,11 @@ static void free_pad(unsigned pad, bool hotplug) g_pads[pad].ident = g_settings.input.device_names[pad]; // Avoid autoconfig spam if we're reiniting driver. + /* TODO - implement VID/PID? */ if (hotplug) - input_config_autoconfigure_joypad(pad, NULL, NULL); + input_config_autoconfigure_joypad(pad, NULL, + 0, 0, + NULL); } static bool add_pad(unsigned p, int fd, const char *path) @@ -363,8 +366,11 @@ static bool add_pad(unsigned p, int fd, const char *path) pad->device = st.st_rdev; pad->fd = fd; pad->path = strdup(path); + + /* TODO - implement VID/PID? */ if (*pad->ident) - input_config_autoconfigure_joypad(p, pad->ident, "udev"); + input_config_autoconfigure_joypad(p, pad->ident, + 0, 0, "udev"); // Check for rumble features. unsigned long ffbit[NBITS(FF_MAX)] = {0}; diff --git a/input/winxinput_joypad.c b/input/winxinput_joypad.c index 1340a2ac66..ee6e7e40a6 100644 --- a/input/winxinput_joypad.c +++ b/input/winxinput_joypad.c @@ -231,8 +231,15 @@ static bool winxinput_joypad_init(void) { if (pad_index_to_xplayer_index(autoconf_pad) > -1) { - strlcpy(g_settings.input.device_names[autoconf_pad], winxinput_joypad_name(autoconf_pad), sizeof(g_settings.input.device_names[autoconf_pad])); - input_config_autoconfigure_joypad(autoconf_pad, winxinput_joypad_name(autoconf_pad), winxinput_joypad.ident); + strlcpy(g_settings.input.device_names[autoconf_pad], + winxinput_joypad_name(autoconf_pad), + sizeof(g_settings.input.device_names[autoconf_pad])); + + /* TODO - implement VID/PID? */ + input_config_autoconfigure_joypad(autoconf_pad, + winxinput_joypad_name(autoconf_pad), + 0, 0, + winxinput_joypad.ident); } } diff --git a/input/xdk_xinput_input_joypad.c b/input/xdk_xinput_input_joypad.c index 833e247202..1232040422 100644 --- a/input/xdk_xinput_input_joypad.c +++ b/input/xdk_xinput_input_joypad.c @@ -36,8 +36,12 @@ static bool xdk_joypad_init(void) strlcpy(g_settings.input.device_names[autoconf_pad], "XInput Controller", sizeof(g_settings.input.device_names[autoconf_pad])); + + /* TODO - implement VID/PID? */ input_config_autoconfigure_joypad(autoconf_pad, - xdk_joypad_name(autoconf_pad), xdk_joypad.ident); + xdk_joypad_name(autoconf_pad), + 0, 0, + xdk_joypad.ident); } return true; diff --git a/tools/retroarch-joyconfig.c b/tools/retroarch-joyconfig.c index bbcefb5b60..525584cfeb 100644 --- a/tools/retroarch-joyconfig.c +++ b/tools/retroarch-joyconfig.c @@ -431,7 +431,8 @@ static void parse_input(int argc, char *argv[]) } void input_config_autoconfigure_joypad(unsigned index, - const char *name, const char *driver) + const char *name, const char *vid, const char *pid, + const char *driver) { }