diff --git a/src/joystick/windows/SDL_dinputjoystick.c b/src/joystick/windows/SDL_dinputjoystick.c index 5b3089b..3273e2d 100644 --- a/src/joystick/windows/SDL_dinputjoystick.c +++ b/src/joystick/windows/SDL_dinputjoystick.c @@ -559,6 +559,20 @@ SDL_DINPUT_JoystickDetect(JoyStick_DeviceData **pContext) SDL_RawDevListCount = 0; } +#define AXIS_OFFSET(axis, num) \ + ( num == 0 ? FIELD_OFFSET(DIJOYSTATE2, l ## axis) \ + : num == 1 ? FIELD_OFFSET(DIJOYSTATE2, lV ## axis) \ + : num == 2 ? FIELD_OFFSET(DIJOYSTATE2, lA ## axis) \ + : num == 3 ? FIELD_OFFSET(DIJOYSTATE2, lF ## axis) \ + : -1) + +#define SLIDER_OFFSET(num) \ + ( num < 2 ? FIELD_OFFSET(DIJOYSTATE2, rglSlider) + num * sizeof(LONG) \ + : num < 4 ? FIELD_OFFSET(DIJOYSTATE2, rglVSlider) + (num - 2) * sizeof(LONG) \ + : num < 6 ? FIELD_OFFSET(DIJOYSTATE2, rglASlider) + (num - 4) * sizeof(LONG) \ + : num < 8 ? FIELD_OFFSET(DIJOYSTATE2, rglFSlider) + (num - 6) * sizeof(LONG) \ + : -1) + static BOOL CALLBACK EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef) { @@ -582,22 +596,30 @@ EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef) in->type = AXIS; in->num = joystick->naxes; - if (!SDL_memcmp(&dev->guidType, &GUID_XAxis, sizeof(dev->guidType))) - in->ofs = DIJOFS_X; - else if (!SDL_memcmp(&dev->guidType, &GUID_YAxis, sizeof(dev->guidType))) - in->ofs = DIJOFS_Y; - else if (!SDL_memcmp(&dev->guidType, &GUID_ZAxis, sizeof(dev->guidType))) - in->ofs = DIJOFS_Z; - else if (!SDL_memcmp(&dev->guidType, &GUID_RxAxis, sizeof(dev->guidType))) - in->ofs = DIJOFS_RX; - else if (!SDL_memcmp(&dev->guidType, &GUID_RyAxis, sizeof(dev->guidType))) - in->ofs = DIJOFS_RY; - else if (!SDL_memcmp(&dev->guidType, &GUID_RzAxis, sizeof(dev->guidType))) - in->ofs = DIJOFS_RZ; - else if (!SDL_memcmp(&dev->guidType, &GUID_Slider, sizeof(dev->guidType))) { - in->ofs = DIJOFS_SLIDER(joystick->hwdata->NumSliders); + in->ofs = -1; + if (!SDL_memcmp(&dev->guidType, &GUID_XAxis, sizeof(dev->guidType))) { + in->ofs = AXIS_OFFSET(X, joystick->hwdata->NumXAxes); + ++joystick->hwdata->NumXAxes; + } else if (!SDL_memcmp(&dev->guidType, &GUID_YAxis, sizeof(dev->guidType))){ + in->ofs = AXIS_OFFSET(Y, joystick->hwdata->NumYAxes); + ++joystick->hwdata->NumYAxes; + } else if (!SDL_memcmp(&dev->guidType, &GUID_ZAxis, sizeof(dev->guidType))){ + in->ofs = AXIS_OFFSET(Z, joystick->hwdata->NumZAxes); + ++joystick->hwdata->NumZAxes; + } else if (!SDL_memcmp(&dev->guidType, &GUID_RxAxis, sizeof(dev->guidType))){ + in->ofs = AXIS_OFFSET(Rx, joystick->hwdata->NumRXAxes); + ++joystick->hwdata->NumRXAxes; + } else if (!SDL_memcmp(&dev->guidType, &GUID_RyAxis, sizeof(dev->guidType))){ + in->ofs = AXIS_OFFSET(Ry, joystick->hwdata->NumRYAxes); + ++joystick->hwdata->NumRYAxes; + } else if (!SDL_memcmp(&dev->guidType, &GUID_RzAxis, sizeof(dev->guidType))) { + in->ofs = AXIS_OFFSET(Rz, joystick->hwdata->NumRZAxes); + ++joystick->hwdata->NumRZAxes; + } else if (!SDL_memcmp(&dev->guidType, &GUID_Slider, sizeof(dev->guidType))) { + in->ofs = SLIDER_OFFSET(joystick->hwdata->NumSliders); ++joystick->hwdata->NumSliders; - } else { + } + if (in->ofs == -1) { return DIENUM_CONTINUE; /* not an axis we can grok */ } diff --git a/src/joystick/windows/SDL_windowsjoystick_c.h b/src/joystick/windows/SDL_windowsjoystick_c.h index 94f0bb7..6c1750f 100644 --- a/src/joystick/windows/SDL_windowsjoystick_c.h +++ b/src/joystick/windows/SDL_windowsjoystick_c.h @@ -74,6 +74,12 @@ struct joystick_hwdata SDL_bool buffered; input_t Inputs[MAX_INPUTS]; int NumInputs; + int NumXAxes; + int NumYAxes; + int NumZAxes; + int NumRXAxes; + int NumRYAxes; + int NumRZAxes; int NumSliders; SDL_bool ff_initialized; DIEFFECT *ffeffect;