From 063f9289f1df4bdec05401519c1a69d4739639e9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 16 Feb 2011 04:49:07 -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 e9a25ee61..f6421ba20 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -417,21 +417,31 @@ int 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