dinput: Create generic joystick Acquire/Unacquire.
diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c
index a19cf27..6e7e7ef 100644
--- a/dlls/dinput/joystick.c
+++ b/dlls/dinput/joystick.c
@@ -32,6 +32,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
*/
HRESULT WINAPI JoystickAGenericImpl_SetProperty(
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 67ec02b..afabebe 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -605,13 +605,13 @@
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 @@
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 @@
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 e1709e9..b61406f 100644
--- a/dlls/dinput/joystick_private.h
+++ b/dlls/dinput/joystick_private.h
@@ -78,4 +78,8 @@
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 */