2
0
Эх сурвалжийг харах

Replaced guessing with dirent and regex.

Camilla Berglund 13 жил өмнө
parent
commit
4cb569b5b3
3 өөрчлөгдсөн 38 нэмэгдсэн , 14 устгасан
  1. 2 1
      src/x11_init.c
  2. 35 12
      src/x11_joystick.c
  3. 1 1
      src/x11_platform.h

+ 2 - 1
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();

+ 35 - 12
src/x11_joystick.c

@@ -37,7 +37,8 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <errno.h>
-
+#include <regex.h>
+#include <dirent.h>
 #include <stdio.h>
 #include <stdlib.h>
 #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(&regex, "^js[0-9]\\+$", 0) != 0)
     {
-        for (j = 0;  j < 50;  j++)
+        _glfwSetError(GLFW_PLATFORM_ERROR, "X11: Failed to compile regex");
+        return GL_FALSE;
+    }
+
+    for (i = 0;  i < sizeof(directories) / sizeof(directories[0]);  i++)
+    {
+        struct dirent* entry;
+
+        dir = opendir(directories[i]);
+        if (!dir)
+            continue;
+
+        while ((entry = readdir(dir)))
         {
-            if (joy > GLFW_JOYSTICK_LAST)
-                break;
+            char path[20];
+            regmatch_t match;
 
-            sprintf(path, "%s%i", bases[i], j);
+            if (regexec(&regex, 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(&regex);
 #endif // _GLFW_USE_LINUX_JOYSTICKS
+
+    return GL_TRUE;
 }
 
 

+ 1 - 1
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