2021-05-25 16:48:55 +00:00
|
|
|
/*
|
|
|
|
* Direct Input ANSI interface wrappers
|
|
|
|
*
|
|
|
|
* Copyright 2021 Rémi Bernon for CodeWeavers
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "windef.h"
|
|
|
|
#include "winbase.h"
|
|
|
|
#include "winreg.h"
|
|
|
|
#include "winuser.h"
|
|
|
|
#include "winerror.h"
|
|
|
|
#include "dinput.h"
|
|
|
|
|
|
|
|
#include "device_private.h"
|
|
|
|
#include "dinput_private.h"
|
|
|
|
|
|
|
|
#include "wine/debug.h"
|
|
|
|
|
|
|
|
static IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A( IDirectInputDevice8A *iface )
|
|
|
|
{
|
|
|
|
return CONTAINING_RECORD( iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface );
|
|
|
|
}
|
|
|
|
|
|
|
|
static IDirectInputDevice8W *IDirectInputDevice8W_from_impl( IDirectInputDeviceImpl *impl )
|
|
|
|
{
|
|
|
|
return &impl->IDirectInputDevice8W_iface;
|
|
|
|
}
|
|
|
|
|
2021-05-25 16:48:57 +00:00
|
|
|
static void dideviceobjectinstance_wtoa( const DIDEVICEOBJECTINSTANCEW *in, DIDEVICEOBJECTINSTANCEA *out )
|
|
|
|
{
|
|
|
|
out->guidType = in->guidType;
|
|
|
|
out->dwOfs = in->dwOfs;
|
|
|
|
out->dwType = in->dwType;
|
|
|
|
out->dwFlags = in->dwFlags;
|
|
|
|
WideCharToMultiByte( CP_ACP, 0, in->tszName, -1, out->tszName, sizeof(out->tszName), NULL, NULL );
|
|
|
|
|
|
|
|
if (out->dwSize <= FIELD_OFFSET( DIDEVICEOBJECTINSTANCEA, dwFFMaxForce )) return;
|
|
|
|
|
|
|
|
out->dwFFMaxForce = in->dwFFMaxForce;
|
|
|
|
out->dwFFForceResolution = in->dwFFForceResolution;
|
|
|
|
out->wCollectionNumber = in->wCollectionNumber;
|
|
|
|
out->wDesignatorIndex = in->wDesignatorIndex;
|
|
|
|
out->wUsagePage = in->wUsagePage;
|
|
|
|
out->wUsage = in->wUsage;
|
|
|
|
out->dwDimension = in->dwDimension;
|
|
|
|
out->wExponent = in->wExponent;
|
|
|
|
out->wReserved = in->wReserved;
|
|
|
|
}
|
|
|
|
|
2021-05-27 08:50:03 +00:00
|
|
|
static void dideviceinstance_wtoa( const DIDEVICEINSTANCEW *in, DIDEVICEINSTANCEA *out )
|
|
|
|
{
|
|
|
|
out->guidInstance = in->guidInstance;
|
|
|
|
out->guidProduct = in->guidProduct;
|
|
|
|
out->dwDevType = in->dwDevType;
|
|
|
|
WideCharToMultiByte( CP_ACP, 0, in->tszInstanceName, -1, out->tszInstanceName,
|
|
|
|
sizeof(out->tszInstanceName), NULL, NULL );
|
|
|
|
WideCharToMultiByte( CP_ACP, 0, in->tszProductName, -1, out->tszProductName,
|
|
|
|
sizeof(out->tszProductName), NULL, NULL );
|
|
|
|
|
|
|
|
if (out->dwSize <= FIELD_OFFSET( DIDEVICEINSTANCEA, guidFFDriver )) return;
|
|
|
|
|
|
|
|
out->guidFFDriver = in->guidFFDriver;
|
|
|
|
out->wUsagePage = in->wUsagePage;
|
|
|
|
out->wUsage = in->wUsage;
|
|
|
|
}
|
|
|
|
|
2021-05-26 09:23:05 +00:00
|
|
|
static void dieffectinfo_wtoa( const DIEFFECTINFOW *in, DIEFFECTINFOA *out )
|
|
|
|
{
|
|
|
|
out->guid = in->guid;
|
|
|
|
out->dwEffType = in->dwEffType;
|
|
|
|
out->dwStaticParams = in->dwStaticParams;
|
|
|
|
out->dwDynamicParams = in->dwDynamicParams;
|
|
|
|
WideCharToMultiByte( CP_ACP, 0, in->tszName, -1, out->tszName, sizeof(out->tszName), NULL, NULL );
|
|
|
|
}
|
|
|
|
|
2021-05-27 08:50:04 +00:00
|
|
|
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) );
|
|
|
|
}
|
|
|
|
|
2021-05-27 08:50:00 +00:00
|
|
|
static void dideviceimageinfo_wtoa( const DIDEVICEIMAGEINFOW *in, DIDEVICEIMAGEINFOA *out )
|
|
|
|
{
|
|
|
|
WideCharToMultiByte( CP_ACP, 0, in->tszImagePath, -1, out->tszImagePath,
|
|
|
|
sizeof(out->tszImagePath), NULL, NULL );
|
|
|
|
|
|
|
|
out->dwFlags = in->dwFlags;
|
|
|
|
out->dwViewID = in->dwViewID;
|
|
|
|
out->rcOverlay = in->rcOverlay;
|
|
|
|
out->dwObjID = in->dwObjID;
|
|
|
|
out->dwcValidPts = in->dwcValidPts;
|
|
|
|
out->rgptCalloutLine[0] = in->rgptCalloutLine[0];
|
|
|
|
out->rgptCalloutLine[1] = in->rgptCalloutLine[1];
|
|
|
|
out->rgptCalloutLine[2] = in->rgptCalloutLine[2];
|
|
|
|
out->rgptCalloutLine[3] = in->rgptCalloutLine[3];
|
|
|
|
out->rgptCalloutLine[4] = in->rgptCalloutLine[4];
|
|
|
|
out->rcCalloutRect = in->rcCalloutRect;
|
|
|
|
out->dwTextAlign = in->dwTextAlign;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void dideviceimageinfoheader_wtoa( const DIDEVICEIMAGEINFOHEADERW *in, DIDEVICEIMAGEINFOHEADERA *out )
|
|
|
|
{
|
|
|
|
DWORD i;
|
|
|
|
|
|
|
|
out->dwcViews = in->dwcViews;
|
|
|
|
out->dwcButtons = in->dwcButtons;
|
|
|
|
out->dwcAxes = in->dwcAxes;
|
|
|
|
out->dwcPOVs = in->dwcPOVs;
|
|
|
|
out->dwBufferUsed = 0;
|
|
|
|
|
|
|
|
for (i = 0; i < in->dwBufferUsed / sizeof(DIDEVICEIMAGEINFOW); ++i)
|
|
|
|
{
|
|
|
|
dideviceimageinfo_wtoa( &in->lprgImageInfoArray[i], &out->lprgImageInfoArray[i] );
|
|
|
|
out->dwBufferUsed += sizeof(DIDEVICEIMAGEINFOA);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-25 16:48:55 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface( IDirectInputDevice8A *iface_a, REFIID iid, void **out )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_QueryInterface( iface_w, iid, out );
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI IDirectInputDevice2AImpl_AddRef( IDirectInputDevice8A *iface_a )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_AddRef( iface_w );
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI IDirectInputDevice2AImpl_Release( IDirectInputDevice8A *iface_a )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_Release( iface_w );
|
|
|
|
}
|
|
|
|
|
2021-05-27 08:50:01 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetCapabilities( IDirectInputDevice8A *iface_a, DIDEVCAPS *caps )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_GetCapabilities( iface_w, caps );
|
|
|
|
}
|
|
|
|
|
2021-05-25 16:48:57 +00:00
|
|
|
struct enum_objects_wtoa_params
|
|
|
|
{
|
|
|
|
LPDIENUMDEVICEOBJECTSCALLBACKA callback;
|
|
|
|
void *ref;
|
|
|
|
};
|
|
|
|
|
|
|
|
static BOOL CALLBACK enum_objects_wtoa_callback( const DIDEVICEOBJECTINSTANCEW *instance_w, void *ref )
|
|
|
|
{
|
|
|
|
struct enum_objects_wtoa_params *params = ref;
|
|
|
|
DIDEVICEOBJECTINSTANCEA instance_a = {sizeof(instance_a)};
|
|
|
|
|
|
|
|
dideviceobjectinstance_wtoa( instance_w, &instance_a );
|
|
|
|
return params->callback( &instance_a, params->ref );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects( IDirectInputDevice8A *iface_a, LPDIENUMDEVICEOBJECTSCALLBACKA callback,
|
|
|
|
void *ref, DWORD flags )
|
|
|
|
{
|
|
|
|
struct enum_objects_wtoa_params params = {callback, ref};
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
|
|
|
|
if (!callback) return DIERR_INVALIDPARAM;
|
|
|
|
|
|
|
|
return IDirectInputDevice8_EnumObjects( iface_w, enum_objects_wtoa_callback, ¶ms, flags );
|
|
|
|
}
|
|
|
|
|
2021-05-25 16:48:55 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetProperty( IDirectInputDevice8A *iface_a, REFGUID guid, DIPROPHEADER *header )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_GetProperty( iface_w, guid, header );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_SetProperty( IDirectInputDevice8A *iface_a, REFGUID guid, const DIPROPHEADER *header )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_SetProperty( iface_w, guid, header );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_Acquire( IDirectInputDevice8A *iface_a )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_Acquire( iface_w );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_Unacquire( IDirectInputDevice8A *iface_a )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_Unacquire( iface_w );
|
|
|
|
}
|
|
|
|
|
2021-05-27 08:50:02 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceState( IDirectInputDevice8A *iface_a, DWORD count, void *data )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_GetDeviceState( iface_w, count, data );
|
|
|
|
}
|
|
|
|
|
2021-05-25 16:48:55 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceData( IDirectInputDevice8A *iface_a, DWORD data_size, DIDEVICEOBJECTDATA *data,
|
|
|
|
DWORD *entries, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_GetDeviceData( iface_w, data_size, data, entries, flags );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat( IDirectInputDevice8A *iface_a, const DIDATAFORMAT *format )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_SetDataFormat( iface_w, format );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification( IDirectInputDevice8A *iface_a, HANDLE event )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_SetEventNotification( iface_w, event );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel( IDirectInputDevice8A *iface_a, HWND window, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_SetCooperativeLevel( iface_w, window, flags );
|
|
|
|
}
|
|
|
|
|
2021-05-26 09:23:04 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetObjectInfo( IDirectInputDevice8A *iface_a, DIDEVICEOBJECTINSTANCEA *instance_a,
|
|
|
|
DWORD obj, DWORD how )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
DIDEVICEOBJECTINSTANCEW instance_w = {sizeof(instance_w)};
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
|
|
if (!instance_a) return E_POINTER;
|
|
|
|
if (instance_a->dwSize != sizeof(DIDEVICEOBJECTINSTANCEA) &&
|
|
|
|
instance_a->dwSize != sizeof(DIDEVICEOBJECTINSTANCE_DX3A))
|
|
|
|
return DIERR_INVALIDPARAM;
|
|
|
|
|
|
|
|
hr = IDirectInputDevice8_GetObjectInfo( iface_w, &instance_w, obj, how );
|
|
|
|
dideviceobjectinstance_wtoa( &instance_w, instance_a );
|
|
|
|
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
2021-05-27 08:50:03 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo( IDirectInputDevice8A *iface_a, DIDEVICEINSTANCEA *instance_a )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
DIDEVICEINSTANCEW instance_w = {sizeof(instance_w)};
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
|
|
if (!instance_a) return E_POINTER;
|
|
|
|
if (instance_a->dwSize != sizeof(DIDEVICEINSTANCEA) && instance_a->dwSize != sizeof(DIDEVICEINSTANCE_DX3A))
|
|
|
|
return DIERR_INVALIDPARAM;
|
|
|
|
|
|
|
|
hr = IDirectInputDevice8_GetDeviceInfo( iface_w, &instance_w );
|
|
|
|
dideviceinstance_wtoa( &instance_w, instance_a );
|
|
|
|
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
2021-05-25 16:48:55 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_RunControlPanel( IDirectInputDevice8A *iface_a, HWND owner, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_RunControlPanel( iface_w, owner, flags );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_Initialize( IDirectInputDevice8A *iface_a, HINSTANCE instance, DWORD version, REFGUID guid )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_Initialize( iface_w, instance, version, guid );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_CreateEffect( IDirectInputDevice8A *iface_a, REFGUID guid, const DIEFFECT *effect,
|
|
|
|
IDirectInputEffect **out, IUnknown *outer )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_CreateEffect( iface_w, guid, effect, out, outer );
|
|
|
|
}
|
|
|
|
|
2021-05-26 09:23:06 +00:00
|
|
|
struct enum_effects_wtoa_params
|
|
|
|
{
|
|
|
|
LPDIENUMEFFECTSCALLBACKA callback;
|
|
|
|
void *ref;
|
|
|
|
};
|
|
|
|
|
|
|
|
static BOOL CALLBACK enum_effects_wtoa_callback( const DIEFFECTINFOW *info_w, void *ref )
|
|
|
|
{
|
|
|
|
struct enum_effects_wtoa_params *params = ref;
|
|
|
|
DIEFFECTINFOA info_a = {sizeof(info_a)};
|
|
|
|
|
|
|
|
dieffectinfo_wtoa( info_w, &info_a );
|
|
|
|
return params->callback( &info_a, params->ref );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_EnumEffects( IDirectInputDevice8A *iface_a, LPDIENUMEFFECTSCALLBACKA callback,
|
|
|
|
void *ref, DWORD type )
|
|
|
|
{
|
|
|
|
struct enum_effects_wtoa_params params = {callback, ref};
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
|
|
|
|
if (!callback) return DIERR_INVALIDPARAM;
|
|
|
|
|
|
|
|
return IDirectInputDevice8_EnumEffects( iface_w, enum_effects_wtoa_callback, ¶ms, type );
|
|
|
|
}
|
|
|
|
|
2021-05-26 09:23:05 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetEffectInfo( IDirectInputDevice8A *iface_a, DIEFFECTINFOA *info_a, REFGUID guid )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
DIEFFECTINFOW info_w = {sizeof(info_w)};
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
|
|
if (!info_a) return E_POINTER;
|
|
|
|
if (info_a->dwSize != sizeof(DIEFFECTINFOA)) return DIERR_INVALIDPARAM;
|
|
|
|
|
|
|
|
hr = IDirectInputDevice8_GetEffectInfo( iface_w, &info_w, guid );
|
|
|
|
dieffectinfo_wtoa( &info_w, info_a );
|
|
|
|
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
2021-05-25 16:48:55 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_GetForceFeedbackState( IDirectInputDevice8A *iface_a, DWORD *state )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_GetForceFeedbackState( iface_w, state );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_SendForceFeedbackCommand( IDirectInputDevice8A *iface_a, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_SendForceFeedbackCommand( iface_w, flags );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_EnumCreatedEffectObjects( IDirectInputDevice8A *iface_a, LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback,
|
|
|
|
void *ref, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_EnumCreatedEffectObjects( iface_w, callback, ref, flags );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_Escape( IDirectInputDevice8A *iface_a, DIEFFESCAPE *escape )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_Escape( iface_w, escape );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_Poll( IDirectInputDevice8A *iface_a )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_Poll( iface_w );
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice2AImpl_SendDeviceData( IDirectInputDevice8A *iface_a, DWORD count, const DIDEVICEOBJECTDATA *data,
|
|
|
|
DWORD *inout, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
return IDirectInputDevice8_SendDeviceData( iface_w, count, data, inout, flags );
|
|
|
|
}
|
2021-05-26 09:23:07 +00:00
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice7AImpl_EnumEffectsInFile( IDirectInputDevice8A *iface_a, const char *filename_a, LPDIENUMEFFECTSINFILECALLBACK callback,
|
|
|
|
void *ref, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
WCHAR buffer[MAX_PATH], *filename_w = buffer;
|
|
|
|
|
|
|
|
if (!filename_a) filename_w = NULL;
|
|
|
|
else MultiByteToWideChar( CP_ACP, 0, filename_a, -1, buffer, MAX_PATH );
|
|
|
|
|
|
|
|
return IDirectInputDevice8_EnumEffectsInFile( iface_w, filename_w, callback, ref, flags );
|
|
|
|
}
|
2021-05-26 09:23:08 +00:00
|
|
|
|
|
|
|
HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile( IDirectInputDevice8A *iface_a, const char *filename_a, DWORD entries,
|
|
|
|
DIFILEEFFECT *file_effect, DWORD flags )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
WCHAR buffer[MAX_PATH], *filename_w = buffer;
|
|
|
|
|
|
|
|
if (!filename_a) filename_w = NULL;
|
|
|
|
else MultiByteToWideChar( CP_ACP, 0, filename_a, -1, buffer, MAX_PATH );
|
|
|
|
|
|
|
|
return IDirectInputDevice8_WriteEffectToFile( iface_w, filename_w, entries, file_effect, flags );
|
|
|
|
}
|
2021-05-27 08:50:00 +00:00
|
|
|
|
2021-05-27 08:50:04 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2021-05-27 08:50:00 +00:00
|
|
|
HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo( IDirectInputDevice8A *iface_a, DIDEVICEIMAGEINFOHEADERA *header_a )
|
|
|
|
{
|
|
|
|
IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
|
|
|
|
IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
|
|
|
|
DIDEVICEIMAGEINFOHEADERW header_w = {sizeof(header_w), sizeof(DIDEVICEIMAGEINFOW)};
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
|
|
if (!header_a) return E_POINTER;
|
|
|
|
if (header_a->dwSize != sizeof(DIDEVICEIMAGEINFOHEADERA)) return DIERR_INVALIDPARAM;
|
|
|
|
if (header_a->dwSizeImageInfo != sizeof(DIDEVICEIMAGEINFOA)) return DIERR_INVALIDPARAM;
|
|
|
|
|
|
|
|
header_w.dwBufferSize = (header_a->dwBufferSize / sizeof(DIDEVICEIMAGEINFOA)) * sizeof(DIDEVICEIMAGEINFOW);
|
|
|
|
header_w.lprgImageInfoArray = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, header_w.dwBufferSize );
|
|
|
|
if (!header_w.lprgImageInfoArray) return DIERR_OUTOFMEMORY;
|
|
|
|
|
|
|
|
hr = IDirectInputDevice8_GetImageInfo( iface_w, &header_w );
|
|
|
|
dideviceimageinfoheader_wtoa( &header_w, header_a );
|
|
|
|
HeapFree( GetProcessHeap(), 0, header_w.lprgImageInfoArray );
|
|
|
|
return hr;
|
|
|
|
}
|