Module: wine Branch: master Commit: 39684c7e3ab64dcd1feba0300ec969027c5f8eb5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=39684c7e3ab64dcd1feba0300e...
Author: Lucas Fialho Zawacki lfzawacki@gmail.com Date: Sat Jul 2 01:07:15 2011 -0300
dinput: SetActionMap and queue_event setting mapped data.
---
dlls/dinput/device.c | 19 +++++++++++++++++++ dlls/dinput/device_private.h | 7 +++++++ dlls/dinput/keyboard.c | 4 ++++ dlls/dinput/mouse.c | 6 +++++- dlls/dinput8/tests/device.c | 2 +- 5 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index 16326b4..5d81227 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -604,6 +604,22 @@ void queue_event(LPDIRECTINPUTDEVICE8A iface, int inst_id, DWORD data, DWORD tim This->data_queue[This->queue_head].dwData = data; This->data_queue[This->queue_head].dwTimeStamp = time; This->data_queue[This->queue_head].dwSequence = seq; + + /* Set uAppData by means of action mapping */ + if (This->num_actions > 0) + { + int i; + for (i=0; i < This->num_actions; i++) + { + if (This->action_map[i].offset == ofs) + { + TRACE("Offset %d mapped to uAppData %lu\n", ofs, This->action_map[i].uAppData); + This->data_queue[This->queue_head].uAppData = This->action_map[i].uAppData; + break; + } + } + } + This->queue_head = next_pos; /* Send event if asked */ } @@ -783,6 +799,9 @@ ULONG WINAPI IDirectInputDevice2WImpl_Release(LPDIRECTINPUTDEVICE8W iface) HeapFree(GetProcessHeap(), 0, This->data_format.wine_df); release_DataFormat(&This->data_format);
+ /* Free action mapping */ + HeapFree(GetProcessHeap(), 0, This->action_map); + EnterCriticalSection( &This->dinput->crit ); list_remove( &This->entry ); LeaveCriticalSection( &This->dinput->crit ); diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h index 1bbc281..503698a 100644 --- a/dlls/dinput/device_private.h +++ b/dlls/dinput/device_private.h @@ -47,6 +47,12 @@ typedef struct LPDIDATAFORMAT user_df; /* user defined data format */ } DataFormat;
+typedef struct +{ + unsigned int offset; + UINT_PTR uAppData; +} ActionMap; + /* Device implementation */ typedef struct IDirectInputDeviceImpl IDirectInputDeviceImpl; struct IDirectInputDeviceImpl @@ -74,6 +80,7 @@ struct IDirectInputDeviceImpl
/* Action mapping */ int num_actions; /* number of actions mapped */ + ActionMap *action_map; /* array of mappings */ };
extern BOOL get_app_key(HKEY*, HKEY*) DECLSPEC_HIDDEN; diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index 690a91d..3c93bcd 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -609,6 +609,8 @@ static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, 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)) @@ -616,6 +618,8 @@ static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, int instance = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID); memcpy(&obj_df[action], &c_dfDIKeyboard.rgodf[instance], c_dfDIKeyboard.dwObjSize);
+ This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData; + This->base.action_map[action].offset = action; obj_df[action].dwOfs = action; action++; } diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index 4783cf6..fb724d5 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -834,6 +834,7 @@ static HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, DIDATAFORMAT data_format; DIOBJECTDATAFORMAT *obj_df = NULL; int i, action = 0, num_actions = 0; + unsigned int offset = 0;
if (This->base.acquired) return DIERR_ACQUIRED;
@@ -856,15 +857,18 @@ static HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, 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++) { - unsigned int offset = 0;
if (IsEqualGUID(&This->base.guid, &lpdiaf->rgoAction[i].guidInstance)) { int instance = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID); memcpy(&obj_df[action], &c_dfDIMouse.rgodf[instance], c_dfDIMouse.dwObjSize);
+ This->base.action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData; + This->base.action_map[action].offset = offset; obj_df[action].dwOfs = offset; offset += (obj_df[action].dwType & DIDFT_BUTTON) ? 1 : 4;
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c index 479ae34..84a499f 100644 --- a/dlls/dinput8/tests/device.c +++ b/dlls/dinput8/tests/device.c @@ -89,7 +89,7 @@ static void test_device_input( return; }
- todo_wine ok (obj_data.uAppData == expected, "Retrieval of action failed uAppData=%lu expected=%d\n", obj_data.uAppData, expected); + ok (obj_data.uAppData == expected, "Retrieval of action failed uAppData=%lu expected=%d\n", obj_data.uAppData, expected); }
static void test_build_action_map(