Arkadiusz Hiler : dinput: Clear action mapping with SetDataFormat().

Alexandre Julliard julliard at winehq.org
Wed Mar 10 14:58:47 CST 2021


Module: wine
Branch: master
Commit: 542f6134563b491030737831f8c6da2aa530c9bd
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=542f6134563b491030737831f8c6da2aa530c9bd

Author: Arkadiusz Hiler <ahiler at codeweavers.com>
Date:   Mon Mar  8 14:36:09 2021 +0200

dinput: Clear action mapping with SetDataFormat().

Signed-off-by: Arkadiusz Hiler <ahiler at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dinput/device.c        | 18 ++++++++++++------
 dlls/dinput8/tests/device.c | 12 ++++++++++++
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 198e903fc2e..14c47dd3c7d 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -833,6 +833,7 @@ HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, L
     DWORD username_size = MAX_PATH;
     int i, action = 0, num_actions = 0;
     unsigned int offset = 0;
+    ActionMap *action_map;
 
     if (This->acquired) return DIERR_ACQUIRED;
 
@@ -848,15 +849,12 @@ HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, L
 
     if (num_actions == 0) return DI_NOEFFECT;
 
-    This->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;
 
-    HeapFree(GetProcessHeap(), 0, This->action_map);
-    This->action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions);
+    action_map = HeapAlloc(GetProcessHeap(), 0, sizeof(ActionMap)*num_actions);
 
     for (i = 0; i < lpdiaf->dwNumActions; i++)
     {
@@ -873,8 +871,8 @@ HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, L
 
             memcpy(&obj_df[action], obj, df->dwObjSize);
 
-            This->action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
-            This->action_map[action].offset = offset;
+            action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
+            action_map[action].offset = offset;
             obj_df[action].dwOfs = offset;
             offset += (type & DIDFT_BUTTON) ? 1 : 4;
 
@@ -884,6 +882,9 @@ HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, L
 
     IDirectInputDevice8_SetDataFormat(iface, &data_format);
 
+    This->action_map = action_map;
+    This->num_actions = num_actions;
+
     HeapFree(GetProcessHeap(), 0, obj_df);
 
     /* Set the device properties according to the action format */
@@ -962,6 +963,7 @@ 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;
+    This->data_queue[This->queue_head].uAppData    = -1;
 
     /* Set uAppData by means of action mapping */
     if (This->num_actions > 0)
@@ -1063,6 +1065,10 @@ HRESULT WINAPI IDirectInputDevice2WImpl_SetDataFormat(LPDIRECTINPUTDEVICE8W ifac
 
     EnterCriticalSection(&This->crit);
 
+    HeapFree(GetProcessHeap(), 0, This->action_map);
+    This->action_map = NULL;
+    This->num_actions = 0;
+
     release_DataFormat(&This->data_format);
     res = create_DataFormat(df, &This->data_format);
 
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index 02574961ec1..4a766280982 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -362,6 +362,18 @@ static void test_action_mapping(void)
         /* Test keyboard input */
         test_device_input(data.keyboard, INPUT_KEYBOARD, VK_SPACE, 2);
 
+        /* setting format should reset action map */
+        hr = IDirectInputDevice8_SetDataFormat(data.keyboard, &c_dfDIKeyboard);
+        ok (SUCCEEDED(hr), "IDirectInputDevice8_SetDataFormat failed: %08x\n", hr);
+
+        test_device_input(data.keyboard, INPUT_KEYBOARD, VK_SPACE, -1);
+
+        /* back to action map */
+        hr = IDirectInputDevice8_SetActionMap(data.keyboard, data.lpdiaf, NULL, 0);
+        ok (SUCCEEDED(hr), "SetActionMap should succeed hr=%08x\n", hr);
+
+        test_device_input(data.keyboard, INPUT_KEYBOARD, VK_SPACE, 2);
+
         /* Test BuildActionMap with no suitable actions for a device */
         IDirectInputDevice_Unacquire(data.keyboard);
         af.dwDataSize = 4 * DITEST_KEYBOARDSPACE;




More information about the wine-cvs mailing list