[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