Fixed bug #1121 (More than one device through SDL_JOYSTICK_DEVICE)
authorSam Lantinga <slouken@libsdl.org>
Wed, 16 Feb 2011 04:51:13 -0800
changeset 5317 901a9e9ff0b7
parent 5315 192f2d605339
child 5318 214da1e9fd7c
Fixed bug #1121 (More than one device through SDL_JOYSTICK_DEVICE) Chusslove Illich 2011-02-13 04:30:28 PST Currently SDL_JOYSTICK_DEVICE environment variable can be used to add exactly one topmost device. I think it would be nice if one could also set several devices (e.g. a stick and a throttle) in this way, as a colon- separated list. The attached patch implements this
src/joystick/linux/SDL_sysjoystick.c
--- a/src/joystick/linux/SDL_sysjoystick.c	Wed Feb 16 04:08:28 2011 -0800
+++ b/src/joystick/linux/SDL_sysjoystick.c	Wed Feb 16 04:51:13 2011 -0800
@@ -413,21 +413,31 @@
 
     numjoysticks = 0;
 
-    /* First see if the user specified a joystick to use */
+    /* First see if the user specified one or more joysticks to use */
     if (SDL_getenv("SDL_JOYSTICK_DEVICE") != NULL) {
-        SDL_strlcpy(path, SDL_getenv("SDL_JOYSTICK_DEVICE"), sizeof(path));
-        if (stat(path, &sb) == 0) {
-            fd = open(path, O_RDONLY, 0);
-            if (fd >= 0) {
-                /* Assume the user knows what they're doing. */
-                SDL_joylist[numjoysticks].fname = SDL_strdup(path);
-                if (SDL_joylist[numjoysticks].fname) {
-                    dev_nums[numjoysticks] = sb.st_rdev;
-                    ++numjoysticks;
+        char *envcopy, *envpath, *delim;
+        envcopy = SDL_strdup(SDL_getenv("SDL_JOYSTICK_DEVICE"));
+        envpath = envcopy;
+        while (envpath != NULL) {
+            delim = SDL_strchr(envpath, ':');
+            if (delim != NULL) {
+                *delim++ = '\0';
+            }
+            if (stat(envpath, &sb) == 0) {
+                fd = open(envpath, O_RDONLY, 0);
+                if (fd >= 0) {
+                    /* Assume the user knows what they're doing. */
+                    SDL_joylist[numjoysticks].fname = SDL_strdup(envpath);
+                    if (SDL_joylist[numjoysticks].fname) {
+                        dev_nums[numjoysticks] = sb.st_rdev;
+                        ++numjoysticks;
+                    }
+                    close(fd);
                 }
-                close(fd);
             }
+            envpath = delim;
         }
+        SDL_free(envcopy);
     }
 
     for (i = 0; i < SDL_arraysize(joydev_pattern); ++i) {