Vitaliy Margolen : dinput: Don'
t reset dead zone and saturation when setting data format.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 6 15:23:12 CST 2007
Module: wine
Branch: master
Commit: a06821765a86b783fb45487a50630b26a9f6a96b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a06821765a86b783fb45487a50630b26a9f6a96b
Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date: Tue Feb 6 09:47:17 2007 -0700
dinput: Don't reset dead zone and saturation when setting data format.
Additional tests indicate that native doesn't touch previously set
properties.
---
dlls/dinput/joystick_linux.c | 32 +++-----------------------------
dlls/dinput/joystick_linuxinput.c | 13 ++++++++++++-
dlls/dinput/tests/joystick.c | 23 ++++++++++++++++++++++-
3 files changed, 37 insertions(+), 31 deletions(-)
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 3fa906d..26a62b5 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -474,7 +474,7 @@ static HRESULT alloc_device(REFGUID rgui
newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)"DINPUT_joystick";
/* setup_dinput_options may change these */
- newDevice->deadzone = 5000;
+ newDevice->deadzone = 0;
newDevice->devcaps.dwButtons = newDevice->buttons;
newDevice->devcaps.dwAxes = newDevice->axes;
newDevice->devcaps.dwPOVs = 0;
@@ -672,32 +672,6 @@ static ULONG WINAPI JoystickAImpl_Releas
}
/******************************************************************************
- * SetDataFormat : the application can choose the format of the data
- * the device driver sends back with GetDeviceState.
- */
-static HRESULT WINAPI JoystickAImpl_SetDataFormat(
- LPDIRECTINPUTDEVICE8A iface,
- LPCDIDATAFORMAT df)
-{
- JoystickImpl *This = (JoystickImpl *)iface;
- unsigned int i;
- HRESULT hr;
-
- TRACE("(%p,%p)\n",This,df);
-
- hr = IDirectInputDevice2AImpl_SetDataFormat(iface, df);
- if (FAILED(hr)) return hr;
-
- for (i = 0; i < This->base.data_format.wine_df->dwNumObjs; i++)
- {
- This->props[i].lDeadZone = 1000;
- This->props[i].lSaturation = 0;
- }
-
- return DI_OK;
-}
-
-/******************************************************************************
* Acquire : gets exclusive control of the joystick
*/
static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
@@ -1250,7 +1224,7 @@ static const IDirectInputDevice8AVtbl Jo
JoystickAImpl_Unacquire,
JoystickAImpl_GetDeviceState,
IDirectInputDevice2AImpl_GetDeviceData,
- JoystickAImpl_SetDataFormat,
+ IDirectInputDevice2AImpl_SetDataFormat,
IDirectInputDevice2AImpl_SetEventNotification,
IDirectInputDevice2AImpl_SetCooperativeLevel,
JoystickAImpl_GetObjectInfo,
@@ -1292,7 +1266,7 @@ static const IDirectInputDevice8WVtbl Sy
XCAST(Unacquire)JoystickAImpl_Unacquire,
XCAST(GetDeviceState)JoystickAImpl_GetDeviceState,
XCAST(GetDeviceData)IDirectInputDevice2AImpl_GetDeviceData,
- XCAST(SetDataFormat)JoystickAImpl_SetDataFormat,
+ XCAST(SetDataFormat)IDirectInputDevice2AImpl_SetDataFormat,
XCAST(SetEventNotification)IDirectInputDevice2AImpl_SetEventNotification,
XCAST(SetCooperativeLevel)IDirectInputDevice2AImpl_SetCooperativeLevel,
IDirectInputDevice2WImpl_GetObjectInfo,
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index 12fcf6d..8df801e 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -923,9 +923,20 @@ static HRESULT WINAPI JoystickAImpl_GetP
TRACE("range(%d, %d) obj=%d\n", pr->lMin, pr->lMax, obj);
break;
}
+ case (DWORD) DIPROP_DEADZONE:
+ {
+ LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph;
+ int obj = find_property(&This->base.data_format, pdiph);
+
+ if (obj < 0) return DIERR_OBJECTNOTFOUND;
+
+ pd->dwData = This->props[obj].deadzone;
+ TRACE("deadzone(%d) obj=%d\n", pd->dwData, obj);
+ break;
+ }
default:
- return IDirectInputDevice2AImpl_GetProperty(iface, rguid, pdiph);
+ return IDirectInputDevice2AImpl_GetProperty(iface, rguid, pdiph);
}
return DI_OK;
diff --git a/dlls/dinput/tests/joystick.c b/dlls/dinput/tests/joystick.c
index 7ca690a..61d1426 100644
--- a/dlls/dinput/tests/joystick.c
+++ b/dlls/dinput/tests/joystick.c
@@ -82,6 +82,7 @@ typedef struct tagJoystickInfo
DWORD pov;
DWORD button;
LONG lMin, lMax;
+ DWORD dZone;
} JoystickInfo;
static BOOL CALLBACK EnumAxes(
@@ -97,13 +98,21 @@ static BOOL CALLBACK EnumAxes(
IsEqualIID(&pdidoi->guidType, &GUID_RxAxis) ||
IsEqualIID(&pdidoi->guidType, &GUID_RyAxis) ||
IsEqualIID(&pdidoi->guidType, &GUID_RzAxis) ||
- IsEqualIID(&pdidoi->guidType, &GUID_Slider)) {
+ IsEqualIID(&pdidoi->guidType, &GUID_Slider))
+ {
DIPROPRANGE diprg;
+ DIPROPDWORD dipdw;
+
diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = pdidoi->dwType;
+ dipdw.diph.dwSize = sizeof(dipdw);
+ dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+ dipdw.diph.dwHow = DIPH_BYID;
+ dipdw.diph.dwObj = pdidoi->dwType;
+
hr = IDirectInputDevice_GetProperty(info->pJoystick, DIPROP_RANGE, &diprg.diph);
ok(SUCCEEDED(hr), "IDirectInputDevice_GetProperty() failed: %s\n", DXGetErrorString8(hr));
ok(info->lMin == diprg.lMin && info->lMax == diprg.lMax, "Min/Max range invalid: "
@@ -119,6 +128,17 @@ static BOOL CALLBACK EnumAxes(
hr = IDirectInputDevice_SetProperty(info->pJoystick, DIPROP_RANGE, &diprg.diph);
ok(hr==DI_OK,"IDirectInputDevice_SetProperty() failed: %s\n", DXGetErrorString8(hr));
+ /* dead zone */
+ hr = IDirectInputDevice_GetProperty(info->pJoystick, DIPROP_DEADZONE, &dipdw.diph);
+ ok(SUCCEEDED(hr), "IDirectInputDevice_GetProperty() failed: %s\n", DXGetErrorString8(hr));
+ ok(info->dZone == dipdw.dwData, "deadzone invalid: expected %d got %d\n",
+ info->dZone, dipdw.dwData);
+
+ dipdw.dwData = 123;
+
+ hr = IDirectInputDevice_SetProperty(info->pJoystick, DIPROP_DEADZONE, &dipdw.diph);
+ ok(hr==DI_OK,"IDirectInputDevice_SetProperty() failed: %s\n", DXGetErrorString8(hr));
+
info->axis++;
} else if (IsEqualIID(&pdidoi->guidType, &GUID_POV))
info->pov++;
@@ -263,6 +283,7 @@ static BOOL CALLBACK EnumJoysticks(
ok(hr==DI_OK,"IDirectInputDevice_SetDataFormat() failed: %s\n", DXGetErrorString8(hr));
info.lMin = -2000;
info.lMax = +2000;
+ info.dZone= 123;
hr = IDirectInputDevice_EnumObjects(pJoystick, EnumAxes, (VOID*)&info, DIDFT_ALL);
ok(hr==DI_OK,"IDirectInputDevice_EnumObjects() failed: %s\n", DXGetErrorString8(hr));
More information about the wine-cvs
mailing list