Fixed bug 1371 - DX joystick axis ordering fix
Alex Nankervis 2012-01-15 11:19:45 PST DirectX joysticks can enumerate their axis out of order. This results in some joysticks having vertical/horizontal swapped, for example (vertical axis gets assigned to axis0). Joysticks that I've tested with this problem: XBOX 360 controller, Logitech Extreme 3D Pro. Attached is a diff that fixes this by sorting the DX joystick objects by their data offsets into the DX data structs. This puts the joystick objects into a standard ordering (X axis -> axis0, Y axis -> axis1, and so on).
This commit is contained in:
parent
6654546b2a
commit
68b32846b8
1 changed files with 54 additions and 0 deletions
|
@ -74,6 +74,7 @@ static BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE *
|
||||||
pdidInstance, VOID * pContext);
|
pdidInstance, VOID * pContext);
|
||||||
static BOOL CALLBACK EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev,
|
static BOOL CALLBACK EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev,
|
||||||
LPVOID pvRef);
|
LPVOID pvRef);
|
||||||
|
static void SortDevObjects(SDL_Joystick *joystick);
|
||||||
static Uint8 TranslatePOV(DWORD value);
|
static Uint8 TranslatePOV(DWORD value);
|
||||||
static int SDL_PrivateJoystickAxis_Int(SDL_Joystick * joystick, Uint8 axis,
|
static int SDL_PrivateJoystickAxis_Int(SDL_Joystick * joystick, Uint8 axis,
|
||||||
Sint16 value);
|
Sint16 value);
|
||||||
|
@ -483,6 +484,10 @@ SDL_SYS_JoystickOpen(SDL_Joystick * joystick)
|
||||||
EnumDevObjectsCallback, joystick,
|
EnumDevObjectsCallback, joystick,
|
||||||
DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV);
|
DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV);
|
||||||
|
|
||||||
|
/* Reorder the input objects. Some devices do not report the X axis as
|
||||||
|
* the first axis, for example. */
|
||||||
|
SortDevObjects(joystick);
|
||||||
|
|
||||||
dipdw.diph.dwObj = 0;
|
dipdw.diph.dwObj = 0;
|
||||||
dipdw.diph.dwHow = DIPH_DEVICE;
|
dipdw.diph.dwHow = DIPH_DEVICE;
|
||||||
dipdw.dwData = INPUT_QSIZE;
|
dipdw.dwData = INPUT_QSIZE;
|
||||||
|
@ -504,6 +509,55 @@ SDL_SYS_JoystickOpen(SDL_Joystick * joystick)
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Sort using the data offset into the DInput struct.
|
||||||
|
* This gives a reasonable ordering for the inputs. */
|
||||||
|
static int
|
||||||
|
SortDevFunc(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const input_t *inputA = (const input_t*)a;
|
||||||
|
const input_t *inputB = (const input_t*)b;
|
||||||
|
|
||||||
|
if (inputA->ofs < inputB->ofs)
|
||||||
|
return -1;
|
||||||
|
if (inputA->ofs > inputB->ofs)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sort the input objects and recalculate the indices for each input. */
|
||||||
|
static void
|
||||||
|
SortDevObjects(SDL_Joystick *joystick)
|
||||||
|
{
|
||||||
|
input_t *inputs = joystick->hwdata->Inputs;
|
||||||
|
int nButtons = 0;
|
||||||
|
int nHats = 0;
|
||||||
|
int nAxis = 0;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
SDL_qsort(inputs, joystick->hwdata->NumInputs, sizeof(input_t), SortDevFunc);
|
||||||
|
|
||||||
|
for (n = 0; n < joystick->hwdata->NumInputs; n++)
|
||||||
|
{
|
||||||
|
switch (inputs[n].type)
|
||||||
|
{
|
||||||
|
case BUTTON:
|
||||||
|
inputs[n].num = nButtons;
|
||||||
|
nButtons++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HAT:
|
||||||
|
inputs[n].num = nHats;
|
||||||
|
nHats++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AXIS:
|
||||||
|
inputs[n].num = nAxis;
|
||||||
|
nAxis++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL CALLBACK
|
static BOOL CALLBACK
|
||||||
EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
|
EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue