[PATCH 5/6] dinput: SetActionMap internal action mapping and GetDeviceData uAppData retrieval.

Lucas Fialho Zawacki lfzawacki at gmail.com
Mon Jun 20 17:07:31 CDT 2011


---
 dlls/dinput/device.c         |   17 +++++++-
 dlls/dinput/device_private.h |   10 +++++
 dlls/dinput/keyboard.c       |   84 +++++++++++++++++++++++++++++++++++++++++-
 dlls/dinput/mouse.c          |   53 +++++++++++++++++++++++++-
 4 files changed, 157 insertions(+), 7 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 011ab19..392145e 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -576,6 +576,20 @@ 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)
+            {
+                This->data_queue[This->queue_head].uAppData = This->action_map[i].uAppData;
+                TRACE("Offset %d mapped to uAppData %lu\n",ofs,This->action_map[i].uAppData);
+                break;
+            }
+    }
+
     This->queue_head = next_pos;
     /* Send event if asked */
 }
@@ -1416,13 +1430,10 @@ HRESULT WINAPI IDirectInputDevice8WImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface
 						     LPCWSTR lpszUserName,
 						     DWORD dwFlags)
 {
-    IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
     DIPROPDWORD dp;
 
     FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
 
-    if (This->acquired) return DIERR_ACQUIRED;
-
     if (lpdiaf->dwBufferSize > 0)
     {
         memset(&dp,0,sizeof(dp));
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index f254d7f..e25a66d 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
@@ -71,6 +77,10 @@ struct IDirectInputDeviceImpl
     BOOL                        overflow;    /* return DI_BUFFEROVERFLOW in 'GetDeviceData' */
 
     DataFormat                  data_format; /* user data format and wine to user format converter */
+
+    /* 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 51939a0..302f63d 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -586,6 +586,86 @@ HRESULT WINAPI SysKeyboardWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
     return  IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
 }
 
+HRESULT WINAPI SysKeyboardAImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface,
+                                             LPDIACTIONFORMATA lpdiaf,
+                                             LPCSTR lpszUserName,
+                                             DWORD dwFlags)
+{
+    SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface);
+    DIACTIONFORMATW diafW;
+    HRESULT hr;
+
+    diafW.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+        sizeof(DIACTIONW)*lpdiaf->dwNumActions);
+    _copy_diactionformatAtoW( &diafW, lpdiaf);
+
+    hr = IDirectInputDevice8_SetActionMap( &This->base.IDirectInputDevice8W_iface,
+        &diafW, NULL, dwFlags);
+
+    _copy_diactionformatWtoA( lpdiaf, &diafW);
+
+    HeapFree( GetProcessHeap(), 0, diafW.rgoAction);
+
+    return hr;
+}
+
+
+HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
+                                             LPDIACTIONFORMATW lpdiaf,
+                                             LPCWSTR lpszUserName,
+                                             DWORD dwFlags)
+{
+    SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface);
+    DIDATAFORMAT data_format;
+    DIOBJECTDATAFORMAT *obj_df = NULL;
+    int i, action = 0, num_actions = 0;
+
+    if (This->base.acquired) return DIERR_ACQUIRED;
+
+    data_format.dwSize     = sizeof(data_format);
+    data_format.dwObjSize  = sizeof(DIOBJECTDATAFORMAT);
+    data_format.dwFlags    = DIDF_ABSAXIS;
+    data_format.dwDataSize = lpdiaf->dwDataSize;
+
+    /* count the actions */
+    for (i=0; i < lpdiaf->dwNumActions; i++)
+        if ((lpdiaf->rgoAction[i].dwSemantic & DIKEYBOARD_MASK) == DIKEYBOARD_MASK)
+            num_actions++;
+
+    if (num_actions == 0) return DI_NOEFFECT;
+
+    This->base.num_actions = num_actions;
+    This->base.action_map = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+        sizeof(ActionMap)*num_actions);
+
+    /* construct the action map */
+    obj_df = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+        sizeof(DIOBJECTDATAFORMAT)*num_actions);
+    data_format.rgodf      = (LPDIOBJECTDATAFORMAT)obj_df;
+    data_format.dwNumObjs  = num_actions;
+
+    for (i = 0; i < lpdiaf->dwNumActions; i++)
+    {
+        if ((lpdiaf->rgoAction[i].dwSemantic & DIKEYBOARD_MASK) == DIKEYBOARD_MASK)
+        {
+            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++;
+        }
+    }
+
+    IDirectInputDevice8_SetDataFormat(iface, &data_format);
+
+    HeapFree( GetProcessHeap(), 0, obj_df);
+
+    return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+}
+
 static const IDirectInputDevice8AVtbl SysKeyboardAvt =
 {
     IDirectInputDevice2AImpl_QueryInterface,
@@ -618,7 +698,7 @@ static const IDirectInputDevice8AVtbl SysKeyboardAvt =
     IDirectInputDevice7AImpl_EnumEffectsInFile,
     IDirectInputDevice7AImpl_WriteEffectToFile,
     SysKeyboardAImpl_BuildActionMap,
-    IDirectInputDevice8AImpl_SetActionMap,
+    SysKeyboardAImpl_SetActionMap,
     IDirectInputDevice8AImpl_GetImageInfo
 };
 
@@ -654,6 +734,6 @@ static const IDirectInputDevice8WVtbl SysKeyboardWvt =
     IDirectInputDevice7WImpl_EnumEffectsInFile,
     IDirectInputDevice7WImpl_WriteEffectToFile,
     SysKeyboardWImpl_BuildActionMap,
-    IDirectInputDevice8WImpl_SetActionMap,
+    SysKeyboardWImpl_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo
 };
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 0f92f03..9f98fc1 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -828,6 +828,55 @@ HRESULT WINAPI SysMouseWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
     return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
 }
 
+HRESULT WINAPI SysMouseAImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface,
+                                          LPDIACTIONFORMATA lpdiaf,
+                                          LPCSTR lpszUserName,
+                                          DWORD dwFlags)
+{
+    SysMouseImpl *This = impl_from_IDirectInputDevice8A(iface);
+    DIACTIONFORMATW diafW;
+    HRESULT hr;
+
+    diafW.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+        sizeof(DIACTIONW)*lpdiaf->dwNumActions);
+    _copy_diactionformatAtoW( &diafW, lpdiaf);
+
+    hr = IDirectInputDevice8_SetActionMap( &This->base.IDirectInputDevice8W_iface,
+        &diafW, NULL, dwFlags);
+
+    _copy_diactionformatWtoA( lpdiaf, &diafW);
+
+    HeapFree( GetProcessHeap(), 0, diafW.rgoAction);
+
+    return hr;
+
+}
+
+HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
+                                          LPDIACTIONFORMATW lpdiaf,
+                                          LPCWSTR lpszUserName,
+                                          DWORD dwFlags)
+{
+    SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
+    int i, num_actions = 0;
+
+    FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
+
+    if (This->base.acquired) return DIERR_ACQUIRED;
+
+    /* count the actions */
+    for (i=0; i < lpdiaf->dwNumActions; i++)
+        if ((lpdiaf->rgoAction[i].dwSemantic & DIMOUSE_MASK) == DIMOUSE_MASK)
+            num_actions++;
+
+    if (num_actions == 0) return DI_NOEFFECT;
+
+    /* We can get the data format right after the mapping is right */
+    IDirectInputDevice8_SetDataFormat(iface, &c_dfDIMouse);
+
+    return IDirectInputDevice8WImpl_SetActionMap(iface, lpdiaf, lpszUserName, dwFlags);
+}
+
 static const IDirectInputDevice8AVtbl SysMouseAvt =
 {
     IDirectInputDevice2AImpl_QueryInterface,
@@ -860,7 +909,7 @@ static const IDirectInputDevice8AVtbl SysMouseAvt =
     IDirectInputDevice7AImpl_EnumEffectsInFile,
     IDirectInputDevice7AImpl_WriteEffectToFile,
     SysMouseAImpl_BuildActionMap,
-    IDirectInputDevice8AImpl_SetActionMap,
+    SysMouseAImpl_SetActionMap,
     IDirectInputDevice8AImpl_GetImageInfo
 };
 
@@ -896,6 +945,6 @@ static const IDirectInputDevice8WVtbl SysMouseWvt =
     IDirectInputDevice7WImpl_EnumEffectsInFile,
     IDirectInputDevice7WImpl_WriteEffectToFile,
     SysMouseWImpl_BuildActionMap,
-    IDirectInputDevice8WImpl_SetActionMap,
+    SysMouseWImpl_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo
 };
-- 
1.7.0.4




More information about the wine-patches mailing list