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