1 /* DirectInput Joystick device
3 * Copyright 1998 Marcus Meissner
4 * Copyright 1998,1999 Lionel Ulmer
5 * Copyright 2000-2001 TransGaming Technologies Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "wine/port.h"
25 #ifdef HAVE_LINUX_22_JOYSTICK_API
34 #ifdef HAVE_SYS_TIME_H
35 # include <sys/time.h>
37 #include <sys/fcntl.h>
38 #ifdef HAVE_SYS_IOCTL_H
39 # include <sys/ioctl.h>
42 #ifdef HAVE_SYS_ERRNO_H
43 # include <sys/errno.h>
45 #ifdef HAVE_LINUX_JOYSTICK_H
46 # include <linux/joystick.h>
48 #define JOYDEV "/dev/js0"
50 #include "wine/debug.h"
51 #include "wine/unicode.h"
57 #include "dinput_private.h"
58 #include "device_private.h"
60 WINE_DEFAULT_DEBUG_CHANNEL(dinput
);
62 /* Wine joystick driver object instances */
63 #define WINE_JOYSTICK_AXIS_BASE 0
64 #define WINE_JOYSTICK_BUTTON_BASE 8
66 typedef struct JoystickImpl JoystickImpl
;
67 static ICOM_VTABLE(IDirectInputDevice8A
) JoystickAvt
;
68 static ICOM_VTABLE(IDirectInputDevice8W
) JoystickWvt
;
75 /* The 'parent' DInput */
76 IDirectInputImpl
*dinput
;
78 /* joystick private */
82 LONG lMin
,lMax
,deadzone
;
83 LPDIDEVICEOBJECTDATA data_queue
;
84 int queue_head
, queue_tail
, queue_len
;
88 static GUID DInput_Wine_Joystick_GUID
= { /* 9e573ed9-7734-11d2-8d4a-23903fb6bdf7 */
92 {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
95 static BOOL
joydev_enum_deviceA(DWORD dwDevType
, DWORD dwFlags
, LPDIDEVICEINSTANCEA lpddi
, int version
)
99 if (dwFlags
& DIEDFL_FORCEFEEDBACK
)
102 if ((dwDevType
==0) || (GET_DIDEVICE_TYPE(dwDevType
)==DIDEVTYPE_JOYSTICK
)) {
103 /* check whether we have a joystick */
104 if ((fd
= open(JOYDEV
,O_RDONLY
) != -1) || (errno
!=ENODEV
&& errno
!=ENOENT
)) {
105 TRACE("Enumerating the linux Joystick device\n");
107 /* Return joystick */
108 lpddi
->guidInstance
= GUID_Joystick
;
109 lpddi
->guidProduct
= DInput_Wine_Joystick_GUID
;
110 /* we only support traditional joysticks for now */
111 lpddi
->dwDevType
= DIDEVTYPE_JOYSTICK
|
112 (DIDEVTYPEJOYSTICK_TRADITIONAL
<<8);
113 strcpy(lpddi
->tszInstanceName
, "Joystick");
114 /* ioctl JSIOCGNAME(len) */
115 strcpy(lpddi
->tszProductName
, "Wine Joystick");
117 lpddi
->guidFFDriver
= GUID_NULL
;
127 static BOOL
joydev_enum_deviceW(DWORD dwDevType
, DWORD dwFlags
, LPDIDEVICEINSTANCEW lpddi
, int version
)
131 if (dwFlags
& DIEDFL_FORCEFEEDBACK
)
134 if ((dwDevType
==0) || (GET_DIDEVICE_TYPE(dwDevType
)==DIDEVTYPE_JOYSTICK
)) {
135 /* check whether we have a joystick */
136 if ((fd
= open(JOYDEV
,O_RDONLY
) != -1) || (errno
!=ENODEV
&& errno
!=ENOENT
)) {
137 TRACE("Enumerating the linux Joystick device\n");
139 /* Return joystick */
140 lpddi
->guidInstance
= GUID_Joystick
;
141 lpddi
->guidProduct
= DInput_Wine_Joystick_GUID
;
142 /* we only support traditional joysticks for now */
143 lpddi
->dwDevType
= DIDEVTYPE_JOYSTICK
|
144 (DIDEVTYPEJOYSTICK_TRADITIONAL
<<8);
146 MultiByteToWideChar(CP_ACP
, 0, "Joystick", -1, lpddi
->tszInstanceName
, MAX_PATH
);
147 /* ioctl JSIOCGNAME(len) */
148 MultiByteToWideChar(CP_ACP
, 0, "Wine Joystick", -1, lpddi
->tszProductName
, MAX_PATH
);
149 lpddi
->guidFFDriver
= GUID_NULL
;
159 static JoystickImpl
*alloc_device(REFGUID rguid
, LPVOID jvt
, IDirectInputImpl
*dinput
)
161 JoystickImpl
* newDevice
;
163 newDevice
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(JoystickImpl
));
164 newDevice
->lpVtbl
= jvt
;
166 newDevice
->joyfd
= -1;
167 newDevice
->lMin
= -32768;
168 newDevice
->lMax
= +32767;
169 newDevice
->dinput
= dinput
;
170 memcpy(&(newDevice
->guid
),rguid
,sizeof(*rguid
));
175 static HRESULT
joydev_create_deviceA(IDirectInputImpl
*dinput
, REFGUID rguid
, REFIID riid
, LPDIRECTINPUTDEVICEA
* pdev
)
177 if ((IsEqualGUID(&GUID_Joystick
,rguid
)) ||
178 (IsEqualGUID(&DInput_Wine_Joystick_GUID
,rguid
))) {
179 if ((riid
== NULL
) ||
180 IsEqualGUID(&IID_IDirectInputDeviceA
,riid
) ||
181 IsEqualGUID(&IID_IDirectInputDevice2A
,riid
) ||
182 IsEqualGUID(&IID_IDirectInputDevice7A
,riid
) ||
183 IsEqualGUID(&IID_IDirectInputDevice8A
,riid
)) {
184 *pdev
=(IDirectInputDeviceA
*) alloc_device(rguid
, &JoystickAvt
, dinput
);
186 TRACE("Creating a Joystick device (%p)\n", *pdev
);
189 return DIERR_NOINTERFACE
;
192 return DIERR_DEVICENOTREG
;
195 static HRESULT
joydev_create_deviceW(IDirectInputImpl
*dinput
, REFGUID rguid
, REFIID riid
, LPDIRECTINPUTDEVICEW
* pdev
)
197 if ((IsEqualGUID(&GUID_Joystick
,rguid
)) ||
198 (IsEqualGUID(&DInput_Wine_Joystick_GUID
,rguid
))) {
199 if ((riid
== NULL
) ||
200 IsEqualGUID(&IID_IDirectInputDeviceW
,riid
) ||
201 IsEqualGUID(&IID_IDirectInputDevice2W
,riid
) ||
202 IsEqualGUID(&IID_IDirectInputDevice7W
,riid
) ||
203 IsEqualGUID(&IID_IDirectInputDevice8W
,riid
)) {
204 *pdev
= (IDirectInputDeviceW
*) alloc_device(rguid
, &JoystickWvt
, dinput
);
206 TRACE("Creating a Joystick device (%p)\n", *pdev
);
209 return DIERR_NOINTERFACE
;
212 return DIERR_DEVICENOTREG
;
215 static dinput_device joydev
= {
219 joydev_create_deviceA
,
220 joydev_create_deviceW
223 DECL_GLOBAL_CONSTRUCTOR(joydev_register
) { dinput_register_device(&joydev
); }
225 /******************************************************************************
228 static ULONG WINAPI
JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface
)
230 ICOM_THIS(JoystickImpl
,iface
);
236 /* Free the data queue */
237 if (This
->data_queue
!= NULL
)
238 HeapFree(GetProcessHeap(),0,This
->data_queue
);
240 /* Free the DataFormat */
241 HeapFree(GetProcessHeap(), 0, This
->df
);
243 HeapFree(GetProcessHeap(),0,This
);
247 /******************************************************************************
248 * SetDataFormat : the application can choose the format of the data
249 * the device driver sends back with GetDeviceState.
251 static HRESULT WINAPI
JoystickAImpl_SetDataFormat(
252 LPDIRECTINPUTDEVICE8A iface
,LPCDIDATAFORMAT df
255 ICOM_THIS(JoystickImpl
,iface
);
258 TRACE("(this=%p,%p)\n",This
,df
);
260 TRACE("(df.dwSize=%ld)\n",df
->dwSize
);
261 TRACE("(df.dwObjsize=%ld)\n",df
->dwObjSize
);
262 TRACE("(df.dwFlags=0x%08lx)\n",df
->dwFlags
);
263 TRACE("(df.dwDataSize=%ld)\n",df
->dwDataSize
);
264 TRACE("(df.dwNumObjs=%ld)\n",df
->dwNumObjs
);
266 for (i
=0;i
<df
->dwNumObjs
;i
++) {
267 TRACE("df.rgodf[%d].guid %s (%p)\n",i
,debugstr_guid(df
->rgodf
[i
].pguid
), df
->rgodf
[i
].pguid
);
268 TRACE("df.rgodf[%d].dwOfs %ld\n",i
,df
->rgodf
[i
].dwOfs
);
269 TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df
->rgodf
[i
].dwType
),DIDFT_GETINSTANCE(df
->rgodf
[i
].dwType
));
270 TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i
,df
->rgodf
[i
].dwFlags
);
273 /* Store the new data format */
274 This
->df
= HeapAlloc(GetProcessHeap(),0,df
->dwSize
);
275 memcpy(This
->df
, df
, df
->dwSize
);
276 This
->df
->rgodf
= HeapAlloc(GetProcessHeap(),0,df
->dwNumObjs
*df
->dwObjSize
);
277 memcpy(This
->df
->rgodf
,df
->rgodf
,df
->dwNumObjs
*df
->dwObjSize
);
282 /******************************************************************************
283 * Acquire : gets exclusive control of the joystick
285 static HRESULT WINAPI
JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface
)
287 ICOM_THIS(JoystickImpl
,iface
);
289 TRACE("(this=%p)\n",This
);
292 This
->joyfd
=open(JOYDEV
,O_RDONLY
);
294 return DIERR_NOTFOUND
;
298 /******************************************************************************
299 * Unacquire : frees the joystick
301 static HRESULT WINAPI
JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface
)
303 ICOM_THIS(JoystickImpl
,iface
);
305 TRACE("(this=%p)\n",This
);
306 if (This
->joyfd
!=-1) {
315 #define map_axis(val) ((val+32768)*(This->lMax-This->lMin)/65536+This->lMin)
317 static void joy_polldev(JoystickImpl
*This
) {
325 memset(&tv
,0,sizeof(tv
));
326 FD_ZERO(&readfds
);FD_SET(This
->joyfd
,&readfds
);
327 if (1>select(This
->joyfd
+1,&readfds
,NULL
,NULL
,&tv
))
329 /* we have one event, so we can read */
330 if (sizeof(jse
)!=read(This
->joyfd
,&jse
,sizeof(jse
))) {
333 TRACE("js_event: type 0x%x, number %d, value %d\n",jse
.type
,jse
.number
,jse
.value
);
334 if (jse
.type
& JS_EVENT_BUTTON
) {
335 GEN_EVENT(DIJOFS_BUTTON(jse
.number
),jse
.value
?0x80:0x00,jse
.time
,(This
->dinput
->evsequence
)++);
336 This
->js
.rgbButtons
[jse
.number
] = jse
.value
?0x80:0x00;
338 if (jse
.type
& JS_EVENT_AXIS
) {
339 switch (jse
.number
) {
341 GEN_EVENT(jse
.number
*4,jse
.value
,jse
.time
,(This
->dinput
->evsequence
)++);
342 This
->js
.lX
= map_axis(jse
.value
);
345 GEN_EVENT(jse
.number
*4,jse
.value
,jse
.time
,(This
->dinput
->evsequence
)++);
346 This
->js
.lY
= map_axis(jse
.value
);
349 GEN_EVENT(jse
.number
*4,jse
.value
,jse
.time
,(This
->dinput
->evsequence
)++);
350 This
->js
.lZ
= map_axis(jse
.value
);
353 FIXME("more than 3 axes (%d) not handled!\n",jse
.number
);
360 /******************************************************************************
361 * GetDeviceState : returns the "state" of the joystick.
364 static HRESULT WINAPI
JoystickAImpl_GetDeviceState(
365 LPDIRECTINPUTDEVICE8A iface
,DWORD len
,LPVOID ptr
367 ICOM_THIS(JoystickImpl
,iface
);
370 TRACE("(this=%p,0x%08lx,%p)\n",This
,len
,ptr
);
371 if ((len
!= sizeof(DIJOYSTATE
)) && (len
!= sizeof(DIJOYSTATE2
))) {
372 FIXME("len %ld is not sizeof(DIJOYSTATE), unsupported format.\n",len
);
375 memcpy(ptr
,&(This
->js
),len
);
376 This
->queue_head
= 0;
377 This
->queue_tail
= 0;
381 /******************************************************************************
382 * GetDeviceData : gets buffered input data.
384 static HRESULT WINAPI
JoystickAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface
,
386 LPDIDEVICEOBJECTDATA dod
,
390 ICOM_THIS(JoystickImpl
,iface
);
392 FIXME("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx),STUB!\n",This
,dodsize
,*entries
,flags
);
395 if (flags
& DIGDD_PEEK
)
396 FIXME("DIGDD_PEEK\n");
404 /******************************************************************************
405 * SetProperty : change input device properties
407 static HRESULT WINAPI
JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface
,
411 ICOM_THIS(JoystickImpl
,iface
);
413 FIXME("(this=%p,%s,%p)\n",This
,debugstr_guid(rguid
),ph
);
414 FIXME("ph.dwSize = %ld, ph.dwHeaderSize =%ld, ph.dwObj = %ld, ph.dwHow= %ld\n",ph
->dwSize
, ph
->dwHeaderSize
,ph
->dwObj
,ph
->dwHow
);
416 if (!HIWORD(rguid
)) {
417 switch ((DWORD
)rguid
) {
418 case (DWORD
) DIPROP_BUFFERSIZE
: {
419 LPCDIPROPDWORD pd
= (LPCDIPROPDWORD
)ph
;
421 FIXME("buffersize = %ld\n",pd
->dwData
);
424 case (DWORD
)DIPROP_RANGE
: {
425 LPCDIPROPRANGE pr
= (LPCDIPROPRANGE
)ph
;
427 FIXME("proprange(%ld,%ld)\n",pr
->lMin
,pr
->lMax
);
428 This
->lMin
= pr
->lMin
;
429 This
->lMax
= pr
->lMax
;
432 case (DWORD
)DIPROP_DEADZONE
: {
433 LPCDIPROPDWORD pd
= (LPCDIPROPDWORD
)ph
;
435 FIXME("deadzone(%ld)\n",pd
->dwData
);
436 This
->deadzone
= pd
->dwData
;
440 FIXME("Unknown type %ld (%s)\n",(DWORD
)rguid
,debugstr_guid(rguid
));
447 /******************************************************************************
448 * SetEventNotification : specifies event to be sent on state change
450 static HRESULT WINAPI
JoystickAImpl_SetEventNotification(
451 LPDIRECTINPUTDEVICE8A iface
, HANDLE hnd
453 ICOM_THIS(JoystickImpl
,iface
);
455 TRACE("(this=%p,0x%08lx)\n",This
,(DWORD
)hnd
);
460 static HRESULT WINAPI
JoystickAImpl_GetCapabilities(
461 LPDIRECTINPUTDEVICE8A iface
,
462 LPDIDEVCAPS lpDIDevCaps
)
464 ICOM_THIS(JoystickImpl
,iface
);
466 int xfd
= This
->joyfd
;
468 TRACE("%p->(%p)\n",iface
,lpDIDevCaps
);
470 xfd
= open(JOYDEV
,O_RDONLY
);
471 lpDIDevCaps
->dwFlags
= DIDC_ATTACHED
;
472 lpDIDevCaps
->dwDevType
= DIDEVTYPE_JOYSTICK
;
474 if (-1==ioctl(xfd
,JSIOCGAXES
,&axes
))
476 lpDIDevCaps
->dwAxes
= axes
;
479 if (-1==ioctl(xfd
,JSIOCGAXES
,&buttons
))
481 lpDIDevCaps
->dwButtons
= buttons
;
483 if (xfd
!=This
->joyfd
)
487 static HRESULT WINAPI
JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface
) {
488 ICOM_THIS(JoystickImpl
,iface
);
495 /******************************************************************************
496 * EnumObjects : enumerate the different buttons and axis...
498 static HRESULT WINAPI
JoystickAImpl_EnumObjects(
499 LPDIRECTINPUTDEVICE8A iface
,
500 LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback
,
504 ICOM_THIS(JoystickImpl
,iface
);
505 DIDEVICEOBJECTINSTANCEA ddoi
;
506 int xfd
= This
->joyfd
;
508 TRACE("(this=%p,%p,%p,%08lx)\n", This
, lpCallback
, lpvRef
, dwFlags
);
509 if (TRACE_ON(dinput
)) {
510 TRACE(" - flags = ");
511 _dump_EnumObjects_flags(dwFlags
);
515 /* Only the fields till dwFFMaxForce are relevant */
516 ddoi
.dwSize
= FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA
, dwFFMaxForce
);
518 /* For the joystick, do as is done in the GetCapabilities function */
519 if ((dwFlags
== DIDFT_ALL
) ||
520 (dwFlags
& DIDFT_AXIS
)) {
524 if (-1==ioctl(xfd
,JSIOCGAXES
,&axes
))
528 for (i
= 0; i
< axes
; i
++) {
531 ddoi
.guidType
= GUID_XAxis
;
532 ddoi
.dwOfs
= DIJOFS_X
;
535 ddoi
.guidType
= GUID_YAxis
;
536 ddoi
.dwOfs
= DIJOFS_Y
;
539 ddoi
.guidType
= GUID_ZAxis
;
540 ddoi
.dwOfs
= DIJOFS_Z
;
543 ddoi
.guidType
= GUID_Unknown
;
544 ddoi
.dwOfs
= DIJOFS_Z
+ (i
- 2) * sizeof(LONG
);
546 ddoi
.dwType
= DIDFT_MAKEINSTANCE((0x0001 << i
) << WINE_JOYSTICK_AXIS_BASE
) | DIDFT_ABSAXIS
;
547 sprintf(ddoi
.tszName
, "%d-Axis", i
);
548 _dump_OBJECTINSTANCEA(&ddoi
);
549 if (lpCallback(&ddoi
, lpvRef
) != DIENUM_CONTINUE
) return DI_OK
;
553 if ((dwFlags
== DIDFT_ALL
) ||
554 (dwFlags
& DIDFT_BUTTON
)) {
558 if (-1==ioctl(xfd
,JSIOCGAXES
,&buttons
))
562 /* The DInput SDK says that GUID_Button is only for mouse buttons but well... */
563 ddoi
.guidType
= GUID_Button
;
565 for (i
= 0; i
< buttons
; i
++) {
566 ddoi
.dwOfs
= DIJOFS_BUTTON(i
);
567 ddoi
.dwType
= DIDFT_MAKEINSTANCE((0x0001 << i
) << WINE_JOYSTICK_BUTTON_BASE
) | DIDFT_PSHBUTTON
;
568 sprintf(ddoi
.tszName
, "%d-Button", i
);
569 _dump_OBJECTINSTANCEA(&ddoi
);
570 if (lpCallback(&ddoi
, lpvRef
) != DIENUM_CONTINUE
) return DI_OK
;
574 if (xfd
!=This
->joyfd
)
580 /******************************************************************************
581 * EnumObjects : enumerate the different buttons and axis...
583 static HRESULT WINAPI
JoystickWImpl_EnumObjects(
584 LPDIRECTINPUTDEVICE8W iface
,
585 LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback
,
589 ICOM_THIS(JoystickImpl
,iface
);
591 device_enumobjects_AtoWcb_data data
;
593 data
.lpCallBack
= lpCallback
;
594 data
.lpvRef
= lpvRef
;
596 return JoystickAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A
) This
, (LPDIENUMDEVICEOBJECTSCALLBACKA
) DIEnumDevicesCallbackAtoW
, (LPVOID
) &data
, dwFlags
);
599 /******************************************************************************
600 * GetProperty : get input device properties
602 static HRESULT WINAPI
JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface
,
604 LPDIPROPHEADER pdiph
)
606 ICOM_THIS(JoystickImpl
,iface
);
608 TRACE("(this=%p,%s,%p): stub!\n",
609 iface
, debugstr_guid(rguid
), pdiph
);
611 if (TRACE_ON(dinput
))
612 _dump_DIPROPHEADER(pdiph
);
614 if (!HIWORD(rguid
)) {
615 switch ((DWORD
)rguid
) {
616 case (DWORD
) DIPROP_BUFFERSIZE
: {
617 LPDIPROPDWORD pd
= (LPDIPROPDWORD
)pdiph
;
619 TRACE(" return buffersize = %d\n",This
->queue_len
);
620 pd
->dwData
= This
->queue_len
;
624 case (DWORD
) DIPROP_RANGE
: {
625 LPDIPROPRANGE pr
= (LPDIPROPRANGE
) pdiph
;
627 if ((pdiph
->dwHow
== DIPH_BYID
) &&
628 (pdiph
->dwObj
& DIDFT_ABSAXIS
)) {
629 /* The app is querying the current range of the axis : return the lMin and lMax values */
630 pr
->lMin
= This
->lMin
;
631 pr
->lMax
= This
->lMax
;
638 FIXME("Unknown type %ld (%s)\n",(DWORD
)rguid
,debugstr_guid(rguid
));
647 static ICOM_VTABLE(IDirectInputDevice8A
) JoystickAvt
=
649 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
650 IDirectInputDevice2AImpl_QueryInterface
,
651 IDirectInputDevice2AImpl_AddRef
,
652 JoystickAImpl_Release
,
653 JoystickAImpl_GetCapabilities
,
654 JoystickAImpl_EnumObjects
,
655 JoystickAImpl_GetProperty
,
656 JoystickAImpl_SetProperty
,
657 JoystickAImpl_Acquire
,
658 JoystickAImpl_Unacquire
,
659 JoystickAImpl_GetDeviceState
,
660 JoystickAImpl_GetDeviceData
,
661 JoystickAImpl_SetDataFormat
,
662 JoystickAImpl_SetEventNotification
,
663 IDirectInputDevice2AImpl_SetCooperativeLevel
,
664 IDirectInputDevice2AImpl_GetObjectInfo
,
665 IDirectInputDevice2AImpl_GetDeviceInfo
,
666 IDirectInputDevice2AImpl_RunControlPanel
,
667 IDirectInputDevice2AImpl_Initialize
,
668 IDirectInputDevice2AImpl_CreateEffect
,
669 IDirectInputDevice2AImpl_EnumEffects
,
670 IDirectInputDevice2AImpl_GetEffectInfo
,
671 IDirectInputDevice2AImpl_GetForceFeedbackState
,
672 IDirectInputDevice2AImpl_SendForceFeedbackCommand
,
673 IDirectInputDevice2AImpl_EnumCreatedEffectObjects
,
674 IDirectInputDevice2AImpl_Escape
,
676 IDirectInputDevice2AImpl_SendDeviceData
,
677 IDirectInputDevice7AImpl_EnumEffectsInFile
,
678 IDirectInputDevice7AImpl_WriteEffectToFile
,
679 IDirectInputDevice8AImpl_BuildActionMap
,
680 IDirectInputDevice8AImpl_SetActionMap
,
681 IDirectInputDevice8AImpl_GetImageInfo
684 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
685 # define XCAST(fun) (typeof(SysJoystickWvt.fun))
687 # define XCAST(fun) (void*)
690 static ICOM_VTABLE(IDirectInputDevice8W
) SysJoystickWvt
=
692 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
693 IDirectInputDevice2WImpl_QueryInterface
,
694 XCAST(AddRef
)IDirectInputDevice2AImpl_AddRef
,
695 XCAST(Release
)JoystickAImpl_Release
,
696 XCAST(GetCapabilities
)JoystickAImpl_GetCapabilities
,
697 JoystickWImpl_EnumObjects
,
698 XCAST(GetProperty
)JoystickAImpl_GetProperty
,
699 XCAST(SetProperty
)JoystickAImpl_SetProperty
,
700 XCAST(Acquire
)JoystickAImpl_Acquire
,
701 XCAST(Unacquire
)JoystickAImpl_Unacquire
,
702 XCAST(GetDeviceState
)JoystickAImpl_GetDeviceState
,
703 XCAST(GetDeviceData
)JoystickAImpl_GetDeviceData
,
704 XCAST(SetDataFormat
)JoystickAImpl_SetDataFormat
,
705 XCAST(SetEventNotification
)JoystickAImpl_SetEventNotification
,
706 XCAST(SetCooperativeLevel
)IDirectInputDevice2AImpl_SetCooperativeLevel
,
707 IDirectInputDevice2WImpl_GetObjectInfo
,
708 IDirectInputDevice2WImpl_GetDeviceInfo
,
709 XCAST(RunControlPanel
)IDirectInputDevice2AImpl_RunControlPanel
,
710 XCAST(Initialize
)IDirectInputDevice2AImpl_Initialize
,
711 XCAST(CreateEffect
)IDirectInputDevice2AImpl_CreateEffect
,
712 IDirectInputDevice2WImpl_EnumEffects
,
713 IDirectInputDevice2WImpl_GetEffectInfo
,
714 XCAST(GetForceFeedbackState
)IDirectInputDevice2AImpl_GetForceFeedbackState
,
715 XCAST(SendForceFeedbackCommand
)IDirectInputDevice2AImpl_SendForceFeedbackCommand
,
716 XCAST(EnumCreatedEffectObjects
)IDirectInputDevice2AImpl_EnumCreatedEffectObjects
,
717 XCAST(Escape
)IDirectInputDevice2AImpl_Escape
,
718 XCAST(Poll
)JoystickAImpl_Poll
,
719 XCAST(SendDeviceData
)IDirectInputDevice2AImpl_SendDeviceData
,
720 IDirectInputDevice7WImpl_EnumEffectsInFile
,
721 IDirectInputDevice7WImpl_WriteEffectToFile
,
722 IDirectInputDevice8WImpl_BuildActionMap
,
723 IDirectInputDevice8WImpl_SetActionMap
,
724 IDirectInputDevice8WImpl_GetImageInfo
728 #endif /* HAVE_LINUX_22_JOYSTICK_API */