2 * Direct Input ANSI interface wrappers
4 * Copyright 2021 RĂ©mi Bernon for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "device_private.h"
32 #include "dinput_private.h"
34 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(dinput
);
38 static struct dinput_device
*impl_from_IDirectInputDevice8A( IDirectInputDevice8A
*iface
)
40 return CONTAINING_RECORD( iface
, struct dinput_device
, IDirectInputDevice8A_iface
);
43 static IDirectInputDevice8W
*IDirectInputDevice8W_from_impl( struct dinput_device
*impl
)
45 return &impl
->IDirectInputDevice8W_iface
;
48 static inline IDirectInputDevice8A
*IDirectInputDevice8A_from_IDirectInputDevice8W( IDirectInputDevice8W
*iface
)
50 if (!iface
) return NULL
;
51 return &CONTAINING_RECORD( iface
, struct dinput_device
, IDirectInputDevice8W_iface
)->IDirectInputDevice8A_iface
;
54 static inline IDirectInputDeviceA
*IDirectInputDeviceA_from_IDirectInputDeviceW( IDirectInputDeviceW
*iface
)
56 return (IDirectInputDeviceA
*)IDirectInputDevice8A_from_IDirectInputDevice8W( (IDirectInputDevice8W
*)iface
);
59 static struct dinput
*impl_from_IDirectInput7A( IDirectInput7A
*iface
)
61 return CONTAINING_RECORD( iface
, struct dinput
, IDirectInput7A_iface
);
64 static IDirectInput7W
*IDirectInput7W_from_impl( struct dinput
*impl
)
66 return &impl
->IDirectInput7W_iface
;
69 static struct dinput
*impl_from_IDirectInput8A( IDirectInput8A
*iface
)
71 return CONTAINING_RECORD( iface
, struct dinput
, IDirectInput8A_iface
);
74 static IDirectInput8W
*IDirectInput8W_from_impl( struct dinput
*impl
)
76 return &impl
->IDirectInput8W_iface
;
79 static void dideviceobjectinstance_wtoa( const DIDEVICEOBJECTINSTANCEW
*in
, DIDEVICEOBJECTINSTANCEA
*out
)
81 out
->guidType
= in
->guidType
;
82 out
->dwOfs
= in
->dwOfs
;
83 out
->dwType
= in
->dwType
;
84 out
->dwFlags
= in
->dwFlags
;
85 WideCharToMultiByte( CP_ACP
, 0, in
->tszName
, -1, out
->tszName
, sizeof(out
->tszName
), NULL
, NULL
);
87 if (out
->dwSize
<= FIELD_OFFSET( DIDEVICEOBJECTINSTANCEA
, dwFFMaxForce
)) return;
89 out
->dwFFMaxForce
= in
->dwFFMaxForce
;
90 out
->dwFFForceResolution
= in
->dwFFForceResolution
;
91 out
->wCollectionNumber
= in
->wCollectionNumber
;
92 out
->wDesignatorIndex
= in
->wDesignatorIndex
;
93 out
->wUsagePage
= in
->wUsagePage
;
94 out
->wUsage
= in
->wUsage
;
95 out
->dwDimension
= in
->dwDimension
;
96 out
->wExponent
= in
->wExponent
;
97 out
->wReportId
= in
->wReportId
;
100 static void dideviceinstance_wtoa( const DIDEVICEINSTANCEW
*in
, DIDEVICEINSTANCEA
*out
)
102 out
->guidInstance
= in
->guidInstance
;
103 out
->guidProduct
= in
->guidProduct
;
104 out
->dwDevType
= in
->dwDevType
;
105 WideCharToMultiByte( CP_ACP
, 0, in
->tszInstanceName
, -1, out
->tszInstanceName
,
106 sizeof(out
->tszInstanceName
), NULL
, NULL
);
107 WideCharToMultiByte( CP_ACP
, 0, in
->tszProductName
, -1, out
->tszProductName
,
108 sizeof(out
->tszProductName
), NULL
, NULL
);
110 if (out
->dwSize
<= FIELD_OFFSET( DIDEVICEINSTANCEA
, guidFFDriver
)) return;
112 out
->guidFFDriver
= in
->guidFFDriver
;
113 out
->wUsagePage
= in
->wUsagePage
;
114 out
->wUsage
= in
->wUsage
;
117 static void dieffectinfo_wtoa( const DIEFFECTINFOW
*in
, DIEFFECTINFOA
*out
)
119 out
->guid
= in
->guid
;
120 out
->dwEffType
= in
->dwEffType
;
121 out
->dwStaticParams
= in
->dwStaticParams
;
122 out
->dwDynamicParams
= in
->dwDynamicParams
;
123 WideCharToMultiByte( CP_ACP
, 0, in
->tszName
, -1, out
->tszName
, sizeof(out
->tszName
), NULL
, NULL
);
126 static HRESULT
string_atow( const char *in
, WCHAR
**out
)
131 if (!in
) return DI_OK
;
133 len
= MultiByteToWideChar( CP_ACP
, 0, in
, -1, NULL
, 0 );
134 if (!(*out
= malloc( len
* sizeof(WCHAR
) ))) return DIERR_OUTOFMEMORY
;
136 MultiByteToWideChar( CP_ACP
, 0, in
, -1, *out
, len
);
140 static void diactionformat_wtoa( const DIACTIONFORMATW
*in
, DIACTIONFORMATA
*out
)
144 out
->dwDataSize
= in
->dwDataSize
;
145 out
->dwNumActions
= in
->dwNumActions
;
147 for (i
= 0; i
< in
->dwNumActions
; ++i
)
149 out
->rgoAction
[i
].uAppData
= in
->rgoAction
[i
].uAppData
;
150 out
->rgoAction
[i
].dwSemantic
= in
->rgoAction
[i
].dwSemantic
;
151 out
->rgoAction
[i
].dwFlags
= in
->rgoAction
[i
].dwFlags
;
152 out
->rgoAction
[i
].guidInstance
= in
->rgoAction
[i
].guidInstance
;
153 out
->rgoAction
[i
].dwObjID
= in
->rgoAction
[i
].dwObjID
;
154 out
->rgoAction
[i
].dwHow
= in
->rgoAction
[i
].dwHow
;
157 out
->guidActionMap
= in
->guidActionMap
;
158 out
->dwGenre
= in
->dwGenre
;
159 out
->dwBufferSize
= in
->dwBufferSize
;
160 out
->lAxisMin
= in
->lAxisMin
;
161 out
->lAxisMax
= in
->lAxisMax
;
162 out
->hInstString
= in
->hInstString
;
163 out
->ftTimeStamp
= in
->ftTimeStamp
;
164 out
->dwCRC
= in
->dwCRC
;
166 WideCharToMultiByte( CP_ACP
, 0, in
->tszActionMap
, -1, out
->tszActionMap
,
167 sizeof(out
->tszActionMap
), NULL
, NULL
);
170 static HRESULT
diactionformat_atow( const DIACTIONFORMATA
*in
, DIACTIONFORMATW
*out
, BOOL convert_names
)
175 out
->dwDataSize
= in
->dwDataSize
;
176 out
->dwNumActions
= in
->dwNumActions
;
178 for (i
= 0; i
< out
->dwNumActions
&& SUCCEEDED(hr
); ++i
)
180 out
->rgoAction
[i
].uAppData
= in
->rgoAction
[i
].uAppData
;
181 out
->rgoAction
[i
].dwSemantic
= in
->rgoAction
[i
].dwSemantic
;
182 out
->rgoAction
[i
].dwFlags
= in
->rgoAction
[i
].dwFlags
;
183 out
->rgoAction
[i
].guidInstance
= in
->rgoAction
[i
].guidInstance
;
184 out
->rgoAction
[i
].dwObjID
= in
->rgoAction
[i
].dwObjID
;
185 out
->rgoAction
[i
].dwHow
= in
->rgoAction
[i
].dwHow
;
186 if (!convert_names
) out
->rgoAction
[i
].lptszActionName
= 0;
187 else if (in
->hInstString
) out
->rgoAction
[i
].uResIdString
= in
->rgoAction
[i
].uResIdString
;
188 else hr
= string_atow( in
->rgoAction
[i
].lptszActionName
, (WCHAR
**)&out
->rgoAction
[i
].lptszActionName
);
191 for (; i
< out
->dwNumActions
; ++i
) out
->rgoAction
[i
].lptszActionName
= 0;
193 out
->guidActionMap
= in
->guidActionMap
;
194 out
->dwGenre
= in
->dwGenre
;
195 out
->dwBufferSize
= in
->dwBufferSize
;
196 out
->lAxisMin
= in
->lAxisMin
;
197 out
->lAxisMax
= in
->lAxisMax
;
198 out
->hInstString
= in
->hInstString
;
199 out
->ftTimeStamp
= in
->ftTimeStamp
;
200 out
->dwCRC
= in
->dwCRC
;
202 MultiByteToWideChar( CP_ACP
, 0, in
->tszActionMap
, -1, out
->tszActionMap
,
203 sizeof(out
->tszActionMap
) / sizeof(WCHAR
) );
208 static void dideviceimageinfo_wtoa( const DIDEVICEIMAGEINFOW
*in
, DIDEVICEIMAGEINFOA
*out
)
210 WideCharToMultiByte( CP_ACP
, 0, in
->tszImagePath
, -1, out
->tszImagePath
,
211 sizeof(out
->tszImagePath
), NULL
, NULL
);
213 out
->dwFlags
= in
->dwFlags
;
214 out
->dwViewID
= in
->dwViewID
;
215 out
->rcOverlay
= in
->rcOverlay
;
216 out
->dwObjID
= in
->dwObjID
;
217 out
->dwcValidPts
= in
->dwcValidPts
;
218 out
->rgptCalloutLine
[0] = in
->rgptCalloutLine
[0];
219 out
->rgptCalloutLine
[1] = in
->rgptCalloutLine
[1];
220 out
->rgptCalloutLine
[2] = in
->rgptCalloutLine
[2];
221 out
->rgptCalloutLine
[3] = in
->rgptCalloutLine
[3];
222 out
->rgptCalloutLine
[4] = in
->rgptCalloutLine
[4];
223 out
->rcCalloutRect
= in
->rcCalloutRect
;
224 out
->dwTextAlign
= in
->dwTextAlign
;
227 static void dideviceimageinfoheader_wtoa( const DIDEVICEIMAGEINFOHEADERW
*in
, DIDEVICEIMAGEINFOHEADERA
*out
)
231 out
->dwcViews
= in
->dwcViews
;
232 out
->dwcButtons
= in
->dwcButtons
;
233 out
->dwcAxes
= in
->dwcAxes
;
234 out
->dwcPOVs
= in
->dwcPOVs
;
235 out
->dwBufferUsed
= 0;
237 for (i
= 0; i
< in
->dwBufferUsed
/ sizeof(DIDEVICEIMAGEINFOW
); ++i
)
239 dideviceimageinfo_wtoa( &in
->lprgImageInfoArray
[i
], &out
->lprgImageInfoArray
[i
] );
240 out
->dwBufferUsed
+= sizeof(DIDEVICEIMAGEINFOA
);
244 static HRESULT
diconfiguredevicesparams_atow( const DICONFIGUREDEVICESPARAMSA
*in
, DICONFIGUREDEVICESPARAMSW
*out
)
246 const char *name_a
= in
->lptszUserNames
;
249 if (!in
->lptszUserNames
) out
->lptszUserNames
= NULL
;
252 while (name_a
[0] && name_a
[1]) ++name_a
;
253 len_a
= name_a
- in
->lptszUserNames
+ 1;
254 len_w
= MultiByteToWideChar( CP_ACP
, 0, in
->lptszUserNames
, len_a
, NULL
, 0 );
256 out
->lptszUserNames
= calloc( len_w
, sizeof(WCHAR
) );
257 if (!out
->lptszUserNames
) return DIERR_OUTOFMEMORY
;
259 MultiByteToWideChar( CP_ACP
, 0, in
->lptszUserNames
, len_a
, out
->lptszUserNames
, len_w
);
262 out
->dwcUsers
= in
->dwcUsers
;
263 out
->dwcFormats
= in
->dwcFormats
;
264 out
->hwnd
= in
->hwnd
;
265 out
->dics
= in
->dics
;
266 out
->lpUnkDDSTarget
= in
->lpUnkDDSTarget
;
271 static HRESULT WINAPI
dinput_device_a_QueryInterface( IDirectInputDevice8A
*iface_a
, REFIID iid
, void **out
)
273 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
274 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
275 TRACE( "impl %p, iid %s, out %p.\n", impl
, debugstr_guid( iid
), out
);
276 return IDirectInputDevice8_QueryInterface( iface_w
, iid
, out
);
279 static ULONG WINAPI
dinput_device_a_AddRef( IDirectInputDevice8A
*iface_a
)
281 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
282 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
283 TRACE( "impl %p.\n", impl
);
284 return IDirectInputDevice8_AddRef( iface_w
);
287 static ULONG WINAPI
dinput_device_a_Release( IDirectInputDevice8A
*iface_a
)
289 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
290 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
291 TRACE( "impl %p.\n", impl
);
292 return IDirectInputDevice8_Release( iface_w
);
295 static HRESULT WINAPI
dinput_device_a_GetCapabilities( IDirectInputDevice8A
*iface_a
, DIDEVCAPS
*caps
)
297 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
298 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
299 TRACE( "impl %p, caps %p.\n", impl
, caps
);
300 return IDirectInputDevice8_GetCapabilities( iface_w
, caps
);
303 struct enum_objects_wtoa_params
305 LPDIENUMDEVICEOBJECTSCALLBACKA callback
;
309 static BOOL CALLBACK
enum_objects_wtoa_callback( const DIDEVICEOBJECTINSTANCEW
*instance_w
, void *ref
)
311 struct enum_objects_wtoa_params
*params
= ref
;
312 DIDEVICEOBJECTINSTANCEA instance_a
= {sizeof(instance_a
)};
314 dideviceobjectinstance_wtoa( instance_w
, &instance_a
);
315 return params
->callback( &instance_a
, params
->ref
);
318 static HRESULT WINAPI
dinput_device_a_EnumObjects( IDirectInputDevice8A
*iface_a
, LPDIENUMDEVICEOBJECTSCALLBACKA callback
,
319 void *ref
, DWORD flags
)
321 struct enum_objects_wtoa_params params
= {callback
, ref
};
322 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
323 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
325 TRACE( "impl %p, callback %p, ref %p, flags %#lx.\n", impl
, callback
, ref
, flags
);
327 if (!callback
) return DIERR_INVALIDPARAM
;
329 return IDirectInputDevice8_EnumObjects( iface_w
, enum_objects_wtoa_callback
, ¶ms
, flags
);
332 static HRESULT WINAPI
dinput_device_a_GetProperty( IDirectInputDevice8A
*iface_a
, REFGUID guid
, DIPROPHEADER
*header
)
334 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
335 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
336 TRACE( "impl %p, guid %s, header %p.\n", impl
, debugstr_guid( guid
), header
);
337 return IDirectInputDevice8_GetProperty( iface_w
, guid
, header
);
340 static HRESULT WINAPI
dinput_device_a_SetProperty( IDirectInputDevice8A
*iface_a
, REFGUID guid
, const DIPROPHEADER
*header
)
342 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
343 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
344 TRACE( "impl %p, guid %s, header %p.\n", impl
, debugstr_guid( guid
), header
);
345 return IDirectInputDevice8_SetProperty( iface_w
, guid
, header
);
348 static HRESULT WINAPI
dinput_device_a_Acquire( IDirectInputDevice8A
*iface_a
)
350 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
351 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
352 TRACE( "impl %p.\n", impl
);
353 return IDirectInputDevice8_Acquire( iface_w
);
356 static HRESULT WINAPI
dinput_device_a_Unacquire( IDirectInputDevice8A
*iface_a
)
358 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
359 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
360 TRACE( "impl %p.\n", impl
);
361 return IDirectInputDevice8_Unacquire( iface_w
);
364 static HRESULT WINAPI
dinput_device_a_GetDeviceState( IDirectInputDevice8A
*iface_a
, DWORD count
, void *data
)
366 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
367 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
368 TRACE( "impl %p, count %#lx, data %p.\n", impl
, count
, data
);
369 return IDirectInputDevice8_GetDeviceState( iface_w
, count
, data
);
372 static HRESULT WINAPI
dinput_device_a_GetDeviceData( IDirectInputDevice8A
*iface_a
, DWORD data_size
, DIDEVICEOBJECTDATA
*data
,
373 DWORD
*entries
, DWORD flags
)
375 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
376 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
377 TRACE( "impl %p, data_size %#lx, data %p, entries %p, flags %#lx.\n", impl
, data_size
, data
, entries
, flags
);
378 return IDirectInputDevice8_GetDeviceData( iface_w
, data_size
, data
, entries
, flags
);
381 static HRESULT WINAPI
dinput_device_a_SetDataFormat( IDirectInputDevice8A
*iface_a
, const DIDATAFORMAT
*format
)
383 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
384 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
385 TRACE( "impl %p, format %p.\n", impl
, format
);
386 return IDirectInputDevice8_SetDataFormat( iface_w
, format
);
389 static HRESULT WINAPI
dinput_device_a_SetEventNotification( IDirectInputDevice8A
*iface_a
, HANDLE event
)
391 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
392 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
393 TRACE( "impl %p, event %p.\n", impl
, event
);
394 return IDirectInputDevice8_SetEventNotification( iface_w
, event
);
397 static HRESULT WINAPI
dinput_device_a_SetCooperativeLevel( IDirectInputDevice8A
*iface_a
, HWND window
, DWORD flags
)
399 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
400 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
401 TRACE( "impl %p, window %p, flags %#lx.\n", impl
, window
, flags
);
402 return IDirectInputDevice8_SetCooperativeLevel( iface_w
, window
, flags
);
405 static HRESULT WINAPI
dinput_device_a_GetObjectInfo( IDirectInputDevice8A
*iface_a
, DIDEVICEOBJECTINSTANCEA
*instance_a
,
406 DWORD obj
, DWORD how
)
408 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
409 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
410 DIDEVICEOBJECTINSTANCEW instance_w
= {sizeof(instance_w
)};
413 TRACE( "impl %p, instance_a %p, obj %#lx, how %#lx.\n", impl
, instance_a
, obj
, how
);
415 if (!instance_a
) return E_POINTER
;
416 if (instance_a
->dwSize
!= sizeof(DIDEVICEOBJECTINSTANCEA
) &&
417 instance_a
->dwSize
!= sizeof(DIDEVICEOBJECTINSTANCE_DX3A
))
418 return DIERR_INVALIDPARAM
;
420 hr
= IDirectInputDevice8_GetObjectInfo( iface_w
, &instance_w
, obj
, how
);
421 dideviceobjectinstance_wtoa( &instance_w
, instance_a
);
426 static HRESULT WINAPI
dinput_device_a_GetDeviceInfo( IDirectInputDevice8A
*iface_a
, DIDEVICEINSTANCEA
*instance_a
)
428 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
429 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
430 DIDEVICEINSTANCEW instance_w
= {sizeof(instance_w
)};
433 TRACE( "impl %p, instance_a %p.\n", impl
, instance_a
);
435 if (!instance_a
) return E_POINTER
;
436 if (instance_a
->dwSize
!= sizeof(DIDEVICEINSTANCEA
) && instance_a
->dwSize
!= sizeof(DIDEVICEINSTANCE_DX3A
))
437 return DIERR_INVALIDPARAM
;
439 hr
= IDirectInputDevice8_GetDeviceInfo( iface_w
, &instance_w
);
440 dideviceinstance_wtoa( &instance_w
, instance_a
);
445 static HRESULT WINAPI
dinput_device_a_RunControlPanel( IDirectInputDevice8A
*iface_a
, HWND owner
, DWORD flags
)
447 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
448 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
449 TRACE( "impl %p, owner %p, flags %#lx.\n", impl
, owner
, flags
);
450 return IDirectInputDevice8_RunControlPanel( iface_w
, owner
, flags
);
453 static HRESULT WINAPI
dinput_device_a_Initialize( IDirectInputDevice8A
*iface_a
, HINSTANCE instance
, DWORD version
, REFGUID guid
)
455 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
456 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
457 TRACE( "impl %p, instance %p, version %#lx, guid %s.\n", impl
, instance
, version
, debugstr_guid( guid
) );
458 return IDirectInputDevice8_Initialize( iface_w
, instance
, version
, guid
);
461 static HRESULT WINAPI
dinput_device_a_CreateEffect( IDirectInputDevice8A
*iface_a
, REFGUID guid
, const DIEFFECT
*effect
,
462 IDirectInputEffect
**out
, IUnknown
*outer
)
464 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
465 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
466 TRACE( "impl %p, guid %s, effect %p, out %p, outer %p.\n", impl
, debugstr_guid( guid
), effect
, out
, outer
);
467 return IDirectInputDevice8_CreateEffect( iface_w
, guid
, effect
, out
, outer
);
470 struct enum_effects_wtoa_params
472 LPDIENUMEFFECTSCALLBACKA callback
;
476 static BOOL CALLBACK
enum_effects_wtoa_callback( const DIEFFECTINFOW
*info_w
, void *ref
)
478 struct enum_effects_wtoa_params
*params
= ref
;
479 DIEFFECTINFOA info_a
= {sizeof(info_a
)};
481 dieffectinfo_wtoa( info_w
, &info_a
);
482 return params
->callback( &info_a
, params
->ref
);
485 static HRESULT WINAPI
dinput_device_a_EnumEffects( IDirectInputDevice8A
*iface_a
, LPDIENUMEFFECTSCALLBACKA callback
,
486 void *ref
, DWORD type
)
488 struct enum_effects_wtoa_params params
= {callback
, ref
};
489 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
490 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
492 TRACE( "impl %p, callback %p, ref %p, type %#lx.\n", impl
, callback
, ref
, type
);
494 if (!callback
) return DIERR_INVALIDPARAM
;
496 return IDirectInputDevice8_EnumEffects( iface_w
, enum_effects_wtoa_callback
, ¶ms
, type
);
499 static HRESULT WINAPI
dinput_device_a_GetEffectInfo( IDirectInputDevice8A
*iface_a
, DIEFFECTINFOA
*info_a
, REFGUID guid
)
501 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
502 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
503 DIEFFECTINFOW info_w
= {sizeof(info_w
)};
506 TRACE( "impl %p, info_a %p, guid %s.\n", impl
, info_a
, debugstr_guid( guid
) );
508 if (!info_a
) return E_POINTER
;
509 if (info_a
->dwSize
!= sizeof(DIEFFECTINFOA
)) return DIERR_INVALIDPARAM
;
511 hr
= IDirectInputDevice8_GetEffectInfo( iface_w
, &info_w
, guid
);
512 dieffectinfo_wtoa( &info_w
, info_a
);
517 static HRESULT WINAPI
dinput_device_a_GetForceFeedbackState( IDirectInputDevice8A
*iface_a
, DWORD
*state
)
519 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
520 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
521 TRACE( "impl %p, state %p.\n", impl
, state
);
522 return IDirectInputDevice8_GetForceFeedbackState( iface_w
, state
);
525 static HRESULT WINAPI
dinput_device_a_SendForceFeedbackCommand( IDirectInputDevice8A
*iface_a
, DWORD flags
)
527 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
528 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
529 TRACE( "impl %p, flags %#lx.\n", impl
, flags
);
530 return IDirectInputDevice8_SendForceFeedbackCommand( iface_w
, flags
);
533 static HRESULT WINAPI
dinput_device_a_EnumCreatedEffectObjects( IDirectInputDevice8A
*iface_a
, LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback
,
534 void *ref
, DWORD flags
)
536 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
537 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
538 TRACE( "impl %p, callback %p, ref %p, flags %#lx.\n", impl
, callback
, ref
, flags
);
539 return IDirectInputDevice8_EnumCreatedEffectObjects( iface_w
, callback
, ref
, flags
);
542 static HRESULT WINAPI
dinput_device_a_Escape( IDirectInputDevice8A
*iface_a
, DIEFFESCAPE
*escape
)
544 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
545 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
546 TRACE( "impl %p, escape %p.\n", impl
, escape
);
547 return IDirectInputDevice8_Escape( iface_w
, escape
);
550 static HRESULT WINAPI
dinput_device_a_Poll( IDirectInputDevice8A
*iface_a
)
552 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
553 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
554 TRACE( "impl %p.\n", impl
);
555 return IDirectInputDevice8_Poll( iface_w
);
558 static HRESULT WINAPI
dinput_device_a_SendDeviceData( IDirectInputDevice8A
*iface_a
, DWORD count
, const DIDEVICEOBJECTDATA
*data
,
559 DWORD
*inout
, DWORD flags
)
561 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
562 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
563 TRACE( "impl %p, count %#lx, data %p, inout %p, flags %#lx.\n", impl
, count
, data
, inout
, flags
);
564 return IDirectInputDevice8_SendDeviceData( iface_w
, count
, data
, inout
, flags
);
567 static HRESULT WINAPI
dinput_device_a_EnumEffectsInFile( IDirectInputDevice8A
*iface_a
, const char *filename_a
, LPDIENUMEFFECTSINFILECALLBACK callback
,
568 void *ref
, DWORD flags
)
570 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
571 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
572 WCHAR buffer
[MAX_PATH
], *filename_w
= buffer
;
574 TRACE( "impl %p, filename_a %s, callback %p, ref %p, flags %#lx.\n", impl
,
575 debugstr_a(filename_a
), callback
, ref
, flags
);
577 if (!filename_a
) filename_w
= NULL
;
578 else MultiByteToWideChar( CP_ACP
, 0, filename_a
, -1, buffer
, MAX_PATH
);
580 return IDirectInputDevice8_EnumEffectsInFile( iface_w
, filename_w
, callback
, ref
, flags
);
583 static HRESULT WINAPI
dinput_device_a_WriteEffectToFile( IDirectInputDevice8A
*iface_a
, const char *filename_a
, DWORD entries
,
584 DIFILEEFFECT
*file_effect
, DWORD flags
)
586 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
587 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
588 WCHAR buffer
[MAX_PATH
], *filename_w
= buffer
;
590 TRACE( "impl %p, filename_a %s, entries %#lx, file_effect %p, flags %#lx.\n", impl
,
591 debugstr_a(filename_a
), entries
, file_effect
, flags
);
593 if (!filename_a
) filename_w
= NULL
;
594 else MultiByteToWideChar( CP_ACP
, 0, filename_a
, -1, buffer
, MAX_PATH
);
596 return IDirectInputDevice8_WriteEffectToFile( iface_w
, filename_w
, entries
, file_effect
, flags
);
599 static HRESULT WINAPI
dinput_device_a_BuildActionMap( IDirectInputDevice8A
*iface_a
, DIACTIONFORMATA
*format_a
,
600 const char *username_a
, DWORD flags
)
602 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
603 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
604 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
608 TRACE( "impl %p, format_a %p, username_a %s, flags %#lx.\n", impl
, format_a
, debugstr_a(username_a
), flags
);
610 if (!format_a
) return E_POINTER
;
611 if (format_a
->dwSize
!= sizeof(DIACTIONFORMATA
)) return DIERR_INVALIDPARAM
;
612 if (format_a
->dwActionSize
!= sizeof(DIACTIONA
)) return DIERR_INVALIDPARAM
;
613 if (FAILED(hr
= string_atow( username_a
, &username_w
))) return hr
;
615 format_w
.dwNumActions
= format_a
->dwNumActions
;
616 format_w
.rgoAction
= calloc( format_a
->dwNumActions
, sizeof(DIACTIONW
) );
617 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
620 diactionformat_atow( format_a
, &format_w
, FALSE
);
621 hr
= IDirectInputDevice8_BuildActionMap( iface_w
, &format_w
, username_w
, flags
);
622 diactionformat_wtoa( &format_w
, format_a
);
623 free( format_w
.rgoAction
);
630 static HRESULT WINAPI
dinput_device_a_SetActionMap( IDirectInputDevice8A
*iface_a
, DIACTIONFORMATA
*format_a
,
631 const char *username_a
, DWORD flags
)
633 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
634 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
635 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
639 TRACE( "impl %p, format_a %p, username_a %s, flags %#lx.\n", impl
, format_a
, debugstr_a(username_a
), flags
);
641 if (!format_a
) return E_POINTER
;
642 if (format_a
->dwSize
!= sizeof(DIACTIONFORMATA
)) return DIERR_INVALIDPARAM
;
643 if (format_a
->dwActionSize
!= sizeof(DIACTIONA
)) return DIERR_INVALIDPARAM
;
644 if (FAILED(hr
= string_atow( username_a
, &username_w
))) return hr
;
646 format_w
.dwNumActions
= format_a
->dwNumActions
;
647 format_w
.rgoAction
= calloc( format_a
->dwNumActions
, sizeof(DIACTIONW
) );
648 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
651 diactionformat_atow( format_a
, &format_w
, FALSE
);
652 hr
= IDirectInputDevice8_SetActionMap( iface_w
, &format_w
, username_w
, flags
);
653 diactionformat_wtoa( &format_w
, format_a
);
654 free( format_w
.rgoAction
);
661 static HRESULT WINAPI
dinput_device_a_GetImageInfo( IDirectInputDevice8A
*iface_a
, DIDEVICEIMAGEINFOHEADERA
*header_a
)
663 struct dinput_device
*impl
= impl_from_IDirectInputDevice8A( iface_a
);
664 IDirectInputDevice8W
*iface_w
= IDirectInputDevice8W_from_impl( impl
);
665 DIDEVICEIMAGEINFOHEADERW header_w
= {sizeof(header_w
), sizeof(DIDEVICEIMAGEINFOW
)};
668 TRACE( "impl %p, header_a %p.\n", impl
, header_a
);
670 if (!header_a
) return E_POINTER
;
671 if (header_a
->dwSize
!= sizeof(DIDEVICEIMAGEINFOHEADERA
)) return DIERR_INVALIDPARAM
;
672 if (header_a
->dwSizeImageInfo
!= sizeof(DIDEVICEIMAGEINFOA
)) return DIERR_INVALIDPARAM
;
674 header_w
.dwBufferSize
= (header_a
->dwBufferSize
/ sizeof(DIDEVICEIMAGEINFOA
)) * sizeof(DIDEVICEIMAGEINFOW
);
675 header_w
.lprgImageInfoArray
= calloc( header_w
.dwBufferSize
, 1 );
676 if (!header_w
.lprgImageInfoArray
) return DIERR_OUTOFMEMORY
;
678 hr
= IDirectInputDevice8_GetImageInfo( iface_w
, &header_w
);
679 dideviceimageinfoheader_wtoa( &header_w
, header_a
);
680 free( header_w
.lprgImageInfoArray
);
684 const IDirectInputDevice8AVtbl dinput_device_a_vtbl
=
686 /*** IUnknown methods ***/
687 dinput_device_a_QueryInterface
,
688 dinput_device_a_AddRef
,
689 dinput_device_a_Release
,
690 /*** IDirectInputDeviceA methods ***/
691 dinput_device_a_GetCapabilities
,
692 dinput_device_a_EnumObjects
,
693 dinput_device_a_GetProperty
,
694 dinput_device_a_SetProperty
,
695 dinput_device_a_Acquire
,
696 dinput_device_a_Unacquire
,
697 dinput_device_a_GetDeviceState
,
698 dinput_device_a_GetDeviceData
,
699 dinput_device_a_SetDataFormat
,
700 dinput_device_a_SetEventNotification
,
701 dinput_device_a_SetCooperativeLevel
,
702 dinput_device_a_GetObjectInfo
,
703 dinput_device_a_GetDeviceInfo
,
704 dinput_device_a_RunControlPanel
,
705 dinput_device_a_Initialize
,
706 /*** IDirectInputDevice2A methods ***/
707 dinput_device_a_CreateEffect
,
708 dinput_device_a_EnumEffects
,
709 dinput_device_a_GetEffectInfo
,
710 dinput_device_a_GetForceFeedbackState
,
711 dinput_device_a_SendForceFeedbackCommand
,
712 dinput_device_a_EnumCreatedEffectObjects
,
713 dinput_device_a_Escape
,
714 dinput_device_a_Poll
,
715 dinput_device_a_SendDeviceData
,
716 /*** IDirectInputDevice7A methods ***/
717 dinput_device_a_EnumEffectsInFile
,
718 dinput_device_a_WriteEffectToFile
,
719 /*** IDirectInputDevice8A methods ***/
720 dinput_device_a_BuildActionMap
,
721 dinput_device_a_SetActionMap
,
722 dinput_device_a_GetImageInfo
,
725 static HRESULT WINAPI
dinput8_a_QueryInterface( IDirectInput8A
*iface_a
, REFIID iid
, void **out
)
727 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
728 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
729 TRACE( "impl %p, iid %s, out %p.\n", impl
, debugstr_guid( iid
), out
);
730 return IDirectInput8_QueryInterface( iface_w
, iid
, out
);
733 static ULONG WINAPI
dinput8_a_AddRef( IDirectInput8A
*iface_a
)
735 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
736 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
737 TRACE( "impl %p.\n", impl
);
738 return IDirectInput8_AddRef( iface_w
);
741 static ULONG WINAPI
dinput8_a_Release( IDirectInput8A
*iface_a
)
743 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
744 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
745 TRACE( "impl %p.\n", impl
);
746 return IDirectInput8_Release( iface_w
);
749 static HRESULT WINAPI
dinput8_a_CreateDevice( IDirectInput8A
*iface_a
, REFGUID guid
, IDirectInputDevice8A
**out
, IUnknown
*outer
)
751 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
752 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
753 IDirectInputDevice8W
*outw
;
756 TRACE( "impl %p, guid %s, out %p, outer %p.\n", impl
, debugstr_guid( guid
), out
, outer
);
758 if (!out
) return E_POINTER
;
760 hr
= IDirectInput8_CreateDevice( iface_w
, guid
, &outw
, outer
);
761 *out
= IDirectInputDevice8A_from_IDirectInputDevice8W( outw
);
765 struct enum_devices_wtoa_params
767 LPDIENUMDEVICESCALLBACKA callback
;
771 static BOOL CALLBACK
enum_devices_wtoa_callback( const DIDEVICEINSTANCEW
*instance_w
, void *data
)
773 struct enum_devices_wtoa_params
*params
= data
;
774 DIDEVICEINSTANCEA instance_a
= {sizeof(instance_a
)};
776 dideviceinstance_wtoa( instance_w
, &instance_a
);
777 return params
->callback( &instance_a
, params
->ref
);
780 static HRESULT WINAPI
dinput8_a_EnumDevices( IDirectInput8A
*iface_a
, DWORD type
, LPDIENUMDEVICESCALLBACKA callback
,
781 void *ref
, DWORD flags
)
783 struct enum_devices_wtoa_params params
= {callback
, ref
};
784 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
785 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
787 TRACE( "impl %p, type %#lx, callback %p, ref %p, flags %#lx.\n", impl
, type
, callback
, ref
, flags
);
789 if (!callback
) return DIERR_INVALIDPARAM
;
791 return IDirectInput8_EnumDevices( iface_w
, type
, enum_devices_wtoa_callback
, ¶ms
, flags
);
794 static HRESULT WINAPI
dinput8_a_GetDeviceStatus( IDirectInput8A
*iface_a
, REFGUID instance_guid
)
796 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
797 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
798 TRACE( "impl %p, instance_guid %s.\n", impl
, debugstr_guid( instance_guid
) );
799 return IDirectInput8_GetDeviceStatus( iface_w
, instance_guid
);
802 static HRESULT WINAPI
dinput8_a_RunControlPanel( IDirectInput8A
*iface_a
, HWND owner
, DWORD flags
)
804 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
805 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
806 TRACE( "impl %p, owner %p, flags %#lx.\n", impl
, owner
, flags
);
807 return IDirectInput8_RunControlPanel( iface_w
, owner
, flags
);
810 static HRESULT WINAPI
dinput8_a_Initialize( IDirectInput8A
*iface_a
, HINSTANCE instance
, DWORD version
)
812 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
813 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
814 TRACE( "impl %p, instance %p, version %#lx.\n", impl
, instance
, version
);
815 return IDirectInput8_Initialize( iface_w
, instance
, version
);
818 static HRESULT WINAPI
dinput8_a_FindDevice( IDirectInput8A
*iface_a
, REFGUID guid
, const char *name_a
, GUID
*instance_guid
)
820 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
821 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
825 TRACE( "impl %p, guid %s, name_a %s, instance_guid %s.\n", impl
, debugstr_guid( guid
),
826 debugstr_a(name_a
), debugstr_guid( instance_guid
) );
828 if (FAILED(hr
= string_atow( name_a
, &name_w
))) return hr
;
830 hr
= IDirectInput8_FindDevice( iface_w
, guid
, name_w
, instance_guid
);
835 struct enum_devices_by_semantics_wtoa_params
837 LPDIENUMDEVICESBYSEMANTICSCBA callback
;
841 static BOOL CALLBACK
enum_devices_by_semantics_wtoa_callback( const DIDEVICEINSTANCEW
*instance_w
, IDirectInputDevice8W
*iface_w
,
842 DWORD flags
, DWORD remaining
, void *data
)
844 struct enum_devices_by_semantics_wtoa_params
*params
= data
;
845 IDirectInputDevice8A
*iface_a
= IDirectInputDevice8A_from_IDirectInputDevice8W( iface_w
);
846 DIDEVICEINSTANCEA instance_a
= {sizeof(instance_a
)};
848 dideviceinstance_wtoa( instance_w
, &instance_a
);
849 return params
->callback( &instance_a
, iface_a
, flags
, remaining
, params
->ref
);
852 static HRESULT WINAPI
dinput8_a_EnumDevicesBySemantics( IDirectInput8A
*iface_a
, const char *username_a
, DIACTIONFORMATA
*format_a
,
853 LPDIENUMDEVICESBYSEMANTICSCBA callback
, void *ref
, DWORD flags
)
855 struct enum_devices_by_semantics_wtoa_params params
= {callback
, ref
};
856 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
857 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
858 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
862 TRACE( "impl %p, username_a %s, format_a %p, callback %p, ref %p, flags %#lx.\n", impl
,
863 debugstr_a(username_a
), format_a
, callback
, ref
, flags
);
865 if (!callback
) return DIERR_INVALIDPARAM
;
866 if (FAILED(hr
= string_atow( username_a
, &username_w
))) return hr
;
868 format_w
.dwNumActions
= format_a
->dwNumActions
;
869 format_w
.rgoAction
= calloc( format_a
->dwNumActions
, sizeof(DIACTIONW
) );
870 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
873 diactionformat_atow( format_a
, &format_w
, FALSE
);
874 hr
= IDirectInput8_EnumDevicesBySemantics( iface_w
, username_w
, &format_w
, enum_devices_by_semantics_wtoa_callback
,
876 free( format_w
.rgoAction
);
883 static HRESULT WINAPI
dinput8_a_ConfigureDevices( IDirectInput8A
*iface_a
, LPDICONFIGUREDEVICESCALLBACK callback
,
884 DICONFIGUREDEVICESPARAMSA
*params_a
, DWORD flags
, void *ref
)
886 struct dinput
*impl
= impl_from_IDirectInput8A( iface_a
);
887 IDirectInput8W
*iface_w
= IDirectInput8W_from_impl( impl
);
888 DICONFIGUREDEVICESPARAMSW params_w
= {sizeof(params_w
)};
889 DIACTIONFORMATA
*format_a
= params_a
->lprgFormats
;
890 DIACTIONFORMATW format_w
= {sizeof(format_w
), sizeof(DIACTIONW
)};
894 TRACE( "impl %p, callback %p, params_a %p, flags %#lx, ref %p.\n", impl
, callback
, params_a
, flags
, ref
);
896 if (FAILED(hr
= diconfiguredevicesparams_atow( params_a
, ¶ms_w
))) return hr
;
898 format_w
.dwNumActions
= format_a
->dwNumActions
;
899 format_w
.rgoAction
= calloc( format_a
->dwNumActions
, sizeof(DIACTIONW
) );
900 if (!format_w
.rgoAction
) hr
= DIERR_OUTOFMEMORY
;
903 hr
= diactionformat_atow( format_a
, &format_w
, TRUE
);
904 params_w
.lprgFormats
= &format_w
;
906 if (SUCCEEDED(hr
)) hr
= IDirectInput8_ConfigureDevices( iface_w
, callback
, ¶ms_w
, flags
, ref
);
907 if (SUCCEEDED(hr
)) diactionformat_wtoa( &format_w
, format_a
);
909 if (!format_w
.hInstString
)
911 for (i
= 0; i
< format_w
.dwNumActions
; ++i
)
912 free( (void *)format_w
.rgoAction
[i
].lptszActionName
);
914 free( format_w
.rgoAction
);
917 free( params_w
.lptszUserNames
);
921 const IDirectInput8AVtbl dinput8_a_vtbl
=
923 /*** IUnknown methods ***/
924 dinput8_a_QueryInterface
,
927 /*** IDirectInput8A methods ***/
928 dinput8_a_CreateDevice
,
929 dinput8_a_EnumDevices
,
930 dinput8_a_GetDeviceStatus
,
931 dinput8_a_RunControlPanel
,
932 dinput8_a_Initialize
,
933 dinput8_a_FindDevice
,
934 dinput8_a_EnumDevicesBySemantics
,
935 dinput8_a_ConfigureDevices
,
938 static HRESULT WINAPI
dinput7_a_QueryInterface( IDirectInput7A
*iface_a
, REFIID iid
, void **out
)
940 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
941 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
942 TRACE( "impl %p, iid %s, out %p.\n", impl
, debugstr_guid( iid
), out
);
943 return IDirectInput7_QueryInterface( iface_w
, iid
, out
);
946 static ULONG WINAPI
dinput7_a_AddRef( IDirectInput7A
*iface_a
)
948 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
949 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
950 TRACE( "impl %p.\n", impl
);
951 return IDirectInput7_AddRef( iface_w
);
954 static ULONG WINAPI
dinput7_a_Release( IDirectInput7A
*iface_a
)
956 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
957 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
958 TRACE( "impl %p.\n", impl
);
959 return IDirectInput7_Release( iface_w
);
962 static HRESULT WINAPI
dinput7_a_CreateDevice( IDirectInput7A
*iface_a
, REFGUID guid
, IDirectInputDeviceA
**out_a
, IUnknown
*outer
)
964 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
965 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
966 IDirectInputDeviceW
*out_w
;
969 TRACE( "impl %p, guid %s, out_a %p, outer %p.\n", impl
, debugstr_guid( guid
), out_a
, outer
);
971 if (!out_a
) return E_POINTER
;
973 hr
= IDirectInput7_CreateDevice( iface_w
, guid
, &out_w
, outer
);
974 *out_a
= IDirectInputDeviceA_from_IDirectInputDeviceW( out_w
);
978 static HRESULT WINAPI
dinput7_a_EnumDevices( IDirectInput7A
*iface_a
, DWORD type
, LPDIENUMDEVICESCALLBACKA callback
,
979 void *ref
, DWORD flags
)
981 struct enum_devices_wtoa_params params
= {callback
, ref
};
982 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
983 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
985 TRACE( "impl %p, type %#lx, callback %p, ref %p, flags %#lx.\n", impl
, type
, callback
, ref
, flags
);
987 if (!callback
) return DIERR_INVALIDPARAM
;
989 return IDirectInput7_EnumDevices( iface_w
, type
, enum_devices_wtoa_callback
, ¶ms
, flags
);
992 static HRESULT WINAPI
dinput7_a_GetDeviceStatus( IDirectInput7A
*iface_a
, REFGUID instance_guid
)
994 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
995 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
996 TRACE( "impl %p, instance_guid %s.\n", impl
, debugstr_guid( instance_guid
) );
997 return IDirectInput7_GetDeviceStatus( iface_w
, instance_guid
);
1000 static HRESULT WINAPI
dinput7_a_RunControlPanel( IDirectInput7A
*iface_a
, HWND owner
, DWORD flags
)
1002 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
1003 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
1004 TRACE( "impl %p, owner %p, flags %#lx.\n", impl
, owner
, flags
);
1005 return IDirectInput7_RunControlPanel( iface_w
, owner
, flags
);
1008 static HRESULT WINAPI
dinput7_a_Initialize( IDirectInput7A
*iface_a
, HINSTANCE instance
, DWORD version
)
1010 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
1011 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
1012 TRACE( "impl %p, instance %p, version %#lx.\n", impl
, instance
, version
);
1013 return IDirectInput7_Initialize( iface_w
, instance
, version
);
1016 static HRESULT WINAPI
dinput7_a_FindDevice( IDirectInput7A
*iface_a
, REFGUID guid
, const char *name_a
, GUID
*instance_guid
)
1018 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
1019 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
1023 TRACE( "impl %p, guid %s, name_a %s, instance_guid %s.\n", impl
, debugstr_guid( guid
),
1024 debugstr_a(name_a
), debugstr_guid( instance_guid
) );
1026 if (FAILED(hr
= string_atow( name_a
, &name_w
))) return hr
;
1028 hr
= IDirectInput7_FindDevice( iface_w
, guid
, name_w
, instance_guid
);
1033 static HRESULT WINAPI
dinput7_a_CreateDeviceEx( IDirectInput7A
*iface_a
, REFGUID guid
, REFIID iid
, void **out
, IUnknown
*outer
)
1035 struct dinput
*impl
= impl_from_IDirectInput7A( iface_a
);
1036 IDirectInput7W
*iface_w
= IDirectInput7W_from_impl( impl
);
1037 TRACE( "impl %p, guid %s, iid %s, out %p, outer %p.\n", impl
, debugstr_guid( guid
),
1038 debugstr_guid( iid
), out
, outer
);
1039 return IDirectInput7_CreateDeviceEx( iface_w
, guid
, iid
, out
, outer
);
1042 const IDirectInput7AVtbl dinput7_a_vtbl
=
1044 /*** IUnknown methods ***/
1045 dinput7_a_QueryInterface
,
1048 /*** IDirectInputA methods ***/
1049 dinput7_a_CreateDevice
,
1050 dinput7_a_EnumDevices
,
1051 dinput7_a_GetDeviceStatus
,
1052 dinput7_a_RunControlPanel
,
1053 dinput7_a_Initialize
,
1054 /*** IDirectInput2A methods ***/
1055 dinput7_a_FindDevice
,
1056 /*** IDirectInput7A methods ***/
1057 dinput7_a_CreateDeviceEx
,