Lucas Fialho Zawacki : dinput: SetActionMap for joysticks.
Alexandre Julliard
julliard at winehq.org
Fri Jul 22 10:15:58 CDT 2011
Module: wine
Branch: master
Commit: 79bd7249e471bbdeb665547a1a3a75454c6c41f8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=79bd7249e471bbdeb665547a1a3a75454c6c41f8
Author: Lucas Fialho Zawacki <lfzawacki at gmail.com>
Date: Thu Jul 21 15:38:43 2011 -0300
dinput: SetActionMap for joysticks.
---
dlls/dinput/joystick.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 59 insertions(+), 1 deletions(-)
diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c
index b5c028c..2d8a818 100644
--- a/dlls/dinput/joystick.c
+++ b/dlls/dinput/joystick.c
@@ -500,9 +500,67 @@ HRESULT WINAPI JoystickWGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
LPCWSTR lpszUserName,
DWORD dwFlags)
{
+ JoystickGenericImpl *This = impl_from_IDirectInputDevice8W(iface);
+ DIDATAFORMAT data_format;
+ DIOBJECTDATAFORMAT *obj_df = NULL;
+ int i, action = 0, num_actions = 0;
+ unsigned int offset = 0;
+
FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
- return DI_NOEFFECT;
+ if (This->base.acquired) return DIERR_ACQUIRED;
+
+ data_format.dwSize = sizeof(data_format);
+ data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
+ data_format.dwFlags = DIDF_RELAXIS;
+ data_format.dwDataSize = lpdiaf->dwDataSize;
+
+ /* count the actions */
+ for (i=0; i < lpdiaf->dwNumActions; i++)
+ if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
+ num_actions++;
+
+ if (num_actions == 0) return DI_NOEFFECT;
+
+ This->base.num_actions = num_actions;
+
+ /* Construct the dataformat and actionmap */
+ obj_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DIOBJECTDATAFORMAT)*num_actions);
+ data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df;
+ data_format.dwNumObjs = num_actions;
+
+ This->base.action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions);
+
+ for (i = 0; i < lpdiaf->dwNumActions; i++)
+ {
+ if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance))
+ {
+ LPDIDATAFORMAT df = This->base.data_format.wine_df;
+ DWORD inst = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID);
+ DWORD type = DIDFT_GETTYPE(lpdiaf->rgoAction[i].dwObjID);
+ LPDIOBJECTDATAFORMAT obj;
+
+ if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
+ if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
+
+ obj = dataformat_to_odf_by_type(df, inst, type);
+
+ memcpy(&obj_df[action], obj, df->dwObjSize);
+
+ This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
+ This->base.action_map[action].offset = offset;
+ obj_df[action].dwOfs = offset;
+ offset += (type & DIDFT_BUTTON) ? 1 : 4;
+
+ action++;
+ }
+ }
+
+ IDirectInputDevice8_SetDataFormat(iface, &data_format);
+
+ HeapFree(GetProcessHeap(), 0, obj_df);
+
+ return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags);
}
HRESULT WINAPI JoystickAGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface,
More information about the wine-cvs
mailing list