diff --git a/src/x11_init.c b/src/x11_init.c index a5277c09..32719cbf 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -648,7 +648,8 @@ int _glfwPlatformInit(void) _glfwLibrary.X11.cursor = createNULLCursor(); - _glfwInitJoysticks(); + if (!_glfwInitJoysticks()) + return GL_FALSE; // Start the timer _glfwInitTimer(); diff --git a/src/x11_joystick.c b/src/x11_joystick.c index 1895dc6a..a383fa02 100644 --- a/src/x11_joystick.c +++ b/src/x11_joystick.c @@ -37,7 +37,8 @@ #include #include #include - +#include +#include #include #include #endif // _GLFW_USE_LINUX_JOYSTICKS @@ -171,30 +172,52 @@ static void pollJoystickEvents(void) // Initialize joystick interface //======================================================================== -void _glfwInitJoysticks(void) +int _glfwInitJoysticks(void) { #ifdef _GLFW_USE_LINUX_JOYSTICKS - int i, j, joy = 0; - char path[20]; - const char* bases[] = + int i, joy = 0; + regex_t regex; + DIR* dir; + const char* directories[] = { - "/dev/input/js", - "/dev/js" + "/dev/input", + "/dev" }; - for (i = 0; i < sizeof(bases) / sizeof(bases[0]); i++) + if (regcomp(®ex, "^js[0-9]\\+$", 0) != 0) { - for (j = 0; j < 50; j++) - { - if (joy > GLFW_JOYSTICK_LAST) - break; + _glfwSetError(GLFW_PLATFORM_ERROR, "X11: Failed to compile regex"); + return GL_FALSE; + } - sprintf(path, "%s%i", bases[i], j); + for (i = 0; i < sizeof(directories) / sizeof(directories[0]); i++) + { + struct dirent* entry; + + dir = opendir(directories[i]); + if (!dir) + continue; + + while ((entry = readdir(dir))) + { + char path[20]; + regmatch_t match; + + if (regexec(®ex, entry->d_name, 1, &match, 0) != 0) + continue; + + snprintf(path, sizeof(path), "%s/%s", directories[i], entry->d_name); if (openJoystickDevice(joy, path)) joy++; } + + closedir(dir); } + + regfree(®ex); #endif // _GLFW_USE_LINUX_JOYSTICKS + + return GL_TRUE; } diff --git a/src/x11_platform.h b/src/x11_platform.h index 75beb745..a6b576ed 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -305,7 +305,7 @@ void _glfwSetVideoMode(int* width, int* height, int* rate); void _glfwRestoreVideoMode(void); // Joystick input -void _glfwInitJoysticks(void); +int _glfwInitJoysticks(void); void _glfwTerminateJoysticks(void); // Unicode support