dinput/linuxinput: Fix handling of DIPH_BYID.
- handling of DIPH_BYID - use regular id and not shifted one also for axes - may only Acquire after SetDataFormat
This commit is contained in:
parent
6b49f6bd86
commit
61de4e7425
@ -466,7 +466,10 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
|||||||
|
|
||||||
TRACE("(this=%p)\n",This);
|
TRACE("(this=%p)\n",This);
|
||||||
if (This->joyfd!=-1)
|
if (This->joyfd!=-1)
|
||||||
return 0;
|
return S_FALSE;
|
||||||
|
if (This->df==NULL) {
|
||||||
|
return DIERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
for (i=0;i<64;i++) {
|
for (i=0;i<64;i++) {
|
||||||
sprintf(buf,EVDEVPREFIX"%d",i);
|
sprintf(buf,EVDEVPREFIX"%d",i);
|
||||||
if (-1==(This->joyfd=open(buf,O_RDWR))) {
|
if (-1==(This->joyfd=open(buf,O_RDWR))) {
|
||||||
@ -627,37 +630,19 @@ static void fake_current_js_state(JoystickImpl *ji)
|
|||||||
|
|
||||||
static int find_property_offset(JoystickImpl *This, LPCDIPROPHEADER ph)
|
static int find_property_offset(JoystickImpl *This, LPCDIPROPHEADER ph)
|
||||||
{
|
{
|
||||||
int i,c;
|
|
||||||
switch (ph->dwHow) {
|
switch (ph->dwHow) {
|
||||||
case DIPH_BYOFFSET:
|
case DIPH_BYOFFSET: {
|
||||||
|
int i;
|
||||||
for (i=0; i<This->df->dwNumObjs; i++) {
|
for (i=0; i<This->df->dwNumObjs; i++) {
|
||||||
if (This->df->rgodf[i].dwOfs == ph->dwObj) {
|
if (This->df->rgodf[i].dwOfs == ph->dwObj) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIPH_BYID:
|
case DIPH_BYID: {
|
||||||
/* XXX: this is a hack - see below */
|
return DIDFT_GETINSTANCE(ph->dwObj)>>WINE_JOYSTICK_AXIS_BASE;
|
||||||
c = DIDFT_GETINSTANCE(ph->dwObj)>>WINE_JOYSTICK_AXIS_BASE;
|
|
||||||
for (i=0; (c&1)==0 && i<0x0F; i++) {
|
|
||||||
c >>= 1;
|
|
||||||
}
|
}
|
||||||
if (i<0x0F) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX - the following part won't work with LiveForSpeed
|
|
||||||
* - the game sets the dwTypes to something else then
|
|
||||||
* the ddoi.dwType set in EnumObjects
|
|
||||||
*/
|
|
||||||
#if 0
|
|
||||||
for (i=0; i<This->df->dwNumObjs; i++) {
|
|
||||||
TRACE("dwType='%08x'\n", This->df->rgodf[i].dwType);
|
|
||||||
if ((This->df->rgodf[i].dwType & 0x00ffffff) == (ph->dwObj & 0x00ffffff)) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("Unhandled ph->dwHow=='%04X'\n", (unsigned int)ph->dwHow);
|
FIXME("Unhandled ph->dwHow=='%04X'\n", (unsigned int)ph->dwHow);
|
||||||
@ -1075,7 +1060,7 @@ static HRESULT WINAPI JoystickAImpl_EnumObjects(
|
|||||||
default:
|
default:
|
||||||
FIXME("unhandled abs axis %d, ignoring!\n",i);
|
FIXME("unhandled abs axis %d, ignoring!\n",i);
|
||||||
}
|
}
|
||||||
ddoi.dwType = DIDFT_MAKEINSTANCE((1<<i) << WINE_JOYSTICK_AXIS_BASE) | DIDFT_ABSAXIS;
|
ddoi.dwType = DIDFT_MAKEINSTANCE(i << WINE_JOYSTICK_AXIS_BASE) | DIDFT_ABSAXIS;
|
||||||
/* Linux event force feedback supports only (and always) x and y axes */
|
/* Linux event force feedback supports only (and always) x and y axes */
|
||||||
if (i == ABS_X || i == ABS_Y) {
|
if (i == ABS_X || i == ABS_Y) {
|
||||||
if (This->has_ff)
|
if (This->has_ff)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user