Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput/ansi.c | 105 ++++++++++++++++++++++++++++++ dlls/dinput/device_private.h | 2 + dlls/dinput/joystick.c | 30 --------- dlls/dinput/joystick_linux.c | 2 +- dlls/dinput/joystick_linuxinput.c | 2 +- dlls/dinput/joystick_osx.c | 2 +- dlls/dinput/joystick_private.h | 1 - dlls/dinput/keyboard.c | 32 +-------- dlls/dinput/mouse.c | 32 +-------- 9 files changed, 112 insertions(+), 96 deletions(-)
diff --git a/dlls/dinput/ansi.c b/dlls/dinput/ansi.c index a8e5256bfc6..cc29bf8f6a4 100644 --- a/dlls/dinput/ansi.c +++ b/dlls/dinput/ansi.c @@ -90,6 +90,82 @@ static void dieffectinfo_wtoa( const DIEFFECTINFOW *in, DIEFFECTINFOA *out ) WideCharToMultiByte( CP_ACP, 0, in->tszName, -1, out->tszName, sizeof(out->tszName), NULL, NULL ); }
+static HRESULT string_atow( const char *in, WCHAR **out ) +{ + int len; + + *out = NULL; + if (!in) return DI_OK; + + len = MultiByteToWideChar( CP_ACP, 0, in, -1, NULL, 0 ); + if (!(*out = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return DIERR_OUTOFMEMORY; + + MultiByteToWideChar( CP_ACP, 0, in, -1, *out, len ); + return DI_OK; +} + +static void diactionformat_wtoa( const DIACTIONFORMATW *in, DIACTIONFORMATA *out ) +{ + DWORD i; + + out->dwDataSize = in->dwDataSize; + out->dwNumActions = in->dwNumActions; + + for (i = 0; i < in->dwNumActions; ++i) + { + out->rgoAction[i].uAppData = in->rgoAction[i].uAppData; + out->rgoAction[i].dwSemantic = in->rgoAction[i].dwSemantic; + out->rgoAction[i].dwFlags = in->rgoAction[i].dwFlags; + out->rgoAction[i].guidInstance = in->rgoAction[i].guidInstance; + out->rgoAction[i].dwObjID = in->rgoAction[i].dwObjID; + out->rgoAction[i].dwHow = in->rgoAction[i].dwHow; + out->rgoAction[i].lptszActionName = 0; + } + + out->guidActionMap = in->guidActionMap; + out->dwGenre = in->dwGenre; + out->dwBufferSize = in->dwBufferSize; + out->lAxisMin = in->lAxisMin; + out->lAxisMax = in->lAxisMax; + out->hInstString = in->hInstString; + out->ftTimeStamp = in->ftTimeStamp; + out->dwCRC = in->dwCRC; + + WideCharToMultiByte( CP_ACP, 0, in->tszActionMap, -1, out->tszActionMap, + sizeof(out->tszActionMap), NULL, NULL ); +} + +static void diactionformat_atow( const DIACTIONFORMATA *in, DIACTIONFORMATW *out ) +{ + DWORD i; + + out->dwDataSize = in->dwDataSize; + out->dwNumActions = in->dwNumActions; + + for (i = 0; i < out->dwNumActions; ++i) + { + out->rgoAction[i].uAppData = in->rgoAction[i].uAppData; + out->rgoAction[i].dwSemantic = in->rgoAction[i].dwSemantic; + out->rgoAction[i].dwFlags = in->rgoAction[i].dwFlags; + out->rgoAction[i].guidInstance = in->rgoAction[i].guidInstance; + out->rgoAction[i].dwObjID = in->rgoAction[i].dwObjID; + out->rgoAction[i].dwHow = in->rgoAction[i].dwHow; + out->rgoAction[i].lptszActionName = 0; + } + + out->guidActionMap = in->guidActionMap; + out->dwGenre = in->dwGenre; + out->dwBufferSize = in->dwBufferSize; + out->lAxisMin = in->lAxisMin; + out->lAxisMax = in->lAxisMax; + out->hInstString = in->hInstString; + out->ftTimeStamp = in->ftTimeStamp; + out->dwCRC = in->dwCRC; + + MultiByteToWideChar( CP_ACP, 0, in->tszActionMap, -1, out->tszActionMap, + sizeof(out->tszActionMap) / sizeof(WCHAR) ); +} + static void dideviceimageinfo_wtoa( const DIDEVICEIMAGEINFOW *in, DIDEVICEIMAGEINFOA *out ) { WideCharToMultiByte( CP_ACP, 0, in->tszImagePath, -1, out->tszImagePath, @@ -416,6 +492,35 @@ HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile( IDirectInputDevice8A return IDirectInputDevice8_WriteEffectToFile( iface_w, filename_w, entries, file_effect, flags ); }
+HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap( IDirectInputDevice8A *iface_a, DIACTIONFORMATA *format_a, + const char *username_a, DWORD flags ) +{ + IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a ); + IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl ); + DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)}; + HRESULT hr; + WCHAR *username_w; + + if (!format_a) return E_POINTER; + if (format_a->dwSize != sizeof(DIACTIONFORMATA)) return DIERR_INVALIDPARAM; + if (format_a->dwActionSize != sizeof(DIACTIONA)) return DIERR_INVALIDPARAM; + if (FAILED(hr = string_atow( username_a, &username_w ))) return hr; + + format_w.dwNumActions = format_a->dwNumActions; + format_w.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, format_a->dwNumActions * sizeof(DIACTIONW) ); + if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY; + else + { + diactionformat_atow( format_a, &format_w ); + hr = IDirectInputDevice8_BuildActionMap( iface_w, &format_w, username_w, flags ); + diactionformat_wtoa( &format_w, format_a ); + HeapFree( GetProcessHeap(), 0, format_w.rgoAction ); + } + + HeapFree( GetProcessHeap(), 0, username_w ); + return hr; +} + HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo( IDirectInputDevice8A *iface_a, DIDEVICEIMAGEINFOHEADERA *header_a ) { IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a ); diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h index 0bebc36076d..1e5a2e1b836 100644 --- a/dlls/dinput/device_private.h +++ b/dlls/dinput/device_private.h @@ -248,6 +248,8 @@ extern HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVIC LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap( LPDIRECTINPUTDEVICE8A iface, DIACTIONFORMATA *format, + const char *username, DWORD flags ) DECLSPEC_HIDDEN; extern HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo(LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader) DECLSPEC_HIDDEN; extern HRESULT WINAPI IDirectInputDevice8WImpl_GetImageInfo(LPDIRECTINPUTDEVICE8W iface, diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c index d048e0f821f..708bee44857 100644 --- a/dlls/dinput/joystick.c +++ b/dlls/dinput/joystick.c @@ -773,36 +773,6 @@ HRESULT WINAPI JoystickWGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags); }
-HRESULT WINAPI JoystickAGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, - LPDIACTIONFORMATA lpdiaf, - LPCSTR lpszUserName, - DWORD dwFlags) -{ - JoystickGenericImpl *This = impl_from_IDirectInputDevice8A(iface); - DIACTIONFORMATW diafW; - HRESULT hr; - WCHAR *lpszUserNameW = NULL; - int username_size; - - diafW.rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*lpdiaf->dwNumActions); - _copy_diactionformatAtoW(&diafW, lpdiaf); - - if (lpszUserName != NULL) - { - username_size = MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, NULL, 0); - lpszUserNameW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*username_size); - MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, lpszUserNameW, username_size); - } - - hr = JoystickWGenericImpl_BuildActionMap(&This->base.IDirectInputDevice8W_iface, &diafW, lpszUserNameW, dwFlags); - - _copy_diactionformatWtoA(lpdiaf, &diafW); - HeapFree(GetProcessHeap(), 0, diafW.rgoAction); - HeapFree(GetProcessHeap(), 0, lpszUserNameW); - - return hr; -} - HRESULT WINAPI JoystickWGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c index 8290eef0bcb..e0102ec1f4e 100644 --- a/dlls/dinput/joystick_linux.c +++ b/dlls/dinput/joystick_linux.c @@ -909,7 +909,7 @@ static const IDirectInputDevice8AVtbl JoystickAvt = IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, IDirectInputDevice7AImpl_WriteEffectToFile, - JoystickAGenericImpl_BuildActionMap, + IDirectInputDevice8AImpl_BuildActionMap, JoystickAGenericImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c index dd59976719a..0ef18de968e 100644 --- a/dlls/dinput/joystick_linuxinput.c +++ b/dlls/dinput/joystick_linuxinput.c @@ -1339,7 +1339,7 @@ static const IDirectInputDevice8AVtbl JoystickAvt = IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, IDirectInputDevice7AImpl_WriteEffectToFile, - JoystickAGenericImpl_BuildActionMap, + IDirectInputDevice8AImpl_BuildActionMap, JoystickAGenericImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c index b72322e0bd6..56886a6904d 100644 --- a/dlls/dinput/joystick_osx.c +++ b/dlls/dinput/joystick_osx.c @@ -1600,7 +1600,7 @@ static const IDirectInputDevice8AVtbl JoystickAvt = IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, IDirectInputDevice7AImpl_WriteEffectToFile, - JoystickAGenericImpl_BuildActionMap, + IDirectInputDevice8AImpl_BuildActionMap, JoystickAGenericImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; diff --git a/dlls/dinput/joystick_private.h b/dlls/dinput/joystick_private.h index 235ec962fb8..d4dabcb5dbd 100644 --- a/dlls/dinput/joystick_private.h +++ b/dlls/dinput/joystick_private.h @@ -77,7 +77,6 @@ HRESULT WINAPI JoystickWGenericImpl_Poll(LPDIRECTINPUTDEVICE8W iface) DECLSPEC_H
HRESULT WINAPI JoystickWGenericImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface, DWORD len, LPVOID ptr) DECLSPEC_HIDDEN;
-HRESULT WINAPI JoystickAGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) DECLSPEC_HIDDEN; HRESULT WINAPI JoystickWGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) DECLSPEC_HIDDEN;
HRESULT WINAPI JoystickAGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) DECLSPEC_HIDDEN; diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index d9c3f02e669..5143eb4752c 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -554,36 +554,6 @@ static HRESULT WINAPI SysKeyboardWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W ifac return _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIKEYBOARD_MASK, &c_dfDIKeyboard); }
-static HRESULT WINAPI SysKeyboardAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, - LPDIACTIONFORMATA lpdiaf, - LPCSTR lpszUserName, - DWORD dwFlags) -{ - SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface); - DIACTIONFORMATW diafW; - HRESULT hr; - WCHAR *lpszUserNameW = NULL; - int username_size; - - diafW.rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*lpdiaf->dwNumActions); - _copy_diactionformatAtoW(&diafW, lpdiaf); - - if (lpszUserName != NULL) - { - username_size = MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, NULL, 0); - lpszUserNameW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*username_size); - MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, lpszUserNameW, username_size); - } - - hr = SysKeyboardWImpl_BuildActionMap(&This->base.IDirectInputDevice8W_iface, &diafW, lpszUserNameW, dwFlags); - - _copy_diactionformatWtoA(lpdiaf, &diafW); - HeapFree(GetProcessHeap(), 0, diafW.rgoAction); - HeapFree(GetProcessHeap(), 0, lpszUserNameW); - - return hr; -} - static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, @@ -655,7 +625,7 @@ static const IDirectInputDevice8AVtbl SysKeyboardAvt = IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, IDirectInputDevice7AImpl_WriteEffectToFile, - SysKeyboardAImpl_BuildActionMap, + IDirectInputDevice8AImpl_BuildActionMap, SysKeyboardAImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index f5f6bf2214a..62bc6b1f006 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -807,36 +807,6 @@ static HRESULT WINAPI SysMouseWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, return _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIMOUSE_MASK, &c_dfDIMouse2); }
-static HRESULT WINAPI SysMouseAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, - LPDIACTIONFORMATA lpdiaf, - LPCSTR lpszUserName, - DWORD dwFlags) -{ - SysMouseImpl *This = impl_from_IDirectInputDevice8A(iface); - DIACTIONFORMATW diafW; - HRESULT hr; - WCHAR *lpszUserNameW = NULL; - int username_size; - - diafW.rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*lpdiaf->dwNumActions); - _copy_diactionformatAtoW(&diafW, lpdiaf); - - if (lpszUserName != NULL) - { - username_size = MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, NULL, 0); - lpszUserNameW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*username_size); - MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, lpszUserNameW, username_size); - } - - hr = SysMouseWImpl_BuildActionMap(&This->base.IDirectInputDevice8W_iface, &diafW, lpszUserNameW, dwFlags); - - _copy_diactionformatWtoA(lpdiaf, &diafW); - HeapFree(GetProcessHeap(), 0, diafW.rgoAction); - HeapFree(GetProcessHeap(), 0, lpszUserNameW); - - return hr; -} - static HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, @@ -908,7 +878,7 @@ static const IDirectInputDevice8AVtbl SysMouseAvt = IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, IDirectInputDevice7AImpl_WriteEffectToFile, - SysMouseAImpl_BuildActionMap, + IDirectInputDevice8AImpl_BuildActionMap, SysMouseAImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo };