From 61de4e7425a57bc0f04a938f6ffc57afacb52c93 Mon Sep 17 00:00:00 2001 From: Christoph Frick Date: Thu, 9 Mar 2006 13:38:23 +0100 Subject: [PATCH] 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 --- dlls/dinput/joystick_linuxinput.c | 53 +++++++++++-------------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c index b2d9480ee44..5530c166a6a 100644 --- a/dlls/dinput/joystick_linuxinput.c +++ b/dlls/dinput/joystick_linuxinput.c @@ -466,7 +466,10 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) TRACE("(this=%p)\n",This); if (This->joyfd!=-1) - return 0; + return S_FALSE; + if (This->df==NULL) { + return DIERR_INVALIDPARAM; + } for (i=0;i<64;i++) { sprintf(buf,EVDEVPREFIX"%d",i); if (-1==(This->joyfd=open(buf,O_RDWR))) { @@ -627,40 +630,22 @@ static void fake_current_js_state(JoystickImpl *ji) static int find_property_offset(JoystickImpl *This, LPCDIPROPHEADER ph) { - int i,c; switch (ph->dwHow) { - case DIPH_BYOFFSET: - for (i=0; idf->dwNumObjs; i++) { - if (This->df->rgodf[i].dwOfs == ph->dwObj) { - return i; - } - } - break; - case DIPH_BYID: - /* XXX: this is a hack - see below */ - 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; idf->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; + case DIPH_BYOFFSET: { + int i; + for (i=0; idf->dwNumObjs; i++) { + if (This->df->rgodf[i].dwOfs == ph->dwObj) { + return i; + } + } + } + break; + case DIPH_BYID: { + return DIDFT_GETINSTANCE(ph->dwObj)>>WINE_JOYSTICK_AXIS_BASE; + } + break; default: - FIXME("Unhandled ph->dwHow=='%04X'\n", (unsigned int)ph->dwHow); + FIXME("Unhandled ph->dwHow=='%04X'\n", (unsigned int)ph->dwHow); } return -1; @@ -1075,7 +1060,7 @@ static HRESULT WINAPI JoystickAImpl_EnumObjects( default: FIXME("unhandled abs axis %d, ignoring!\n",i); } - ddoi.dwType = DIDFT_MAKEINSTANCE((1<has_ff)