Lucas Fialho Zawacki : dinput: SetActionMap and queue_event setting mapped data.
Alexandre Julliard
julliard at winehq.org
Mon Jul 4 13:46:08 CDT 2011
Module: wine
Branch: master
Commit: 39684c7e3ab64dcd1feba0300ec969027c5f8eb5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=39684c7e3ab64dcd1feba0300ec969027c5f8eb5
Author: Lucas Fialho Zawacki <lfzawacki at 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(
More information about the wine-cvs
mailing list