From 43dcde0be507f7f27bec1abc8154d8c78c733221 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 16 Feb 2011 04:51:13 -0800 Subject: [PATCH] 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 | 32 ++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c index 4f81aadd9..4c486369e 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -413,21 +413,31 @@ SDL_SYS_JoystickInit(void) 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) {