diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c index a19cf27576f..6e7e7ef950f 100644 --- a/dlls/dinput/joystick.c +++ b/dlls/dinput/joystick.c @@ -31,6 +31,40 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput); +/****************************************************************************** + * Acquire : gets exclusive control of the joystick + */ +HRESULT WINAPI JoystickAGenericImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) +{ + JoystickGenericImpl *This = (JoystickGenericImpl *)iface; + + TRACE("(%p)\n",This); + + if (This->base.acquired) { + WARN("already acquired\n"); + return S_FALSE; + } + + This->base.acquired = 1; + + return DI_OK; +} + +/****************************************************************************** + * Unacquire : frees the joystick + */ +HRESULT WINAPI JoystickAGenericImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) +{ + JoystickGenericImpl *This = (JoystickGenericImpl *)iface; + HRESULT res; + + TRACE("(%p)\n",This); + + if ((res = IDirectInputDevice2AImpl_Unacquire(iface)) != DI_OK) return res; + + return DI_OK; +} + /****************************************************************************** * SetProperty : change input device properties */ diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c index 67ec02b2553..afabebe2903 100644 --- a/dlls/dinput/joystick_linux.c +++ b/dlls/dinput/joystick_linux.c @@ -605,13 +605,13 @@ const struct dinput_device joystick_linux_device = { static HRESULT WINAPI JoystickLinuxAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { JoystickImpl *This = (JoystickImpl *)iface; + HRESULT res; TRACE("(%p)\n",This); - if (This->generic.base.acquired) { - WARN("already acquired\n"); - return S_FALSE; - } + res = JoystickAGenericImpl_Acquire(iface); + if (res != DI_OK) + return res; /* open the joystick device */ if (This->joyfd==-1) { @@ -620,12 +620,11 @@ static HRESULT WINAPI JoystickLinuxAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) This->joyfd=open(This->dev,O_RDONLY); if (This->joyfd==-1) { ERR("open(%s) failed: %s\n", This->dev, strerror(errno)); + JoystickAGenericImpl_Unacquire(iface); return DIERR_NOTFOUND; } } - This->generic.base.acquired = 1; - return DI_OK; } @@ -639,7 +638,10 @@ static HRESULT WINAPI JoystickLinuxAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) TRACE("(%p)\n",This); - if ((res = IDirectInputDevice2AImpl_Unacquire(iface)) != DI_OK) return res; + res = JoystickAGenericImpl_Unacquire(iface); + + if (res != DI_OK) + return res; if (This->joyfd!=-1) { TRACE("closing joystick device\n"); diff --git a/dlls/dinput/joystick_private.h b/dlls/dinput/joystick_private.h index e1709e9206d..b61406f7edf 100644 --- a/dlls/dinput/joystick_private.h +++ b/dlls/dinput/joystick_private.h @@ -78,4 +78,8 @@ HRESULT WINAPI JoystickAGenericImpl_Poll(LPDIRECTINPUTDEVICE8A iface); HRESULT WINAPI JoystickAGenericImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface, DWORD len, LPVOID ptr); +HRESULT WINAPI JoystickAGenericImpl_Acquire(LPDIRECTINPUTDEVICE8A iface); + +HRESULT WINAPI JoystickAGenericImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface); + #endif /* __WINE_DLLS_DINPUT_JOYSTICK_PRIVATE_H */