[PATCH 4/9] dinput: Factor all SetActionMap wrappers together.

Rémi Bernon rbernon at codeweavers.com
Wed Oct 13 02:21:15 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/device.c         | 228 +++++++++++++++++++----------------
 dlls/dinput/device_private.h |   4 +-
 dlls/dinput/joystick_hid.c   |  14 +--
 dlls/dinput/keyboard.c       |  13 +-
 dlls/dinput/mouse.c          |  13 +-
 5 files changed, 128 insertions(+), 144 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 5528d3d328c..0f649ec59e8 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -827,111 +827,6 @@ static BOOL set_app_data(IDirectInputDeviceImpl *dev, int offset, UINT_PTR app_d
     return TRUE;
 }
 
-HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, LPCDIDATAFORMAT df)
-{
-    IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
-    DIDATAFORMAT data_format;
-    DIOBJECTDATAFORMAT *obj_df = NULL;
-    DIPROPDWORD dp;
-    DIPROPRANGE dpr;
-    DIPROPSTRING dps;
-    WCHAR username[MAX_PATH];
-    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;
-
-    data_format.dwSize = sizeof(data_format);
-    data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
-    data_format.dwFlags = DIDF_RELAXIS;
-    data_format.dwDataSize = lpdiaf->dwDataSize;
-
-    /* Count the actions */
-    for (i=0; i < lpdiaf->dwNumActions; i++)
-        if (IsEqualGUID(&This->guid, &lpdiaf->rgoAction[i].guidInstance))
-            num_actions++;
-
-    if (num_actions == 0) return DI_NOEFFECT;
-
-    /* Construct the dataformat and actionmap */
-    obj_df = malloc( sizeof(DIOBJECTDATAFORMAT) * num_actions );
-    data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df;
-    data_format.dwNumObjs = num_actions;
-
-    action_map = malloc( sizeof(ActionMap) * num_actions );
-
-    for (i = 0; i < lpdiaf->dwNumActions; i++)
-    {
-        if (IsEqualGUID(&This->guid, &lpdiaf->rgoAction[i].guidInstance))
-        {
-            DWORD inst = DIDFT_GETINSTANCE(lpdiaf->rgoAction[i].dwObjID);
-            DWORD type = DIDFT_GETTYPE(lpdiaf->rgoAction[i].dwObjID);
-            LPDIOBJECTDATAFORMAT obj;
-
-            if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
-            if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
-
-            obj = dataformat_to_odf_by_type(df, inst, type);
-
-            memcpy(&obj_df[action], obj, df->dwObjSize);
-
-            action_map[action].uAppData = lpdiaf->rgoAction[i].uAppData;
-            action_map[action].offset = offset;
-            obj_df[action].dwOfs = offset;
-            offset += (type & DIDFT_BUTTON) ? 1 : 4;
-
-            action++;
-        }
-    }
-
-    IDirectInputDevice8_SetDataFormat(iface, &data_format);
-
-    This->action_map = action_map;
-    This->num_actions = num_actions;
-
-    free( obj_df );
-
-    /* Set the device properties according to the action format */
-    dpr.diph.dwSize = sizeof(DIPROPRANGE);
-    dpr.lMin = lpdiaf->lAxisMin;
-    dpr.lMax = lpdiaf->lAxisMax;
-    dpr.diph.dwHeaderSize = sizeof(DIPROPHEADER);
-    dpr.diph.dwHow = DIPH_DEVICE;
-    IDirectInputDevice8_SetProperty(iface, DIPROP_RANGE, &dpr.diph);
-
-    if (lpdiaf->dwBufferSize > 0)
-    {
-        dp.diph.dwSize = sizeof(DIPROPDWORD);
-        dp.dwData = lpdiaf->dwBufferSize;
-        dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
-        dp.diph.dwHow = DIPH_DEVICE;
-        IDirectInputDevice8_SetProperty(iface, DIPROP_BUFFERSIZE, &dp.diph);
-    }
-
-    /* Retrieve logged user name if necessary */
-    if (lpszUserName == NULL)
-        GetUserNameW(username, &username_size);
-    else
-        lstrcpynW(username, lpszUserName, MAX_PATH);
-
-    dps.diph.dwSize = sizeof(dps);
-    dps.diph.dwHeaderSize = sizeof(DIPROPHEADER);
-    dps.diph.dwObj = 0;
-    dps.diph.dwHow = DIPH_DEVICE;
-    if (dwFlags & DIDSAM_NOUSER)
-        dps.wsz[0] = '\0';
-    else
-        lstrcpynW(dps.wsz, username, ARRAY_SIZE(dps.wsz));
-    IDirectInputDevice2WImpl_SetProperty(iface, DIPROP_USERNAME, &dps.diph);
-
-    /* Save the settings to disk */
-    save_mapping_settings(iface, lpdiaf, username);
-
-    return DI_OK;
-}
-
 /******************************************************************************
  *	queue_event - add new event to the ring queue
  */
@@ -1760,6 +1655,129 @@ HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap( IDirectInputDevice8W *if
     return DI_OK;
 }
 
+HRESULT WINAPI IDirectInputDevice8WImpl_SetActionMap( IDirectInputDevice8W *iface, DIACTIONFORMATW *format,
+                                                      const WCHAR *username, DWORD flags )
+{
+    IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8W( iface );
+    DIDATAFORMAT data_format;
+    DIOBJECTDATAFORMAT *obj_df = NULL;
+    DIPROPDWORD dp;
+    DIPROPRANGE dpr;
+    DIPROPSTRING dps;
+    WCHAR username_buf[MAX_PATH];
+    DWORD username_len = MAX_PATH;
+    int i, action = 0, num_actions = 0;
+    unsigned int offset = 0;
+    const DIDATAFORMAT *df;
+    ActionMap *action_map;
+
+    FIXME( "iface %p, format %p, username %s, flags %#x semi-stub!\n", iface, format,
+           debugstr_w(username), flags );
+
+    if (!format) return DIERR_INVALIDPARAM;
+
+    switch (GET_DIDEVICE_TYPE( impl->instance.dwDevType ))
+    {
+    case DIDEVTYPE_KEYBOARD:
+    case DI8DEVTYPE_KEYBOARD:
+        df = &c_dfDIKeyboard;
+        break;
+    case DIDEVTYPE_MOUSE:
+    case DI8DEVTYPE_MOUSE:
+        df = &c_dfDIMouse2;
+        break;
+    default:
+        df = impl->data_format.wine_df;
+        break;
+    }
+
+    if (impl->acquired) return DIERR_ACQUIRED;
+
+    data_format.dwSize = sizeof(data_format);
+    data_format.dwObjSize = sizeof(DIOBJECTDATAFORMAT);
+    data_format.dwFlags = DIDF_RELAXIS;
+    data_format.dwDataSize = format->dwDataSize;
+
+    /* Count the actions */
+    for (i = 0; i < format->dwNumActions; i++)
+        if (IsEqualGUID( &impl->guid, &format->rgoAction[i].guidInstance ))
+            num_actions++;
+
+    if (num_actions == 0) return DI_NOEFFECT;
+
+    /* Construct the dataformat and actionmap */
+    obj_df = malloc( sizeof(DIOBJECTDATAFORMAT) * num_actions );
+    data_format.rgodf = (LPDIOBJECTDATAFORMAT)obj_df;
+    data_format.dwNumObjs = num_actions;
+
+    action_map = malloc( sizeof(ActionMap) * num_actions );
+
+    for (i = 0; i < format->dwNumActions; i++)
+    {
+        if (IsEqualGUID( &impl->guid, &format->rgoAction[i].guidInstance ))
+        {
+            DWORD inst = DIDFT_GETINSTANCE( format->rgoAction[i].dwObjID );
+            DWORD type = DIDFT_GETTYPE( format->rgoAction[i].dwObjID );
+            LPDIOBJECTDATAFORMAT obj;
+
+            if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
+            if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
+
+            obj = dataformat_to_odf_by_type( df, inst, type );
+
+            memcpy( &obj_df[action], obj, df->dwObjSize );
+
+            action_map[action].uAppData = format->rgoAction[i].uAppData;
+            action_map[action].offset = offset;
+            obj_df[action].dwOfs = offset;
+            offset += (type & DIDFT_BUTTON) ? 1 : 4;
+
+            action++;
+        }
+    }
+
+    IDirectInputDevice8_SetDataFormat( iface, &data_format );
+
+    impl->action_map = action_map;
+    impl->num_actions = num_actions;
+
+    free( obj_df );
+
+    /* Set the device properties according to the action format */
+    dpr.diph.dwSize = sizeof(DIPROPRANGE);
+    dpr.lMin = format->lAxisMin;
+    dpr.lMax = format->lAxisMax;
+    dpr.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+    dpr.diph.dwHow = DIPH_DEVICE;
+    IDirectInputDevice8_SetProperty( iface, DIPROP_RANGE, &dpr.diph );
+
+    if (format->dwBufferSize > 0)
+    {
+        dp.diph.dwSize = sizeof(DIPROPDWORD);
+        dp.dwData = format->dwBufferSize;
+        dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+        dp.diph.dwHow = DIPH_DEVICE;
+        IDirectInputDevice8_SetProperty( iface, DIPROP_BUFFERSIZE, &dp.diph );
+    }
+
+    /* Retrieve logged user name if necessary */
+    if (username == NULL) GetUserNameW( username_buf, &username_len );
+    else lstrcpynW( username_buf, username, MAX_PATH );
+
+    dps.diph.dwSize = sizeof(dps);
+    dps.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+    dps.diph.dwObj = 0;
+    dps.diph.dwHow = DIPH_DEVICE;
+    if (flags & DIDSAM_NOUSER) dps.wsz[0] = '\0';
+    else lstrcpynW( dps.wsz, username_buf, ARRAY_SIZE(dps.wsz) );
+    IDirectInputDevice2WImpl_SetProperty( iface, DIPROP_USERNAME, &dps.diph );
+
+    /* Save the settings to disk */
+    save_mapping_settings( iface, format, username_buf );
+
+    return DI_OK;
+}
+
 HRESULT WINAPI IDirectInputDevice8WImpl_GetImageInfo(LPDIRECTINPUTDEVICE8W iface,
 						     LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader)
 {
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 6aed93a130b..d61a0a3e6e8 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -114,8 +114,6 @@ extern void _dump_OBJECTINSTANCEW(const DIDEVICEOBJECTINSTANCEW *ddoi)  DECLSPEC
 extern void _dump_DIDATAFORMAT(const DIDATAFORMAT *df)  DECLSPEC_HIDDEN;
 extern const char *_dump_dinput_GUID(const GUID *guid)  DECLSPEC_HIDDEN;
 
-extern HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, LPCDIDATAFORMAT df) DECLSPEC_HIDDEN;
-
 /* And the stubs */
 extern HRESULT WINAPI IDirectInputDevice2WImpl_Acquire(LPDIRECTINPUTDEVICE8W iface) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirectInputDevice2WImpl_Unacquire(LPDIRECTINPUTDEVICE8W iface) DECLSPEC_HIDDEN;
@@ -178,6 +176,8 @@ extern HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVIC
 							      LPDIACTIONFORMATW lpdiaf,
 							      LPCWSTR lpszUserName,
 							      DWORD dwFlags) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI IDirectInputDevice8WImpl_SetActionMap( IDirectInputDevice8W *iface, DIACTIONFORMATW *format,
+                                                             const WCHAR *username, DWORD flags );
 extern HRESULT WINAPI IDirectInputDevice8WImpl_GetImageInfo(LPDIRECTINPUTDEVICE8W iface,
 							    LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader) DECLSPEC_HIDDEN;
 
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 5921b473f3a..13083a6ac77 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -1385,18 +1385,6 @@ static HRESULT WINAPI hid_joystick_Poll( IDirectInputDevice8W *iface )
     return hr;
 }
 
-static HRESULT WINAPI hid_joystick_SetActionMap( IDirectInputDevice8W *iface, DIACTIONFORMATW *format,
-                                                 const WCHAR *username, DWORD flags )
-{
-    struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface );
-
-    TRACE( "iface %p, format %p, username %s, flags %#x.\n", iface, format, debugstr_w(username), flags );
-
-    if (!format) return DIERR_INVALIDPARAM;
-
-    return _set_action_map( iface, format, username, flags, impl->base.data_format.wine_df );
-}
-
 static const IDirectInputDevice8WVtbl hid_joystick_vtbl =
 {
     /*** IUnknown methods ***/
@@ -1434,7 +1422,7 @@ static const IDirectInputDevice8WVtbl hid_joystick_vtbl =
     IDirectInputDevice7WImpl_WriteEffectToFile,
     /*** IDirectInputDevice8 methods ***/
     IDirectInputDevice8WImpl_BuildActionMap,
-    hid_joystick_SetActionMap,
+    IDirectInputDevice8WImpl_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo,
 };
 
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 98fcf253afa..c367162164a 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -410,17 +410,6 @@ static HRESULT WINAPI SysKeyboardWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface)
     return res;
 }
 
-static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
-                                                    LPDIACTIONFORMATW lpdiaf,
-                                                    LPCWSTR lpszUserName,
-                                                    DWORD dwFlags)
-{
-    SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface);
-    FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", This, lpdiaf, debugstr_w(lpszUserName), dwFlags);
-
-    return _set_action_map(iface, lpdiaf, lpszUserName, dwFlags, &c_dfDIKeyboard);
-}
-
 static const IDirectInputDevice8WVtbl SysKeyboardWvt =
 {
     IDirectInputDevice2WImpl_QueryInterface,
@@ -453,6 +442,6 @@ static const IDirectInputDevice8WVtbl SysKeyboardWvt =
     IDirectInputDevice7WImpl_EnumEffectsInFile,
     IDirectInputDevice7WImpl_WriteEffectToFile,
     IDirectInputDevice8WImpl_BuildActionMap,
-    SysKeyboardWImpl_SetActionMap,
+    IDirectInputDevice8WImpl_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo
 };
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 92c8b110e57..e94cd4e7c50 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -676,17 +676,6 @@ static HRESULT WINAPI SysMouseWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface,
     return res;
 }
 
-static HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
-                                                 LPDIACTIONFORMATW lpdiaf,
-                                                 LPCWSTR lpszUserName,
-                                                 DWORD dwFlags)
-{
-    SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
-    FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", This, lpdiaf, debugstr_w(lpszUserName), dwFlags);
-
-    return _set_action_map(iface, lpdiaf, lpszUserName, dwFlags, &c_dfDIMouse2);
-}
-
 static const IDirectInputDevice8WVtbl SysMouseWvt =
 {
     IDirectInputDevice2WImpl_QueryInterface,
@@ -719,6 +708,6 @@ static const IDirectInputDevice8WVtbl SysMouseWvt =
     IDirectInputDevice7WImpl_EnumEffectsInFile,
     IDirectInputDevice7WImpl_WriteEffectToFile,
     IDirectInputDevice8WImpl_BuildActionMap,
-    SysMouseWImpl_SetActionMap,
+    IDirectInputDevice8WImpl_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo
 };
-- 
2.33.0




More information about the wine-devel mailing list