From b165b8fa82a9a1ea6f9c6501570d0af5f7bcb874 Mon Sep 17 00:00:00 2001 From: Mike Robinson Date: Fri, 3 Oct 2014 01:40:47 +0100 Subject: [PATCH 1/2] Fix joypad driver setting input_common.c was loading the first available joypad driver no matter what input driver was selected, and the joypad driver menu was non-functional. Allow choice of joypad driver from the menu. --- config.def.h | 41 +++++++++++++++++++++++++++++++++++++++++ driver.c | 7 ++++++- driver.h | 2 ++ general.h | 1 + input/input_common.c | 2 +- settings.c | 41 +++++++++++++++++++++++++++++++++++++++++ settings_data.c | 2 +- 7 files changed, 93 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index 6ccd861128..35f115b872 100644 --- a/config.def.h +++ b/config.def.h @@ -87,6 +87,19 @@ enum INPUT_RWEBINPUT, INPUT_NULL, + JOYPAD_PS3, + JOYPAD_WINXINPUT, + JOYPAD_GX, + JOYPAD_XDK, + JOYPAD_PSP, + JOYPAD_DINPUT, + JOYPAD_UDEV, + JOYPAD_LINUXRAW, + JOYPAD_ANDROID, + JOYPAD_SDL, + JOYPAD_APPLE, + JOYPAD_QNX, + CAMERA_V4L2, CAMERA_RWEBCAM, CAMERA_ANDROID, @@ -221,6 +234,34 @@ enum #define INPUT_DEFAULT_DRIVER INPUT_NULL #endif +#if defined(__CELLOS_LV2__) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_PS3 +#elif defined(HAVE_WINXINPUT) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_WINXINPUT +#elif defined(GEKKO) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_GX +#elif defined(_XBOX) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_XDK +#elif defined(PSP) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_PSP +#elif defined(HAVE_DINPUT) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_DINPUT +#elif defined(HAVE_UDEV) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_UDEV +#elif defined(__linux) && !defined(ANDROID) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_LINUXRAW +#elif defined(ANDROID) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_ANDROID +#elif defined(HAVE_SDL) || defined(HAVE_SDL2) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_SDL +#elif defined(__MACH__) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_APPLE +#elif defined(__QNX__) +#define JOYPAD_DEFAULT_DRIVER JOYPAD_QNX +#else +#define JOYPAD_DEFAULT_DRIVER JOYPAD_NULL +#endif + #if defined(HAVE_V4L2) #define CAMERA_DEFAULT_DRIVER CAMERA_V4L2 #elif defined(EMSCRIPTEN) diff --git a/driver.c b/driver.c index b72b851694..88fa212f25 100644 --- a/driver.c +++ b/driver.c @@ -284,6 +284,12 @@ static const void *find_driver_nonempty(const char *label, int i, if (driver) strlcpy(str, input_drivers[i]->ident, sizeof_str); } + else if (!strcmp(label, "input_joypad_driver")) + { + driver = joypad_drivers[i]; + if (driver) + strlcpy(str, joypad_drivers[i]->ident, sizeof_str); + } else if (!strcmp(label, "video_driver")) { driver = video_drivers[i]; @@ -694,7 +700,6 @@ static void find_input_driver(void) } } - void init_drivers_pre(void) { find_audio_driver(); diff --git a/driver.h b/driver.h index 6dacf3ba83..2c720e0407 100644 --- a/driver.h +++ b/driver.h @@ -690,6 +690,8 @@ extern menu_ctx_driver_t menu_ctx_lakka; extern menu_ctx_driver_backend_t menu_ctx_backend_common; extern menu_ctx_driver_backend_t menu_ctx_backend_lakka; +extern rarch_joypad_driver_t *joypad_drivers[]; + #define check_netplay_flip_func(trigger_input) check_netplay_flip(BIND_PRESSED(trigger_input, RARCH_NETPLAY_FLIP), BIND_PRESSED(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY)) #define check_overlay_func(input, old_input) rarch_check_overlay(BIND_PRESSED(input, RARCH_OVERLAY_NEXT), BIND_PRESSED(old_input, RARCH_OVERLAY_NEXT)) #define check_oneshot_func(trigger_input) check_oneshot(BIND_PRESSED(trigger_input, RARCH_FRAMEADVANCE), BIND_PRESSED(trigger_input, RARCH_REWIND)) diff --git a/general.h b/general.h index a232f5876b..ea16f3cc06 100644 --- a/general.h +++ b/general.h @@ -769,6 +769,7 @@ const char *config_get_default_video(void); const char *config_get_default_audio(void); const char *config_get_default_audio_resampler(void); const char *config_get_default_input(void); +const char *config_get_default_joypad(void); #ifdef HAVE_MENU const char *config_get_default_menu(void); #endif diff --git a/input/input_common.c b/input/input_common.c index 9f72980d12..9b6e665b47 100644 --- a/input/input_common.c +++ b/input/input_common.c @@ -46,7 +46,7 @@ #include "../file.h" -static rarch_joypad_driver_t *joypad_drivers[] = { +rarch_joypad_driver_t *joypad_drivers[] = { #ifndef IS_RETROLAUNCH #ifdef __CELLOS_LV2__ &ps3_joypad, diff --git a/settings.c b/settings.c index f7877ff3c6..6141ccc534 100644 --- a/settings.c +++ b/settings.c @@ -176,6 +176,43 @@ const char *config_get_default_input(void) } } +const char *config_get_default_joypad(void) +{ + switch (JOYPAD_DEFAULT_DRIVER) + { + case JOYPAD_PS3: + return "ps3"; + case JOYPAD_WINXINPUT: + return "winxinput"; + case JOYPAD_GX: + return "gx"; + case JOYPAD_XDK: + return "xdk"; + case JOYPAD_PSP: + return "psp"; + case JOYPAD_DINPUT: + return "dinput"; + case JOYPAD_UDEV: + return "udev"; + case JOYPAD_LINUXRAW: + return "linuxraw"; + case JOYPAD_ANDROID: + return "android"; + case JOYPAD_SDL: +#ifdef HAVE_SDL2 + return "sdl2"; +#else + return "sdl"; +#endif + case JOYPAD_APPLE: + return "apple"; + case JOYPAD_QNX: + return "qnx"; + default: + return NULL; + } +} + #ifdef HAVE_MENU const char *config_get_default_menu(void) { @@ -251,6 +288,7 @@ void config_set_defaults(void) const char *def_audio = config_get_default_audio(); const char *def_audio_resampler = config_get_default_audio_resampler(); const char *def_input = config_get_default_input(); + const char *def_joypad = config_get_default_joypad(); #ifdef HAVE_MENU const char *def_menu = config_get_default_menu(); #endif @@ -279,6 +317,9 @@ void config_set_defaults(void) if (def_input) strlcpy(g_settings.input.driver, def_input, sizeof(g_settings.input.driver)); + if (def_joypad) + strlcpy(g_settings.input.joypad_driver, + def_input, sizeof(g_settings.input.joypad_driver)); #ifdef HAVE_MENU if (def_menu) strlcpy(g_settings.menu.driver, diff --git a/settings_data.c b/settings_data.c index d0cfb347e1..74d6234816 100644 --- a/settings_data.c +++ b/settings_data.c @@ -2304,7 +2304,7 @@ rarch_setting_t *setting_data_get_list(void) #ifdef HAVE_MENU CONFIG_STRING(g_settings.menu.driver, "menu_driver", "Menu Driver", config_get_default_menu(), GROUP_NAME, SUBGROUP_NAME, NULL, NULL) WITH_FLAGS(SD_FLAG_IS_DRIVER) #endif - CONFIG_STRING(g_settings.input.joypad_driver, "input_joypad_driver", "Joypad Driver", "", GROUP_NAME, SUBGROUP_NAME, NULL, NULL) WITH_FLAGS(SD_FLAG_IS_DRIVER) + CONFIG_STRING(g_settings.input.joypad_driver, "input_joypad_driver", "Joypad Driver", config_get_default_joypad(), GROUP_NAME, SUBGROUP_NAME, NULL, NULL) WITH_FLAGS(SD_FLAG_IS_DRIVER) CONFIG_STRING(g_settings.input.keyboard_layout, "input_keyboard_layout", "Keyboard Layout", "", GROUP_NAME, SUBGROUP_NAME, NULL, NULL) WITH_FLAGS(SD_FLAG_IS_DRIVER) END_SUB_GROUP() From 6203c3162e7489a937d99fe8f3f2c9006fcc9bda Mon Sep 17 00:00:00 2001 From: Mike Robinson Date: Fri, 3 Oct 2014 03:05:35 +0100 Subject: [PATCH 2/2] Fallback to first working joypad driver if init failed Fallback to the old behavior on init failure so there's no regression if the user did not select a working joypad driver. --- input/input_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/input_common.c b/input/input_common.c index 9b6e665b47..9962a22839 100644 --- a/input/input_common.c +++ b/input/input_common.c @@ -105,7 +105,7 @@ const rarch_joypad_driver_t *input_joypad_init_driver(const char *ident) } } - return NULL; + return input_joypad_init_first(); } const rarch_joypad_driver_t *input_joypad_init_first(void)