Fixed bug #1080
authorSam Lantinga <slouken@libsdl.org>
Mon, 24 Jan 2011 14:36:12 -0800
changeset 5084 ac2c68eb1bb9
parent 5081 25d4feb7c127
child 5085 e7680e2c9f3c
Fixed bug #1080 Markus Rathgeb 2011-01-23 14:34:23 PST With kernel 2.6.31 the struct input_absinfo defined in linux/input.h changed. A field "__s32 resolution" was added at the end of the struct. Because the macro EVIOCGABS(abs) is using the struct input_absinfo, it would be better (IMHO) to change the declaration of variable values to "int values[sizeof(struct input_absinfo) / sizeof(int)];" or using "struct input_absinfo" directly.
src/joystick/linux/SDL_sysjoystick.c
--- a/src/joystick/linux/SDL_sysjoystick.c	Mon Jan 24 13:47:35 2011 -0600
+++ b/src/joystick/linux/SDL_sysjoystick.c	Mon Jan 24 14:36:12 2011 -0800
@@ -701,25 +701,26 @@
                 continue;
             }
             if (test_bit(i, absbit)) {
-                int values[6];
+                struct input_absinfo absinfo;
 
                 if (ioctl(fd, EVIOCGABS(i), values) < 0)
                     continue;
 #ifdef DEBUG_INPUT_EVENTS
                 printf("Joystick has absolute axis: %x\n", i);
                 printf("Values = { %d, %d, %d, %d, %d }\n",
-                       values[0], values[1], values[2], values[3], values[4]);
+                       absinfo.value, absinfo.minimum, absinfo.maximum,
+                       absinfo.fuzz, absinfo.flat);
 #endif /* DEBUG_INPUT_EVENTS */
                 joystick->hwdata->abs_map[i] = joystick->naxes;
-                if (values[1] == values[2]) {
+                if (absinfo.minimum == absinfo.maximum) {
                     joystick->hwdata->abs_correct[i].used = 0;
                 } else {
                     joystick->hwdata->abs_correct[i].used = 1;
                     joystick->hwdata->abs_correct[i].coef[0] =
-                        (values[2] + values[1]) / 2 - values[4];
+                        (absinfo.maximum + absinfo.minimum) / 2 - absinfo.flat;
                     joystick->hwdata->abs_correct[i].coef[1] =
-                        (values[2] + values[1]) / 2 + values[4];
-                    t = ((values[2] - values[1]) / 2 - 2 * values[4]);
+                        (absinfo.maximum + absinfo.minimum) / 2 + absinfo.flat;
+                    t = ((absinfo.maximum - absinfo.minimum) / 2 - 2 * absinfo.flat);
                     if (t != 0) {
                         joystick->hwdata->abs_correct[i].coef[2] =
                             (1 << 29) / t;