[PATCH 3/9] dinput: Factor all BuildActionMap wrappers together.

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


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/device.c         | 160 ++++++++++++++++++-----------------
 dlls/dinput/device_private.h |   1 -
 dlls/dinput/joystick_hid.c   |  12 +--
 dlls/dinput/keyboard.c       |  13 +--
 dlls/dinput/mouse.c          |  12 +--
 5 files changed, 87 insertions(+), 111 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 6c2fe7737d5..5528d3d328c 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -827,68 +827,6 @@ static BOOL set_app_data(IDirectInputDeviceImpl *dev, int offset, UINT_PTR app_d
     return TRUE;
 }
 
-HRESULT _build_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, DWORD devMask, LPCDIDATAFORMAT df)
-{
-    IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
-    WCHAR username[MAX_PATH];
-    DWORD username_size = MAX_PATH;
-    int i;
-    BOOL load_success = FALSE, has_actions = FALSE;
-
-    /* Unless asked the contrary by these flags, try to load a previous mapping */
-    if (!(dwFlags & DIDBAM_HWDEFAULTS))
-    {
-        /* Retrieve logged user name if necessary */
-        if (lpszUserName == NULL)
-            GetUserNameW(username, &username_size);
-        else
-            lstrcpynW(username, lpszUserName, MAX_PATH);
-
-        load_success = load_mapping_settings(This, lpdiaf, username);
-    }
-
-    if (load_success) return DI_OK;
-
-    for (i=0; i < lpdiaf->dwNumActions; i++)
-    {
-        /* Don't touch a user configured action */
-        if (lpdiaf->rgoAction[i].dwHow == DIAH_USERCONFIG) continue;
-
-        if ((lpdiaf->rgoAction[i].dwSemantic & devMask) == devMask)
-        {
-            DWORD obj_id = semantic_to_obj_id(This, lpdiaf->rgoAction[i].dwSemantic);
-            DWORD type = DIDFT_GETTYPE(obj_id);
-            DWORD inst = DIDFT_GETINSTANCE(obj_id);
-
-            LPDIOBJECTDATAFORMAT odf;
-
-            if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
-            if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
-
-            /* Make sure the object exists */
-            odf = dataformat_to_odf_by_type(df, inst, type);
-
-            if (odf != NULL)
-            {
-                lpdiaf->rgoAction[i].dwObjID = obj_id;
-                lpdiaf->rgoAction[i].guidInstance = This->guid;
-                lpdiaf->rgoAction[i].dwHow = DIAH_DEFAULT;
-                has_actions = TRUE;
-            }
-        }
-        else if (!(dwFlags & DIDBAM_PRESERVE))
-        {
-            /* We must clear action data belonging to other devices */
-            memset(&lpdiaf->rgoAction[i].guidInstance, 0, sizeof(GUID));
-            lpdiaf->rgoAction[i].dwHow = DIAH_UNMAPPED;
-        }
-    }
-
-    if (!has_actions) return DI_NOEFFECT;
-
-    return  IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
-}
-
 HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, LPCDIDATAFORMAT df)
 {
     IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
@@ -986,7 +924,7 @@ HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, L
         dps.wsz[0] = '\0';
     else
         lstrcpynW(dps.wsz, username, ARRAY_SIZE(dps.wsz));
-    IDirectInputDevice8_SetProperty(iface, DIPROP_USERNAME, &dps.diph);
+    IDirectInputDevice2WImpl_SetProperty(iface, DIPROP_USERNAME, &dps.diph);
 
     /* Save the settings to disk */
     save_mapping_settings(iface, lpdiaf, username);
@@ -1735,20 +1673,90 @@ HRESULT WINAPI IDirectInputDevice7WImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8W
     return DI_OK;
 }
 
-HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
-						       LPDIACTIONFORMATW lpdiaf,
-						       LPCWSTR lpszUserName,
-						       DWORD dwFlags)
+HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap( IDirectInputDevice8W *iface, DIACTIONFORMATW *format,
+                                                        const WCHAR *username, DWORD flags )
 {
-    IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
-    FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", This, lpdiaf, debugstr_w(lpszUserName), dwFlags);
-#define X(x) if (dwFlags & x) FIXME("\tdwFlags =|"#x"\n");
-	X(DIDBAM_DEFAULT)
-	X(DIDBAM_PRESERVE)
-	X(DIDBAM_INITIALIZE)
-	X(DIDBAM_HWDEFAULTS)
-#undef X
-  
+    IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8W( iface );
+    BOOL load_success = FALSE, has_actions = FALSE;
+    DWORD genre, username_len = MAX_PATH;
+    WCHAR username_buf[MAX_PATH];
+    const DIDATAFORMAT *df;
+    DWORD devMask;
+    int i;
+
+    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:
+        devMask = DIKEYBOARD_MASK;
+        df = &c_dfDIKeyboard;
+        break;
+    case DIDEVTYPE_MOUSE:
+    case DI8DEVTYPE_MOUSE:
+        devMask = DIMOUSE_MASK;
+        df = &c_dfDIMouse2;
+        break;
+    default:
+        devMask = DIGENRE_ANY;
+        df = impl->data_format.wine_df;
+        break;
+    }
+
+    /* Unless asked the contrary by these flags, try to load a previous mapping */
+    if (!(flags & DIDBAM_HWDEFAULTS))
+    {
+        /* Retrieve logged user name if necessary */
+        if (username == NULL) GetUserNameW( username_buf, &username_len );
+        else lstrcpynW( username_buf, username, MAX_PATH );
+        load_success = load_mapping_settings( impl, format, username_buf );
+    }
+
+    if (load_success) return DI_OK;
+
+    for (i = 0; i < format->dwNumActions; i++)
+    {
+        /* Don't touch a user configured action */
+        if (format->rgoAction[i].dwHow == DIAH_USERCONFIG) continue;
+
+        genre = format->rgoAction[i].dwSemantic & DIGENRE_ANY;
+        if (devMask == genre || (devMask == DIGENRE_ANY && genre != DIMOUSE_MASK && genre != DIKEYBOARD_MASK))
+        {
+            DWORD obj_id = semantic_to_obj_id( impl, format->rgoAction[i].dwSemantic );
+            DWORD type = DIDFT_GETTYPE( obj_id );
+            DWORD inst = DIDFT_GETINSTANCE( obj_id );
+
+            LPDIOBJECTDATAFORMAT odf;
+
+            if (type == DIDFT_PSHBUTTON) type = DIDFT_BUTTON;
+            if (type == DIDFT_RELAXIS) type = DIDFT_AXIS;
+
+            /* Make sure the object exists */
+            odf = dataformat_to_odf_by_type( df, inst, type );
+
+            if (odf != NULL)
+            {
+                format->rgoAction[i].dwObjID = obj_id;
+                format->rgoAction[i].guidInstance = impl->guid;
+                format->rgoAction[i].dwHow = DIAH_DEFAULT;
+                has_actions = TRUE;
+            }
+        }
+        else if (!(flags & DIDBAM_PRESERVE))
+        {
+            /* We must clear action data belonging to other devices */
+            memset( &format->rgoAction[i].guidInstance, 0, sizeof(GUID) );
+            format->rgoAction[i].dwHow = DIAH_UNMAPPED;
+        }
+    }
+
+    if (!has_actions) return DI_NOEFFECT;
+    if (flags & (DIDBAM_DEFAULT|DIDBAM_PRESERVE|DIDBAM_INITIALIZE|DIDBAM_HWDEFAULTS))
+        FIXME("Unimplemented flags %#x\n", flags);
     return DI_OK;
 }
 
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 3fcb9240581..6aed93a130b 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -114,7 +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 _build_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, DWORD devMask, LPCDIDATAFORMAT df)  DECLSPEC_HIDDEN;
 extern HRESULT _set_action_map(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags, LPCDIDATAFORMAT df) DECLSPEC_HIDDEN;
 
 /* And the stubs */
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 65b9a809e5c..5921b473f3a 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -1385,16 +1385,6 @@ static HRESULT WINAPI hid_joystick_Poll( IDirectInputDevice8W *iface )
     return hr;
 }
 
-static HRESULT WINAPI hid_joystick_BuildActionMap( IDirectInputDevice8W *iface, DIACTIONFORMATW *format,
-                                                   const WCHAR *username, DWORD flags )
-{
-    FIXME( "iface %p, format %p, username %s, flags %#x stub!\n", iface, format, debugstr_w(username), flags );
-
-    if (!format) return DIERR_INVALIDPARAM;
-
-    return DIERR_UNSUPPORTED;
-}
-
 static HRESULT WINAPI hid_joystick_SetActionMap( IDirectInputDevice8W *iface, DIACTIONFORMATW *format,
                                                  const WCHAR *username, DWORD flags )
 {
@@ -1443,7 +1433,7 @@ static const IDirectInputDevice8WVtbl hid_joystick_vtbl =
     IDirectInputDevice7WImpl_EnumEffectsInFile,
     IDirectInputDevice7WImpl_WriteEffectToFile,
     /*** IDirectInputDevice8 methods ***/
-    hid_joystick_BuildActionMap,
+    IDirectInputDevice8WImpl_BuildActionMap,
     hid_joystick_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo,
 };
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 0a8c5b282ba..98fcf253afa 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_BuildActionMap(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  _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIKEYBOARD_MASK, &c_dfDIKeyboard);
-}
-
 static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
                                                     LPDIACTIONFORMATW lpdiaf,
                                                     LPCWSTR lpszUserName,
@@ -463,7 +452,7 @@ static const IDirectInputDevice8WVtbl SysKeyboardWvt =
     IDirectInputDevice2WImpl_SendDeviceData,
     IDirectInputDevice7WImpl_EnumEffectsInFile,
     IDirectInputDevice7WImpl_WriteEffectToFile,
-    SysKeyboardWImpl_BuildActionMap,
+    IDirectInputDevice8WImpl_BuildActionMap,
     SysKeyboardWImpl_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo
 };
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 6901cc09a31..92c8b110e57 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -676,16 +676,6 @@ static HRESULT WINAPI SysMouseWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface,
     return res;
 }
 
-static HRESULT WINAPI SysMouseWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
-                                                   LPDIACTIONFORMATW lpdiaf,
-                                                   LPCWSTR lpszUserName,
-                                                   DWORD dwFlags)
-{
-    FIXME("(%p)->(%p,%s,%08x): semi-stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags);
-
-    return _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIMOUSE_MASK, &c_dfDIMouse2);
-}
-
 static HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
                                                  LPDIACTIONFORMATW lpdiaf,
                                                  LPCWSTR lpszUserName,
@@ -728,7 +718,7 @@ static const IDirectInputDevice8WVtbl SysMouseWvt =
     IDirectInputDevice2WImpl_SendDeviceData,
     IDirectInputDevice7WImpl_EnumEffectsInFile,
     IDirectInputDevice7WImpl_WriteEffectToFile,
-    SysMouseWImpl_BuildActionMap,
+    IDirectInputDevice8WImpl_BuildActionMap,
     SysMouseWImpl_SetActionMap,
     IDirectInputDevice8WImpl_GetImageInfo
 };
-- 
2.33.0




More information about the wine-devel mailing list