Vitaliy Margolen : dinput: [joystick_linuxinput]
Rewrite GetObjectInfo and EnumObjects on top of base class.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jan 11 05:34:06 CST 2007
Module: wine
Branch: master
Commit: d81e17d5c003f00fdfd21b7f78348a404b01a426
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d81e17d5c003f00fdfd21b7f78348a404b01a426
Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date: Tue Jan 9 13:44:42 2007 -0700
dinput: [joystick_linuxinput] Rewrite GetObjectInfo and EnumObjects on top of base class.
---
dlls/dinput/joystick_linuxinput.c | 203 +++++++++----------------------------
1 files changed, 50 insertions(+), 153 deletions(-)
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index b410a47..86e8d16 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -993,155 +993,6 @@ static HRESULT WINAPI JoystickAImpl_Poll
}
/******************************************************************************
- * EnumObjects : enumerate the different buttons and axis...
- */
-static HRESULT WINAPI JoystickAImpl_EnumObjects(
- LPDIRECTINPUTDEVICE8A iface,
- LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback,
- LPVOID lpvRef,
- DWORD dwFlags)
-{
- JoystickImpl *This = (JoystickImpl *)iface;
- DIDEVICEOBJECTINSTANCEA ddoi;
- int user_offset, user_object;
-
- TRACE("(this=%p,%p,%p,%08x)\n", This, lpCallback, lpvRef, dwFlags);
- if (TRACE_ON(dinput)) {
- TRACE(" - flags = ");
- _dump_EnumObjects_flags(dwFlags);
- TRACE("\n");
- }
-
- memset(&ddoi, 0, sizeof(ddoi));
- /* Only the fields till dwFFMaxForce are relevant */
- ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);
-
- /* For the joystick, do as is done in the GetCapabilities function */
- /* FIXME: needs more items */
- if ((dwFlags == DIDFT_ALL) ||
- (dwFlags & DIDFT_AXIS)) {
- BYTE i;
-
- for (i = 0; i < ABS_MAX; i++) {
- if (!test_bit(This->joydev->absbits,i)) continue;
-
- switch (i) {
- case ABS_X:
- ddoi.guidType = GUID_XAxis;
- break;
- case ABS_Y:
- ddoi.guidType = GUID_YAxis;
- break;
- case ABS_Z:
- ddoi.guidType = GUID_ZAxis;
- break;
- case ABS_RX:
- ddoi.guidType = GUID_RxAxis;
- break;
- case ABS_RY:
- ddoi.guidType = GUID_RyAxis;
- break;
- case ABS_RZ:
- ddoi.guidType = GUID_RzAxis;
- break;
- case ABS_THROTTLE:
- case ABS_RUDDER:
- ddoi.guidType = GUID_Slider;
- break;
- case ABS_HAT0X: case ABS_HAT0Y:
- case ABS_HAT1X: case ABS_HAT1Y:
- case ABS_HAT2X: case ABS_HAT2Y:
- case ABS_HAT3X: case ABS_HAT3Y:
- /* will be handled as POV - see below */
- continue;
- default:
- FIXME("unhandled abs axis 0x%02x, ignoring!\n",i);
- continue;
- }
- if ((user_offset = lxinput_to_user_offset(This, EV_ABS, i)) == -1) {
- continue;
- }
- user_object = offset_to_object(This->base.data_format.user_df, user_offset);
- ddoi.dwType = This->base.data_format.user_df->rgodf[user_object].dwType & 0x00ffffff;
- ddoi.dwOfs = This->base.data_format.user_df->rgodf[user_object].dwOfs;
- /* Linux event force feedback supports only (and always) x and y axes */
- if (i == ABS_X || i == ABS_Y) {
- if (This->joydev->has_ff)
- ddoi.dwFlags |= DIDOI_FFACTUATOR;
- }
- sprintf(ddoi.tszName, "%d-Axis", i);
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) {
- return DI_OK;
- }
- }
- }
-
- if ((dwFlags == DIDFT_ALL) ||
- (dwFlags & DIDFT_POV)) {
- int i;
- ddoi.guidType = GUID_POV;
- for (i=0; i<4; i++) {
- if (test_bit(This->joydev->absbits,ABS_HAT0X+(i<<1)) && test_bit(This->joydev->absbits,ABS_HAT0Y+(i<<1))) {
- if ((user_offset = lxinput_to_user_offset(This, EV_ABS, ABS_HAT0X+i))== -1) {
- continue;
- }
- user_object = offset_to_object(This->base.data_format.user_df, user_offset);
- ddoi.dwType = This->base.data_format.user_df->rgodf[user_object].dwType & 0x00ffffff;
- ddoi.dwOfs = This->base.data_format.user_df->rgodf[user_object].dwOfs;
- sprintf(ddoi.tszName, "%d-POV", i);
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) {
- return DI_OK;
- }
- }
- }
- }
-
- if ((dwFlags == DIDFT_ALL) ||
- (dwFlags & DIDFT_BUTTON)) {
- int i, btncount=0;
-
- /*The DInput SDK says that GUID_Button is only for mouse buttons but well*/
-
- ddoi.guidType = GUID_Button;
-
- for (i = 0; i < KEY_MAX; i++) {
- if (!test_bit(This->joydev->keybits,i)) continue;
- if ((user_offset = lxinput_to_user_offset(This, EV_KEY, btncount)) == -1) {
- continue;
- }
- user_object = offset_to_object(This->base.data_format.user_df, user_offset);
- ddoi.dwType = This->base.data_format.user_df->rgodf[user_object].dwType & 0x00ffffff;
- ddoi.dwOfs = This->base.data_format.user_df->rgodf[user_object].dwOfs;
- sprintf(ddoi.tszName, "%d-Button", btncount);
- btncount++;
- _dump_OBJECTINSTANCEA(&ddoi);
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) {
- return DI_OK;
- }
- }
- }
-
- return DI_OK;
-}
-
-static HRESULT WINAPI JoystickWImpl_EnumObjects(LPDIRECTINPUTDEVICE8W iface,
- LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback,
- LPVOID lpvRef,
- DWORD dwFlags)
-{
- JoystickImpl *This = (JoystickImpl *)iface;
-
- device_enumobjects_AtoWcb_data data;
-
- data.lpCallBack = lpCallback;
- data.lpvRef = lpvRef;
-
- return JoystickAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags);
-}
-
-/******************************************************************************
* GetProperty : get input device properties
*/
static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface,
@@ -1179,6 +1030,52 @@ static HRESULT WINAPI JoystickAImpl_GetP
return DI_OK;
}
+/******************************************************************************
+ * GetObjectInfo : get information about a device object such as a button
+ * or axis
+ */
+static HRESULT WINAPI JoystickWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface,
+ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow)
+{
+ static const WCHAR axisW[] = {'A','x','i','s',' ','%','d',0};
+ static const WCHAR povW[] = {'P','O','V',' ','%','d',0};
+ static const WCHAR buttonW[] = {'B','u','t','t','o','n',' ','%','d',0};
+ HRESULT res;
+
+ res = IDirectInputDevice2WImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow);
+ if (res != DI_OK) return res;
+
+ if (pdidoi->dwType & DIDFT_AXIS)
+ sprintfW(pdidoi->tszName, axisW, DIDFT_GETINSTANCE(pdidoi->dwType));
+ else if (pdidoi->dwType & DIDFT_POV)
+ sprintfW(pdidoi->tszName, povW, DIDFT_GETINSTANCE(pdidoi->dwType));
+ else if (pdidoi->dwType & DIDFT_BUTTON)
+ sprintfW(pdidoi->tszName, buttonW, DIDFT_GETINSTANCE(pdidoi->dwType));
+
+ _dump_OBJECTINSTANCEW(pdidoi);
+ return res;
+}
+
+static HRESULT WINAPI JoystickAImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8A iface,
+ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow)
+{
+ HRESULT res;
+ DIDEVICEOBJECTINSTANCEW didoiW;
+ DWORD dwSize = pdidoi->dwSize;
+
+ didoiW.dwSize = sizeof(didoiW);
+ res = JoystickWImpl_GetObjectInfo((LPDIRECTINPUTDEVICE8W)iface, &didoiW, dwObj, dwHow);
+ if (res != DI_OK) return res;
+
+ memset(pdidoi, 0, pdidoi->dwSize);
+ memcpy(pdidoi, &didoiW, FIELD_OFFSET(DIDEVICEOBJECTINSTANCEW, tszName));
+ pdidoi->dwSize = dwSize;
+ WideCharToMultiByte(CP_ACP, 0, didoiW.tszName, -1, pdidoi->tszName,
+ sizeof(pdidoi->tszName), NULL, NULL);
+
+ return res;
+}
+
/******************************************************************************
* CreateEffect - Create a new FF effect with the specified params
*/
@@ -1517,7 +1414,7 @@ static const IDirectInputDevice8AVtbl Jo
IDirectInputDevice2AImpl_AddRef,
JoystickAImpl_Release,
JoystickAImpl_GetCapabilities,
- JoystickAImpl_EnumObjects,
+ IDirectInputDevice2AImpl_EnumObjects,
JoystickAImpl_GetProperty,
JoystickAImpl_SetProperty,
JoystickAImpl_Acquire,
@@ -1527,7 +1424,7 @@ static const IDirectInputDevice8AVtbl Jo
IDirectInputDevice2AImpl_SetDataFormat,
IDirectInputDevice2AImpl_SetEventNotification,
IDirectInputDevice2AImpl_SetCooperativeLevel,
- IDirectInputDevice2AImpl_GetObjectInfo,
+ JoystickAImpl_GetObjectInfo,
IDirectInputDevice2AImpl_GetDeviceInfo,
IDirectInputDevice2AImpl_RunControlPanel,
IDirectInputDevice2AImpl_Initialize,
@@ -1559,7 +1456,7 @@ static const IDirectInputDevice8WVtbl Jo
XCAST(AddRef)IDirectInputDevice2AImpl_AddRef,
XCAST(Release)JoystickAImpl_Release,
XCAST(GetCapabilities)JoystickAImpl_GetCapabilities,
- JoystickWImpl_EnumObjects,
+ IDirectInputDevice2WImpl_EnumObjects,
XCAST(GetProperty)JoystickAImpl_GetProperty,
XCAST(SetProperty)JoystickAImpl_SetProperty,
XCAST(Acquire)JoystickAImpl_Acquire,
@@ -1569,7 +1466,7 @@ static const IDirectInputDevice8WVtbl Jo
XCAST(SetDataFormat)IDirectInputDevice2AImpl_SetDataFormat,
XCAST(SetEventNotification)IDirectInputDevice2AImpl_SetEventNotification,
XCAST(SetCooperativeLevel)IDirectInputDevice2AImpl_SetCooperativeLevel,
- IDirectInputDevice2WImpl_GetObjectInfo,
+ JoystickWImpl_GetObjectInfo,
IDirectInputDevice2WImpl_GetDeviceInfo,
XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel,
XCAST(Initialize)IDirectInputDevice2AImpl_Initialize,
More information about the wine-cvs
mailing list