Hi all, Here is my first ReWind backport. You will need to create a dlls/dinput8 directory and re-run both 'make_dlls' and 'autoconf'. The new files are part of the patch as a diff against /dev/null. Hope it will work. I did some minimal regression testing, but do not hesitate to shout if I broke anything. Time now to look at the other ones :-) Changelog: Ove Kaaven <ovek@transgaming.com> - support DirectInput 8 interfaces. - implemented mouse wheel support. Lionel -- Lionel Ulmer - http://www.bbrox.org/
Index: configure.ac =================================================================== RCS file: /home/wine/wine/configure.ac,v retrieving revision 1.48 diff -u -r1.48 configure.ac --- configure.ac 4 Jun 2002 21:29:40 -0000 1.48 +++ configure.ac 10 Jun 2002 19:41:05 -0000 @@ -1247,6 +1247,7 @@ dlls/ddraw/Makefile dlls/devenum/Makefile dlls/dinput/Makefile +dlls/dinput8/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dsound/Makefile Index: dlls/dinput/device.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/device.c,v retrieving revision 1.6 diff -u -r1.6 device.c --- dlls/dinput/device.c 31 May 2002 23:25:46 -0000 1.6 +++ dlls/dinput/device.c 10 Jun 2002 19:41:08 -0000 @@ -272,7 +272,7 @@ */ HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat( - LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df + LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) { int i; ICOM_THIS(IDirectInputDevice2AImpl,iface); @@ -295,7 +295,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel( - LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags + LPDIRECTINPUTDEVICE8A iface,HWND hwnd,DWORD dwflags ) { ICOM_THIS(IDirectInputDevice2AImpl,iface); TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags); @@ -305,14 +305,14 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification( - LPDIRECTINPUTDEVICE2A iface,HANDLE hnd + LPDIRECTINPUTDEVICE8A iface,HANDLE hnd ) { ICOM_THIS(IDirectInputDevice2AImpl,iface); FIXME("(this=%p,0x%08lx): stub\n",This,(DWORD)hnd); return 0; } -ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE2A iface) +ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(IDirectInputDevice2AImpl,iface); This->ref--; @@ -323,7 +323,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface( - LPDIRECTINPUTDEVICE2A iface,REFIID riid,LPVOID *ppobj + LPDIRECTINPUTDEVICE8A iface,REFIID riid,LPVOID *ppobj ) { ICOM_THIS(IDirectInputDevice2AImpl,iface); @@ -349,14 +349,14 @@ } ULONG WINAPI IDirectInputDevice2AImpl_AddRef( - LPDIRECTINPUTDEVICE2A iface) + LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(IDirectInputDevice2AImpl,iface); return ++This->ref; } HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) @@ -372,7 +372,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_GetProperty( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPDIPROPHEADER pdiph) { @@ -386,7 +386,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_GetObjectInfo( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) @@ -398,7 +398,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEINSTANCEA pdidi) { FIXME("(this=%p,%p): stub!\n", @@ -408,7 +408,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_RunControlPanel( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, HWND hwndOwner, DWORD dwFlags) { @@ -419,7 +419,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_Initialize( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) @@ -434,7 +434,7 @@ */ HRESULT WINAPI IDirectInputDevice2AImpl_CreateEffect( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdef, @@ -446,7 +446,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_EnumEffects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) @@ -460,7 +460,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_GetEffectInfo( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIEFFECTINFOA lpdei, REFGUID rguid) { @@ -470,7 +470,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_GetForceFeedbackState( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDWORD pdwOut) { FIXME("(this=%p,%p): stub!\n", @@ -479,7 +479,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_SendForceFeedbackCommand( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, DWORD dwFlags) { FIXME("(this=%p,0x%08lx): stub!\n", @@ -488,7 +488,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_EnumCreatedEffectObjects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID lpvRef, DWORD dwFlags) @@ -501,7 +501,7 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_Escape( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIEFFESCAPE lpDIEEsc) { FIXME("(this=%p,%p): stub!\n", @@ -510,16 +510,16 @@ } HRESULT WINAPI IDirectInputDevice2AImpl_Poll( - LPDIRECTINPUTDEVICE2A iface) + LPDIRECTINPUTDEVICE8A iface) { /* Because wine devices do not need to be polled, just return DI_NOEFFECT */ return DI_NOEFFECT; } HRESULT WINAPI IDirectInputDevice2AImpl_SendDeviceData( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, DWORD cbObjectData, - LPDIDEVICEOBJECTDATA rgdod, + LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) { @@ -529,7 +529,7 @@ return DI_OK; } -HRESULT WINAPI IDirectInputDevice7AImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE7A iface, +HRESULT WINAPI IDirectInputDevice7AImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE8A iface, LPCSTR lpszFileName, LPDIENUMEFFECTSINFILECALLBACK pec, LPVOID pvRef, @@ -540,7 +540,7 @@ return DI_OK; } -HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE7A iface, +HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8A iface, LPCSTR lpszFileName, DWORD dwEntries, LPDIFILEEFFECT rgDiFileEft, @@ -548,5 +548,33 @@ { FIXME("(%p)->(%s,%08lx,%p,%08lx): stub !\n", iface, lpszFileName, dwEntries, rgDiFileEft, dwFlags); + return DI_OK; +} + +HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, + LPDIACTIONFORMATA lpdiaf, + LPCSTR lpszUserName, + DWORD dwFlags) +{ + FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, lpszUserName, dwFlags); + + return DI_OK; +} + +HRESULT WINAPI IDirectInputDevice8AImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface, + LPDIACTIONFORMATA lpdiaf, + LPCSTR lpszUserName, + DWORD dwFlags) +{ + FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, lpszUserName, dwFlags); + + return DI_OK; +} + +HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo(LPDIRECTINPUTDEVICE8A iface, + LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader) +{ + FIXME("(%p)->(%p): stub !\n", iface, lpdiDevImageInfoHeader); + return DI_OK; } Index: dlls/dinput/device_private.h =================================================================== RCS file: /home/wine/wine/dlls/dinput/device_private.h,v retrieving revision 1.3 diff -u -r1.3 device_private.h --- dlls/dinput/device_private.h 9 Mar 2002 23:29:36 -0000 1.3 +++ dlls/dinput/device_private.h 10 Jun 2002 19:41:08 -0000 @@ -1,5 +1,6 @@ /* * Copyright 2000 Lionel Ulmer + * Copyright 2000-2001 TransGaming Technologies Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -78,88 +79,98 @@ /* And the stubs */ extern HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat( - LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df ) ; + LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel( - LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags ) ; + LPDIRECTINPUTDEVICE8A iface,HWND hwnd,DWORD dwflags ) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification( - LPDIRECTINPUTDEVICE2A iface,HANDLE hnd ) ; -extern ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE2A iface) ; + LPDIRECTINPUTDEVICE8A iface,HANDLE hnd ) ; +extern ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE8A iface) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface( - LPDIRECTINPUTDEVICE2A iface,REFIID riid,LPVOID *ppobj ) ; + LPDIRECTINPUTDEVICE8A iface,REFIID riid,LPVOID *ppobj ) ; extern ULONG WINAPI IDirectInputDevice2AImpl_AddRef( - LPDIRECTINPUTDEVICE2A iface) ; + LPDIRECTINPUTDEVICE8A iface) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetProperty( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPDIPROPHEADER pdiph) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetObjectInfo( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEINSTANCEA pdidi) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_RunControlPanel( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, HWND hwndOwner, DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_Initialize( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_CreateEffect( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdef, LPUNKNOWN pUnkOuter) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_EnumEffects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetEffectInfo( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIEFFECTINFOA lpdei, REFGUID rguid) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetForceFeedbackState( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDWORD pdwOut) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_SendForceFeedbackCommand( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_EnumCreatedEffectObjects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID lpvRef, DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_Escape( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIEFFESCAPE lpDIEEsc) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_Poll( - LPDIRECTINPUTDEVICE2A iface) ; + LPDIRECTINPUTDEVICE8A iface) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_SendDeviceData( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, DWORD cbObjectData, - LPDIDEVICEOBJECTDATA rgdod, + LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) ; -extern HRESULT WINAPI IDirectInputDevice7AImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE7A iface, +extern HRESULT WINAPI IDirectInputDevice7AImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE8A iface, LPCSTR lpszFileName, LPDIENUMEFFECTSINFILECALLBACK pec, LPVOID pvRef, DWORD dwFlags) ; -extern HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE7A iface, +extern HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8A iface, LPCSTR lpszFileName, DWORD dwEntries, LPDIFILEEFFECT rgDiFileEft, DWORD dwFlags) ; +extern HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, + LPDIACTIONFORMATA lpdiaf, + LPCSTR lpszUserName, + DWORD dwFlags); +extern HRESULT WINAPI IDirectInputDevice8AImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface, + LPDIACTIONFORMATA lpdiaf, + LPCSTR lpszUserName, + DWORD dwFlags); +extern HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo(LPDIRECTINPUTDEVICE8A iface, + LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader); #endif /* __WINE_DLLS_DINPUT_DINPUTDEVICE_PRIVATE_H */ Index: dlls/dinput/dinput_main.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/dinput_main.c,v retrieving revision 1.27 diff -u -r1.27 dinput_main.c --- dlls/dinput/dinput_main.c 31 May 2002 23:25:46 -0000 1.27 +++ dlls/dinput/dinput_main.c 10 Jun 2002 19:41:08 -0000 @@ -2,6 +2,7 @@ * * Copyright 1998 Marcus Meissner * Copyright 1998,1999 Lionel Ulmer + * Copyright 2000-2002 TransGaming Technologies Inc. * * * This library is free software; you can redistribute it and/or @@ -26,10 +27,6 @@ * Doesn't get Input Focus. * * - Fallout : works great in X and DGA mode - * - * FIXME: The keyboard handling needs to (and will) be merged into keyboard.c - * (The current implementation is currently only a proof of concept and - * an utter mess.) */ #include "config.h" @@ -45,8 +42,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput); -static ICOM_VTABLE(IDirectInputA) ddiavt; static ICOM_VTABLE(IDirectInput7A) ddi7avt; +static ICOM_VTABLE(IDirectInput8A) ddi8avt; /* This array will be filled a dinput.so loading */ #define MAX_WINE_DINPUT_DEVICES 4 @@ -103,19 +100,22 @@ TRACE("(0x%08lx,%04lx,%s,%p,%p)\n", (DWORD)hinst,dwVersion,debugstr_guid(riid),ppDI,punkOuter ); - if (IsEqualGUID(&IID_IDirectInputA,riid)) { + if (IsEqualGUID(&IID_IDirectInputA,riid) || + IsEqualGUID(&IID_IDirectInput2A,riid) || + IsEqualGUID(&IID_IDirectInput7A,riid)) { This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl)); + This->lpVtbl = &ddi7avt; This->ref = 1; - ICOM_VTBL(This) = &ddiavt; *ppDI = This; return DI_OK; } - if (IsEqualGUID(&IID_IDirectInput7A,riid)) { + + if (IsEqualGUID(&IID_IDirectInput8A,riid)) { This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl)); + This->lpVtbl = &ddi8avt; This->ref = 1; - ICOM_VTBL(This) = (ICOM_VTABLE(IDirectInputA) *) &ddi7avt; *ppDI = This; return DI_OK; @@ -134,10 +134,11 @@ (DWORD)hinst,dwVersion,ppDI,punkOuter ); This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl)); + This->lpVtbl = &ddi7avt; This->ref = 1; - ICOM_VTBL(This) = &ddiavt; *ppDI=(IDirectInputA*)This; return 0; + } /****************************************************************************** * IDirectInputA_EnumDevices @@ -155,6 +156,7 @@ for (i = 0; i < nrof_dinput_devices; i++) { if (dinput_devices[i]->enum_device(dwDevType, dwFlags, &devInstance)) { + devInstance.dwSize = sizeof(devInstance); if (lpCallback(&devInstance,pvRef) == DIENUM_STOP) return 0; } @@ -163,6 +165,24 @@ return 0; } +static HRESULT WINAPI IDirectInputAImpl_QueryInterface( + LPDIRECTINPUT7A iface,REFIID riid,LPVOID *ppobj +) { + ICOM_THIS(IDirectInputAImpl,iface); + + TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); + if (IsEqualGUID(&IID_IUnknown,riid) || + IsEqualGUID(&IID_IDirectInputA,riid) || + IsEqualGUID(&IID_IDirectInput2A,riid) || + IsEqualGUID(&IID_IDirectInput7A,riid)) { + IDirectInputA_AddRef(iface); + *ppobj = This; + return 0; + } + TRACE("Unsupported interface !\n"); + return E_FAIL; +} + static ULONG WINAPI IDirectInputAImpl_AddRef(LPDIRECTINPUT7A iface) { ICOM_THIS(IDirectInputAImpl,iface); @@ -202,26 +222,6 @@ return ret_value; } -static HRESULT WINAPI IDirectInputAImpl_QueryInterface( - LPDIRECTINPUT7A iface,REFIID riid,LPVOID *ppobj -) { - ICOM_THIS(IDirectInputAImpl,iface); - - TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); - if (IsEqualGUID(&IID_IUnknown,riid)) { - IDirectInputA_AddRef(iface); - *ppobj = This; - return 0; - } - if (IsEqualGUID(&IID_IDirectInputA,riid)) { - IDirectInputA_AddRef(iface); - *ppobj = This; - return 0; - } - TRACE("Unsupported interface !\n"); - return E_FAIL; -} - static HRESULT WINAPI IDirectInputAImpl_Initialize( LPDIRECTINPUT7A iface,HINSTANCE hinst,DWORD x ) { @@ -246,7 +246,7 @@ return DI_OK; } -static HRESULT WINAPI IDirectInput2AImpl_FindDevice(LPDIRECTINPUT2A iface, REFGUID rguid, +static HRESULT WINAPI IDirectInput2AImpl_FindDevice(LPDIRECTINPUT7A iface, REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) { ICOM_THIS(IDirectInputAImpl,iface); FIXME("(%p)->(%s, %s, %p): stub\n", This, debugstr_guid(rguid), pszName, pguidInstance); @@ -276,14 +276,54 @@ return ret_value; } +static HRESULT WINAPI IDirectInput8AImpl_QueryInterface( + LPDIRECTINPUT8A iface,REFIID riid,LPVOID *ppobj +) { + ICOM_THIS(IDirectInputAImpl,iface); + + TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); + if (IsEqualGUID(&IID_IUnknown,riid) || + IsEqualGUID(&IID_IDirectInput8A,riid)) { + IDirectInputA_AddRef(iface); + *ppobj = This; + return 0; + } + TRACE("Unsupported interface !\n"); + return E_FAIL; +} + +static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics( + LPDIRECTINPUT8A iface, LPCSTR ptszUserName, LPDIACTIONFORMATA lpdiActionFormat, + LPDIENUMDEVICESBYSEMANTICSCBA lpCallback, + LPVOID pvRef, DWORD dwFlags +) +{ + ICOM_THIS(IDirectInputAImpl,iface); + + FIXME("(this=%p,%s,%p,%p,%p,%04lx): stub\n", This, ptszUserName, lpdiActionFormat, + lpCallback, pvRef, dwFlags); + return 0; +} + +static HRESULT WINAPI IDirectInput8AImpl_ConfigureDevices( + LPDIRECTINPUT8A iface, LPDICONFIGUREDEVICESCALLBACK lpdiCallback, + LPDICONFIGUREDEVICESPARAMSA lpdiCDParams, DWORD dwFlags, LPVOID pvRefData +) +{ + ICOM_THIS(IDirectInputAImpl,iface); + + FIXME("(this=%p,%p,%p,%04lx,%p): stub\n", This, lpdiCallback, lpdiCDParams, + dwFlags, pvRefData); + return 0; +} + #if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(ddiavt.fun)) +# define XCAST(fun) (typeof(ddi7avt.fun)) #else # define XCAST(fun) (void*) #endif -static ICOM_VTABLE(IDirectInputA) ddiavt = -{ +static ICOM_VTABLE(IDirectInput7A) ddi7avt = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE XCAST(QueryInterface)IDirectInputAImpl_QueryInterface, XCAST(AddRef)IDirectInputAImpl_AddRef, @@ -292,19 +332,21 @@ XCAST(EnumDevices)IDirectInputAImpl_EnumDevices, XCAST(GetDeviceStatus)IDirectInputAImpl_GetDeviceStatus, XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, - XCAST(Initialize)IDirectInputAImpl_Initialize + XCAST(Initialize)IDirectInputAImpl_Initialize, + XCAST(FindDevice)IDirectInput2AImpl_FindDevice, + IDirectInput7AImpl_CreateDeviceEx }; #undef XCAST #if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(ddi7avt.fun)) +# define XCAST(fun) (typeof(ddi8avt.fun)) #else # define XCAST(fun) (void*) #endif -static ICOM_VTABLE(IDirectInput7A) ddi7avt = { +static ICOM_VTABLE(IDirectInput8A) ddi8avt = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)IDirectInputAImpl_QueryInterface, + XCAST(QueryInterface)IDirectInput8AImpl_QueryInterface, XCAST(AddRef)IDirectInputAImpl_AddRef, XCAST(Release)IDirectInputAImpl_Release, XCAST(CreateDevice)IDirectInputAImpl_CreateDevice, @@ -313,7 +355,8 @@ XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, XCAST(Initialize)IDirectInputAImpl_Initialize, XCAST(FindDevice)IDirectInput2AImpl_FindDevice, - IDirectInput7AImpl_CreateDeviceEx + IDirectInput8AImpl_EnumDevicesBySemantics, + IDirectInput8AImpl_ConfigureDevices }; #undef XCAST Index: dlls/dinput/dinput_private.h =================================================================== RCS file: /home/wine/wine/dlls/dinput/dinput_private.h,v retrieving revision 1.5 diff -u -r1.5 dinput_private.h --- dlls/dinput/dinput_private.h 2 Jun 2002 21:18:48 -0000 1.5 +++ dlls/dinput/dinput_private.h 10 Jun 2002 19:41:08 -0000 @@ -26,11 +26,11 @@ typedef struct IDirectInputAImpl IDirectInputAImpl; struct IDirectInputAImpl { - ICOM_VFIELD(IDirectInputA); - DWORD ref; + LPVOID lpVtbl; + DWORD ref; - /* Used to have an unique sequence number for all the events */ - DWORD evsequence; + /* Used to have an unique sequence number for all the events */ + DWORD evsequence; }; /* Function called by all devices that Wine supports */ Index: dlls/dinput/joystick/linux.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/joystick/linux.c,v retrieving revision 1.10 diff -u -r1.10 linux.c --- dlls/dinput/joystick/linux.c 2 Jun 2002 21:18:48 -0000 1.10 +++ dlls/dinput/joystick/linux.c 10 Jun 2002 19:41:09 -0000 @@ -2,6 +2,7 @@ * * Copyright 1998 Marcus Meissner * Copyright 1998,1999 Lionel Ulmer + * Copyright 2000-2001 TransGaming Technologies Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -56,12 +57,10 @@ #define WINE_JOYSTICK_BUTTON_BASE 8 typedef struct JoystickAImpl JoystickAImpl; -static ICOM_VTABLE(IDirectInputDevice2A) JoystickAvt; -static ICOM_VTABLE(IDirectInputDevice7A) Joystick7Avt; +static ICOM_VTABLE(IDirectInputDevice8A) JoystickAvt; struct JoystickAImpl { - /* IDirectInputDevice2AImpl */ - ICOM_VFIELD(IDirectInputDevice2A); + LPVOID lpVtbl; DWORD ref; GUID guid; @@ -87,10 +86,15 @@ static BOOL joydev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi) { + int fd = -1; + + if (dwFlags & DIEDFL_FORCEFEEDBACK) + return FALSE; + if ((dwDevType==0) || (GET_DIDEVICE_TYPE(dwDevType)==DIDEVTYPE_JOYSTICK)) { /* check whether we have a joystick */ - if ((access(JOYDEV,O_RDONLY) != -1) || (errno!=ENODEV && errno!=ENOENT)) { - TRACE("Enumerating the Joystick device\n"); + if ((fd = open(JOYDEV,O_RDONLY) != -1) || (errno!=ENODEV && errno!=ENOENT)) { + TRACE("Enumerating the linux Joystick device\n"); /* Return joystick */ lpddi->guidInstance = GUID_Joystick; @@ -102,6 +106,9 @@ /* ioctl JSIOCGNAME(len) */ strcpy(lpddi->tszProductName, "Wine Joystick"); + lpddi->guidFFDriver = GUID_NULL; + if (fd != -1) + close(fd); return TRUE; } } @@ -109,14 +116,14 @@ return FALSE; } -static JoystickAImpl *alloc_device(REFGUID rguid, ICOM_VTABLE(IDirectInputDevice2A) *jvt, IDirectInputAImpl *dinput) +static JoystickAImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputAImpl *dinput) { JoystickAImpl* newDevice; newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickAImpl)); - newDevice->ref = 1; - ICOM_VTBL(newDevice) = jvt; - newDevice->joyfd = -1; + newDevice->lpVtbl = jvt; + newDevice->ref = 1; + newDevice->joyfd = -1; newDevice->lMin = -32768; newDevice->lMax = +32767; newDevice->dinput = dinput; @@ -129,16 +136,15 @@ { if ((IsEqualGUID(&GUID_Joystick,rguid)) || (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) { - if ((riid == NULL) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid))) { + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceA,riid) || + IsEqualGUID(&IID_IDirectInputDevice2A,riid) || + IsEqualGUID(&IID_IDirectInputDevice7A,riid) || + IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { *pdev=(IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput); TRACE("Creating a Joystick device (%p)\n", *pdev); return DI_OK; - } else if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) { - *pdev=(IDirectInputDeviceA*) alloc_device(rguid, (ICOM_VTABLE(IDirectInputDevice2A) *) &Joystick7Avt, dinput); - - TRACE("Creating a Joystick DInput7A device (%p)\n", *pdev); - return DI_OK; } else return DIERR_NOINTERFACE; } @@ -157,7 +163,7 @@ /****************************************************************************** * Joystick */ -static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE2A iface) +static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickAImpl,iface); @@ -181,7 +187,7 @@ * the device driver sends back with GetDeviceState. */ static HRESULT WINAPI JoystickAImpl_SetDataFormat( - LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df + LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) { ICOM_THIS(JoystickAImpl,iface); @@ -214,7 +220,7 @@ /****************************************************************************** * Acquire : gets exclusive control of the joystick */ -static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickAImpl,iface); @@ -230,7 +236,7 @@ /****************************************************************************** * Unacquire : frees the joystick */ -static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickAImpl,iface); @@ -292,7 +298,7 @@ * */ static HRESULT WINAPI JoystickAImpl_GetDeviceState( - LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr + LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { ICOM_THIS(JoystickAImpl,iface); @@ -310,7 +316,7 @@ /****************************************************************************** * GetDeviceData : gets buffered input data. */ -static HRESULT WINAPI JoystickAImpl_GetDeviceData(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI JoystickAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, @@ -333,7 +339,7 @@ /****************************************************************************** * SetProperty : change input device properties */ -static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPCDIPROPHEADER ph) { @@ -377,7 +383,7 @@ * SetEventNotification : specifies event to be sent on state change */ static HRESULT WINAPI JoystickAImpl_SetEventNotification( - LPDIRECTINPUTDEVICE2A iface, HANDLE hnd + LPDIRECTINPUTDEVICE8A iface, HANDLE hnd ) { ICOM_THIS(JoystickAImpl,iface); @@ -387,7 +393,7 @@ } static HRESULT WINAPI JoystickAImpl_GetCapabilities( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { ICOM_THIS(JoystickAImpl,iface); @@ -413,7 +419,7 @@ close(xfd); return DI_OK; } -static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE2A iface) { +static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickAImpl,iface); TRACE("(),stub!\n"); @@ -425,7 +431,7 @@ * EnumObjects : enumerate the different buttons and axis... */ static HRESULT WINAPI JoystickAImpl_EnumObjects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) @@ -509,7 +515,7 @@ /****************************************************************************** * GetProperty : get input device properties */ -static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPDIPROPHEADER pdiph) { @@ -554,7 +560,7 @@ return DI_OK; } -static ICOM_VTABLE(IDirectInputDevice2A) JoystickAvt = +static ICOM_VTABLE(IDirectInputDevice8A) JoystickAvt = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirectInputDevice2AImpl_QueryInterface, @@ -584,48 +590,11 @@ IDirectInputDevice2AImpl_Escape, JoystickAImpl_Poll, IDirectInputDevice2AImpl_SendDeviceData, -}; - -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(Joystick7Avt.fun)) -#else -# define XCAST(fun) (void*) -#endif - -static ICOM_VTABLE(IDirectInputDevice7A) Joystick7Avt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)IDirectInputDevice2AImpl_QueryInterface, - XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, - XCAST(Release)JoystickAImpl_Release, - XCAST(GetCapabilities)JoystickAImpl_GetCapabilities, - XCAST(EnumObjects)JoystickAImpl_EnumObjects, - XCAST(GetProperty)JoystickAImpl_GetProperty, - XCAST(SetProperty)JoystickAImpl_SetProperty, - XCAST(Acquire)JoystickAImpl_Acquire, - XCAST(Unacquire)JoystickAImpl_Unacquire, - XCAST(GetDeviceState)JoystickAImpl_GetDeviceState, - XCAST(GetDeviceData)JoystickAImpl_GetDeviceData, - XCAST(SetDataFormat)JoystickAImpl_SetDataFormat, - XCAST(SetEventNotification)JoystickAImpl_SetEventNotification, - XCAST(SetCooperativeLevel)IDirectInputDevice2AImpl_SetCooperativeLevel, - XCAST(GetObjectInfo)IDirectInputDevice2AImpl_GetObjectInfo, - XCAST(GetDeviceInfo)IDirectInputDevice2AImpl_GetDeviceInfo, - XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, - XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, - XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, - XCAST(EnumEffects)IDirectInputDevice2AImpl_EnumEffects, - XCAST(GetEffectInfo)IDirectInputDevice2AImpl_GetEffectInfo, - XCAST(GetForceFeedbackState)IDirectInputDevice2AImpl_GetForceFeedbackState, - XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbackCommand, - XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects, - XCAST(Escape)IDirectInputDevice2AImpl_Escape, - XCAST(Poll)JoystickAImpl_Poll, - XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, - IDirectInputDevice7AImpl_WriteEffectToFile + IDirectInputDevice7AImpl_WriteEffectToFile, + IDirectInputDevice8AImpl_BuildActionMap, + IDirectInputDevice8AImpl_SetActionMap, + IDirectInputDevice8AImpl_GetImageInfo }; - -#undef XCAST #endif /* HAVE_LINUX_22_JOYSTICK_API */ Index: dlls/dinput/joystick/linuxinput.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/joystick/linuxinput.c,v retrieving revision 1.10 diff -u -r1.10 linuxinput.c --- dlls/dinput/joystick/linuxinput.c 2 Jun 2002 21:18:48 -0000 1.10 +++ dlls/dinput/joystick/linuxinput.c 10 Jun 2002 19:41:09 -0000 @@ -2,6 +2,7 @@ * * Copyright 1998,2000 Marcus Meissner * Copyright 1998,1999 Lionel Ulmer + * Copyright 2000-2001 TransGaming Technologies Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -62,12 +63,10 @@ #define WINE_JOYSTICK_BUTTON_BASE 8 typedef struct JoystickAImpl JoystickAImpl; -static ICOM_VTABLE(IDirectInputDevice2A) JoystickAvt; -static ICOM_VTABLE(IDirectInputDevice7A) Joystick7Avt; +static ICOM_VTABLE(IDirectInputDevice8A) JoystickAvt; struct JoystickAImpl { - /* IDirectInputDevice2AImpl */ - ICOM_VFIELD(IDirectInputDevice2A); + LPVOID lpVtbl; DWORD ref; GUID guid; @@ -125,6 +124,9 @@ if ((dwDevType != 0) && (GET_DIDEVICE_TYPE(dwDevType) != DIDEVTYPE_JOYSTICK)) return FALSE; + if (dwFlags & DIEDFL_FORCEFEEDBACK) + return FALSE; + for (i=0;i<64;i++) { char buf[200]; BYTE absbits[(ABS_MAX+7)/8],keybits[(KEY_MAX+7)/8]; @@ -161,12 +163,13 @@ if (!havejoy) return FALSE; - TRACE("Enumerating the Joystick device\n"); + TRACE("Enumerating the linuxinput Joystick device\n"); /* Return joystick */ lpddi->guidInstance = GUID_Joystick; lpddi->guidProduct = DInput_Wine_Joystick_GUID; + lpddi->guidFFDriver = GUID_NULL; lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL<<8); @@ -176,17 +179,16 @@ return TRUE; } -static JoystickAImpl *alloc_device(REFGUID rguid, ICOM_VTABLE(IDirectInputDevice2A) *jvt, IDirectInputAImpl *dinput) +static JoystickAImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputAImpl *dinput) { JoystickAImpl* newDevice; int i; newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickAImpl)); - newDevice->ref = 1; - ICOM_VTBL(newDevice) = jvt; - - newDevice->joyfd = -1; - newDevice->dinput = dinput; + newDevice->lpVtbl = jvt; + newDevice->ref = 1; + newDevice->joyfd = -1; + newDevice->dinput = dinput; memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); for (i=0;i<ABS_MAX;i++) { newDevice->wantmin[i] = -32768; @@ -238,16 +240,14 @@ if ((IsEqualGUID(&GUID_Joystick,rguid)) || (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) { - if ((riid == NULL) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid))) { + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceA,riid) || + IsEqualGUID(&IID_IDirectInputDevice2A,riid) || + IsEqualGUID(&IID_IDirectInputDevice7A,riid) || + IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { *pdev=(IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput); - TRACE("Creating a Joystick device (%p)\n", *pdev); return DI_OK; - } else if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) { - *pdev=(IDirectInputDeviceA*) alloc_device(rguid, (ICOM_VTABLE(IDirectInputDevice2A) *) &Joystick7Avt, dinput); - - TRACE("Creating a Joystick DInput7A device (%p)\n", *pdev); - return DI_OK; } else return DIERR_NOINTERFACE; } @@ -266,7 +266,7 @@ /****************************************************************************** * Joystick */ -static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE2A iface) +static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickAImpl,iface); @@ -290,7 +290,7 @@ * the device driver sends back with GetDeviceState. */ static HRESULT WINAPI JoystickAImpl_SetDataFormat( - LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df + LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) { ICOM_THIS(JoystickAImpl,iface); @@ -323,7 +323,7 @@ /****************************************************************************** * Acquire : gets exclusive control of the joystick */ -static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { int i; ICOM_THIS(JoystickAImpl,iface); @@ -380,7 +380,7 @@ /****************************************************************************** * Unacquire : frees the joystick */ -static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickAImpl,iface); @@ -508,7 +508,7 @@ * */ static HRESULT WINAPI JoystickAImpl_GetDeviceState( - LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr + LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { ICOM_THIS(JoystickAImpl,iface); @@ -527,7 +527,7 @@ /****************************************************************************** * GetDeviceData : gets buffered input data. */ -static HRESULT WINAPI JoystickAImpl_GetDeviceData(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI JoystickAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, @@ -550,7 +550,7 @@ /****************************************************************************** * SetProperty : change input device properties */ -static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPCDIPROPHEADER ph) { @@ -605,7 +605,7 @@ * SetEventNotification : specifies event to be sent on state change */ static HRESULT WINAPI JoystickAImpl_SetEventNotification( - LPDIRECTINPUTDEVICE2A iface, HANDLE hnd + LPDIRECTINPUTDEVICE8A iface, HANDLE hnd ) { ICOM_THIS(JoystickAImpl,iface); @@ -615,7 +615,7 @@ } static HRESULT WINAPI JoystickAImpl_GetCapabilities( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { ICOM_THIS(JoystickAImpl,iface); @@ -647,7 +647,7 @@ return DI_OK; } -static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE2A iface) { +static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(JoystickAImpl,iface); TRACE("(),stub!\n"); @@ -659,7 +659,7 @@ * EnumObjects : enumerate the different buttons and axis... */ static HRESULT WINAPI JoystickAImpl_EnumObjects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) @@ -823,7 +823,7 @@ /****************************************************************************** * GetProperty : get input device properties */ -static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPDIPROPHEADER pdiph) { @@ -866,7 +866,7 @@ return DI_OK; } -static ICOM_VTABLE(IDirectInputDevice2A) JoystickAvt = +static ICOM_VTABLE(IDirectInputDevice8A) JoystickAvt = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirectInputDevice2AImpl_QueryInterface, @@ -896,49 +896,12 @@ IDirectInputDevice2AImpl_Escape, JoystickAImpl_Poll, IDirectInputDevice2AImpl_SendDeviceData, -}; - -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(Joystick7Avt.fun)) -#else -# define XCAST(fun) (void*) -#endif - -static ICOM_VTABLE(IDirectInputDevice7A) Joystick7Avt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)IDirectInputDevice2AImpl_QueryInterface, - XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, - XCAST(Release)JoystickAImpl_Release, - XCAST(GetCapabilities)JoystickAImpl_GetCapabilities, - XCAST(EnumObjects)JoystickAImpl_EnumObjects, - XCAST(GetProperty)JoystickAImpl_GetProperty, - XCAST(SetProperty)JoystickAImpl_SetProperty, - XCAST(Acquire)JoystickAImpl_Acquire, - XCAST(Unacquire)JoystickAImpl_Unacquire, - XCAST(GetDeviceState)JoystickAImpl_GetDeviceState, - XCAST(GetDeviceData)JoystickAImpl_GetDeviceData, - XCAST(SetDataFormat)JoystickAImpl_SetDataFormat, - XCAST(SetEventNotification)JoystickAImpl_SetEventNotification, - XCAST(SetCooperativeLevel)IDirectInputDevice2AImpl_SetCooperativeLevel, - XCAST(GetObjectInfo)IDirectInputDevice2AImpl_GetObjectInfo, - XCAST(GetDeviceInfo)IDirectInputDevice2AImpl_GetDeviceInfo, - XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, - XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, - XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, - XCAST(EnumEffects)IDirectInputDevice2AImpl_EnumEffects, - XCAST(GetEffectInfo)IDirectInputDevice2AImpl_GetEffectInfo, - XCAST(GetForceFeedbackState)IDirectInputDevice2AImpl_GetForceFeedbackState, - XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbackCommand, - XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects, - XCAST(Escape)IDirectInputDevice2AImpl_Escape, - XCAST(Poll)JoystickAImpl_Poll, - XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData, IDirectInputDevice7AImpl_EnumEffectsInFile, - IDirectInputDevice7AImpl_WriteEffectToFile + IDirectInputDevice7AImpl_WriteEffectToFile, + IDirectInputDevice8AImpl_BuildActionMap, + IDirectInputDevice8AImpl_SetActionMap, + IDirectInputDevice8AImpl_GetImageInfo }; - -#undef XCAST #endif /* HAVE_LINUX_INPUT_H */ Index: dlls/dinput/keyboard/main.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/keyboard/main.c,v retrieving revision 1.14 diff -u -r1.14 main.c --- dlls/dinput/keyboard/main.c 2 Jun 2002 21:18:48 -0000 1.14 +++ dlls/dinput/keyboard/main.c 10 Jun 2002 19:41:09 -0000 @@ -2,6 +2,7 @@ * * Copyright 1998 Marcus Meissner * Copyright 1998,1999 Lionel Ulmer + * Copyright 2000-2001 TransGaming Technologies Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -35,14 +36,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput); -static ICOM_VTABLE(IDirectInputDevice2A) SysKeyboardAvt; -static ICOM_VTABLE(IDirectInputDevice7A) SysKeyboard7Avt; +static ICOM_VTABLE(IDirectInputDevice8A) SysKeyboardAvt; typedef struct SysKeyboardAImpl SysKeyboardAImpl; struct SysKeyboardAImpl { - /* IDirectInputDevice2AImpl */ - ICOM_VFIELD(IDirectInputDevice2A); + LPVOID lpVtbl; DWORD ref; GUID guid; @@ -151,12 +150,12 @@ return FALSE; } -static SysKeyboardAImpl *alloc_device(REFGUID rguid, ICOM_VTABLE(IDirectInputDevice2A) *kvt, IDirectInputAImpl *dinput) +static SysKeyboardAImpl *alloc_device(REFGUID rguid, LPVOID kvt, IDirectInputAImpl *dinput) { SysKeyboardAImpl* newDevice; newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardAImpl)); + newDevice->lpVtbl = kvt; newDevice->ref = 1; - ICOM_VTBL(newDevice) = kvt; memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); newDevice->dinput = dinput; @@ -168,16 +167,14 @@ { if ((IsEqualGUID(&GUID_SysKeyboard,rguid)) || /* Generic Keyboard */ (IsEqualGUID(&DInput_Wine_Keyboard_GUID,rguid))) { /* Wine Keyboard */ - if ((riid == NULL) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid))) { + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceA,riid) || + IsEqualGUID(&IID_IDirectInputDevice2A,riid) || + IsEqualGUID(&IID_IDirectInputDevice7A,riid) || + IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { *pdev=(IDirectInputDeviceA*) alloc_device(rguid, &SysKeyboardAvt, dinput); - TRACE("Creating a Keyboard device (%p)\n", *pdev); return DI_OK; - } else if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) { - *pdev=(IDirectInputDeviceA*) alloc_device(rguid, (ICOM_VTABLE(IDirectInputDevice2A) *) &SysKeyboard7Avt, dinput); - - TRACE("Creating a Keyboard DInput7A device (%p)\n", *pdev); - return DI_OK; } else return DIERR_NOINTERFACE; } @@ -194,7 +191,7 @@ DECL_GLOBAL_CONSTRUCTOR(keyboarddev_register) { dinput_register_device(&keyboarddev); } static HRESULT WINAPI SysKeyboardAImpl_SetProperty( - LPDIRECTINPUTDEVICE2A iface,REFGUID rguid,LPCDIPROPHEADER ph + LPDIRECTINPUTDEVICE8A iface,REFGUID rguid,LPCDIPROPHEADER ph ) { ICOM_THIS(SysKeyboardAImpl,iface); @@ -225,7 +222,7 @@ } static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState( - LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr + LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { /* Note: device does not need to be acquired */ @@ -237,7 +234,7 @@ } static HRESULT WINAPI SysKeyboardAImpl_GetDeviceData( - LPDIRECTINPUTDEVICE2A iface,DWORD dodsize,LPDIDEVICEOBJECTDATA dod, + LPDIRECTINPUTDEVICE8A iface,DWORD dodsize,LPDIDEVICEOBJECTDATA dod, LPDWORD entries,DWORD flags ) { @@ -289,9 +286,9 @@ return ret; } -static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE2A iface); +static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface); -static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(SysKeyboardAImpl,iface); @@ -325,7 +322,7 @@ return DI_OK; } -static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(SysKeyboardAImpl,iface); TRACE("(this=%p)\n",This); @@ -350,8 +347,8 @@ return DI_OK; } -static HRESULT WINAPI SysKeyboardAImpl_SetEventNotification(LPDIRECTINPUTDEVICE2A iface, - HANDLE hnd) { +static HRESULT WINAPI SysKeyboardAImpl_SetEventNotification(LPDIRECTINPUTDEVICE8A iface, + HANDLE hnd) { ICOM_THIS(SysKeyboardAImpl,iface); TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd); @@ -364,7 +361,7 @@ * GetCapabilities : get the device capablitites */ static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { ICOM_THIS(SysKeyboardAImpl,iface); @@ -390,7 +387,7 @@ return DI_OK; } -static ICOM_VTABLE(IDirectInputDevice2A) SysKeyboardAvt = +static ICOM_VTABLE(IDirectInputDevice8A) SysKeyboardAvt = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirectInputDevice2AImpl_QueryInterface, @@ -419,47 +416,10 @@ IDirectInputDevice2AImpl_EnumCreatedEffectObjects, IDirectInputDevice2AImpl_Escape, IDirectInputDevice2AImpl_Poll, - IDirectInputDevice2AImpl_SendDeviceData -}; - -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(SysKeyboard7Avt.fun)) -#else -# define XCAST(fun) (void*) -#endif - -static ICOM_VTABLE(IDirectInputDevice7A) SysKeyboard7Avt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)IDirectInputDevice2AImpl_QueryInterface, - XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, - XCAST(Release)IDirectInputDevice2AImpl_Release, - XCAST(GetCapabilities)SysKeyboardAImpl_GetCapabilities, - XCAST(EnumObjects)IDirectInputDevice2AImpl_EnumObjects, - XCAST(GetProperty)IDirectInputDevice2AImpl_GetProperty, - XCAST(SetProperty)SysKeyboardAImpl_SetProperty, - XCAST(Acquire)SysKeyboardAImpl_Acquire, - XCAST(Unacquire)SysKeyboardAImpl_Unacquire, - XCAST(GetDeviceState)SysKeyboardAImpl_GetDeviceState, - XCAST(GetDeviceData)SysKeyboardAImpl_GetDeviceData, - XCAST(SetDataFormat)IDirectInputDevice2AImpl_SetDataFormat, - XCAST(SetEventNotification)SysKeyboardAImpl_SetEventNotification, - XCAST(SetCooperativeLevel)IDirectInputDevice2AImpl_SetCooperativeLevel, - XCAST(GetObjectInfo)IDirectInputDevice2AImpl_GetObjectInfo, - XCAST(GetDeviceInfo)IDirectInputDevice2AImpl_GetDeviceInfo, - XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, - XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, - XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, - XCAST(EnumEffects)IDirectInputDevice2AImpl_EnumEffects, - XCAST(GetEffectInfo)IDirectInputDevice2AImpl_GetEffectInfo, - XCAST(GetForceFeedbackState)IDirectInputDevice2AImpl_GetForceFeedbackState, - XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbackCommand, - XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects, - XCAST(Escape)IDirectInputDevice2AImpl_Escape, - XCAST(Poll)IDirectInputDevice2AImpl_Poll, - XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData, - IDirectInputDevice7AImpl_EnumEffectsInFile, - IDirectInputDevice7AImpl_WriteEffectToFile + IDirectInputDevice2AImpl_SendDeviceData, + IDirectInputDevice7AImpl_EnumEffectsInFile, + IDirectInputDevice7AImpl_WriteEffectToFile, + IDirectInputDevice8AImpl_BuildActionMap, + IDirectInputDevice8AImpl_SetActionMap, + IDirectInputDevice8AImpl_GetImageInfo }; - -#undef XCAST Index: dlls/dinput/mouse/main.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/mouse/main.c,v retrieving revision 1.14 diff -u -r1.14 main.c --- dlls/dinput/mouse/main.c 2 Jun 2002 21:18:48 -0000 1.14 +++ dlls/dinput/mouse/main.c 10 Jun 2002 19:41:09 -0000 @@ -2,6 +2,7 @@ * * Copyright 1998 Marcus Meissner * Copyright 1998,1999 Lionel Ulmer + * Copyright 2000-2001 TransGaming Technologies Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -41,9 +42,10 @@ /* Wine mouse driver object instances */ #define WINE_MOUSE_X_AXIS_INSTANCE 0x0001 #define WINE_MOUSE_Y_AXIS_INSTANCE 0x0002 -#define WINE_MOUSE_L_BUTTON_INSTANCE 0x0004 -#define WINE_MOUSE_R_BUTTON_INSTANCE 0x0008 -#define WINE_MOUSE_M_BUTTON_INSTANCE 0x0010 +#define WINE_MOUSE_Z_AXIS_INSTANCE 0x0004 +#define WINE_MOUSE_L_BUTTON_INSTANCE 0x0008 +#define WINE_MOUSE_R_BUTTON_INSTANCE 0x0010 +#define WINE_MOUSE_M_BUTTON_INSTANCE 0x0020 /* ------------------------------- */ /* Wine mouse internal data format */ @@ -52,23 +54,27 @@ /* Constants used to access the offset array */ #define WINE_MOUSE_X_POSITION 0 #define WINE_MOUSE_Y_POSITION 1 -#define WINE_MOUSE_L_POSITION 2 -#define WINE_MOUSE_R_POSITION 3 -#define WINE_MOUSE_M_POSITION 4 +#define WINE_MOUSE_Z_POSITION 2 +#define WINE_MOUSE_L_POSITION 3 +#define WINE_MOUSE_R_POSITION 4 +#define WINE_MOUSE_M_POSITION 5 typedef struct { LONG lX; LONG lY; + LONG lZ; BYTE rgbButtons[4]; } Wine_InternalMouseData; -#define WINE_INTERNALMOUSE_NUM_OBJS 5 +#define WINE_INTERNALMOUSE_NUM_OBJS 6 static DIOBJECTDATAFORMAT Wine_InternalMouseObjectFormat[WINE_INTERNALMOUSE_NUM_OBJS] = { { &GUID_XAxis, FIELD_OFFSET(Wine_InternalMouseData, lX), DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 }, { &GUID_YAxis, FIELD_OFFSET(Wine_InternalMouseData, lY), DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 }, + { &GUID_ZAxis, FIELD_OFFSET(Wine_InternalMouseData, lZ), + DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS, 0 }, { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 0, DIDFT_MAKEINSTANCE(WINE_MOUSE_L_BUTTON_INSTANCE) | DIDFT_PSHBUTTON, 0 }, { &GUID_Button, (FIELD_OFFSET(Wine_InternalMouseData, rgbButtons)) + 1, @@ -86,8 +92,7 @@ Wine_InternalMouseObjectFormat }; -static ICOM_VTABLE(IDirectInputDevice2A) SysMouseAvt; -static ICOM_VTABLE(IDirectInputDevice7A) SysMouse7Avt; +static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt; typedef struct SysMouseAImpl SysMouseAImpl; typedef enum { @@ -98,8 +103,7 @@ struct SysMouseAImpl { - /* IDirectInputDevice2AImpl */ - ICOM_VFIELD(IDirectInputDevice2A); + LPVOID lpVtbl; DWORD ref; GUID guid; @@ -109,7 +113,7 @@ and external data formats */ LPDIDATAFORMAT df; DataFormat *wine_df; - int offset_array[5]; + int offset_array[WINE_INTERNALMOUSE_NUM_OBJS]; /* SysMouseAImpl */ BYTE absolute; @@ -141,7 +145,7 @@ }; /* FIXME: This is ugly and not thread safe :/ */ -static IDirectInputDevice2A* current_lock = NULL; +static IDirectInputDevice8A* current_lock = NULL; static BOOL mousedev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi) @@ -162,11 +166,12 @@ return FALSE; } -static SysMouseAImpl *alloc_device(REFGUID rguid, ICOM_VTABLE(IDirectInputDevice2A) *mvt, IDirectInputAImpl *dinput) +static SysMouseAImpl *alloc_device(REFGUID rguid, LPVOID mvt, IDirectInputAImpl *dinput) { - int offset_array[5] = { + int offset_array[WINE_INTERNALMOUSE_NUM_OBJS] = { FIELD_OFFSET(Wine_InternalMouseData, lX), FIELD_OFFSET(Wine_InternalMouseData, lY), + FIELD_OFFSET(Wine_InternalMouseData, lZ), FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 0, FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 1, FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 2 @@ -174,13 +179,13 @@ SysMouseAImpl* newDevice; newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseAImpl)); newDevice->ref = 1; - ICOM_VTBL(newDevice) = mvt; + newDevice->lpVtbl = mvt; InitializeCriticalSection(&(newDevice->crit)); memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); /* Per default, Wine uses its internal data format */ newDevice->df = &Wine_InternalMouseFormat; - memcpy(newDevice->offset_array, offset_array, 5 * sizeof(int)); + memcpy(newDevice->offset_array, offset_array, WINE_INTERNALMOUSE_NUM_OBJS * sizeof(int)); newDevice->wine_df = (DataFormat *) HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat)); newDevice->wine_df->size = 0; newDevice->wine_df->internal_format_size = Wine_InternalMouseFormat.dwDataSize; @@ -194,16 +199,14 @@ { if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */ (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */ - if ((riid == NULL) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) || (IsEqualGUID(&IID_IDirectInputDevice2A,riid))) { + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceA,riid) || + IsEqualGUID(&IID_IDirectInputDevice2A,riid) || + IsEqualGUID(&IID_IDirectInputDevice7A,riid) || + IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { *pdev=(IDirectInputDeviceA*) alloc_device(rguid, &SysMouseAvt, dinput); - TRACE("Creating a Mouse device (%p)\n", *pdev); return DI_OK; - }else if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) { - *pdev=(IDirectInputDeviceA*) alloc_device(rguid, (ICOM_VTABLE(IDirectInputDevice2A) *) &SysMouse7Avt, dinput); - - TRACE("Creating a Mouse DInput7A device (%p)\n", *pdev); - return DI_OK; } else return DIERR_NOINTERFACE; } @@ -226,7 +229,7 @@ /****************************************************************************** * Release : release the mouse buffer. */ -static ULONG WINAPI SysMouseAImpl_Release(LPDIRECTINPUTDEVICE2A iface) +static ULONG WINAPI SysMouseAImpl_Release(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(SysMouseAImpl,iface); @@ -238,7 +241,11 @@ if (This->data_queue != NULL) HeapFree(GetProcessHeap(),0,This->data_queue); - if (This->hook) UnhookWindowsHookEx( This->hook ); + if (This->hook) { + UnhookWindowsHookEx( This->hook ); + if (This->dwCoopLevel & DISCL_EXCLUSIVE) + ShowCursor(TRUE); /* show cursor */ + } DeleteCriticalSection(&(This->crit)); /* Free the DataFormat */ @@ -257,7 +264,7 @@ * grabbing. */ static HRESULT WINAPI SysMouseAImpl_SetCooperativeLevel( - LPDIRECTINPUTDEVICE2A iface,HWND hwnd,DWORD dwflags + LPDIRECTINPUTDEVICE8A iface,HWND hwnd,DWORD dwflags ) { ICOM_THIS(SysMouseAImpl,iface); @@ -285,7 +292,7 @@ * in absolute and relative mode. */ static HRESULT WINAPI SysMouseAImpl_SetDataFormat( - LPDIRECTINPUTDEVICE2A iface,LPCDIDATAFORMAT df + LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) { ICOM_THIS(SysMouseAImpl,iface); @@ -333,10 +340,25 @@ LRESULT ret; MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)lparam; SysMouseAImpl* This = (SysMouseAImpl*) current_lock; + DWORD dwCoop; + static long last_event = 0; + int wdata; if (code != HC_ACTION) return CallNextHookEx( This->hook, code, wparam, lparam ); EnterCriticalSection(&(This->crit)); + dwCoop = This->dwCoopLevel; + + /* Only allow mouse events every 10 ms. + * This is to allow the cursor to start acceleration before + * the warps happen. But if it involves a mouse button event we + * allow it since we dont want to loose the clicks. + */ + if (((GetCurrentTime() - last_event) < 10) + && wparam == WM_MOUSEMOVE) + goto end; + else last_event = GetCurrentTime(); + /* Mouse moved -> send event if asked */ if (This->hEvent) SetEvent(This->hEvent); @@ -425,6 +447,12 @@ hook->time, This->dinput->evsequence++); This->m_state.rgbButtons[2] = 0x00; break; + case WM_MOUSEWHEEL: + wdata = (short)HIWORD(hook->mouseData); + GEN_EVENT(This->offset_array[WINE_MOUSE_Z_POSITION], wdata, + hook->time, This->dinput->evsequence++); + This->m_state.lZ += wdata; + break; } TRACE("(X: %ld - Y: %ld L: %02x M: %02x R: %02x)\n", @@ -432,20 +460,40 @@ This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]); end: - if (This->dwCoopLevel & DISCL_NONEXCLUSIVE) + LeaveCriticalSection(&(This->crit)); + + if (dwCoop & DISCL_NONEXCLUSIVE) { /* pass the events down to previous handlers (e.g. win32 input) */ ret = CallNextHookEx( This->hook, code, wparam, lparam ); } else ret = 1; /* ignore message */ - LeaveCriticalSection(&(This->crit)); return ret; } +static void dinput_window_check(SysMouseAImpl* This) +{ + RECT rect; + DWORD centerX, centerY; + + /* make sure the window hasn't moved */ + GetWindowRect(This->win, &rect); + centerX = (rect.right - rect.left) / 2; + centerY = (rect.bottom - rect.top ) / 2; + if (This->win_centerX != centerX || This->win_centerY != centerY) { + This->win_centerX = centerX; + This->win_centerY = centerY; + } + This->mapped_center.x = This->win_centerX; + This->mapped_center.y = This->win_centerY; + MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1); +} + + /****************************************************************************** * Acquire : gets exclusive control of the mouse */ -static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(SysMouseAImpl,iface); RECT rect; @@ -456,7 +504,7 @@ POINT point; /* Store (in a global variable) the current lock */ - current_lock = (IDirectInputDevice2A*)This; + current_lock = (IDirectInputDevice8A*)This; /* Init the mouse state */ if (This->absolute) { @@ -469,11 +517,14 @@ This->m_state.lX = 0; This->m_state.lY = 0; } + This->m_state.lZ = 0; This->m_state.rgbButtons[0] = (GetKeyState(VK_LBUTTON) ? 0xFF : 0x00); This->m_state.rgbButtons[1] = (GetKeyState(VK_MBUTTON) ? 0xFF : 0x00); This->m_state.rgbButtons[2] = (GetKeyState(VK_RBUTTON) ? 0xFF : 0x00); /* Install our mouse hook */ + if (This->dwCoopLevel & DISCL_EXCLUSIVE) + ShowCursor(FALSE); /* hide cursor */ This->hook = SetWindowsHookExW( WH_MOUSE_LL, dinput_mouse_hook, 0, 0 ); /* Get the window dimension and find the center */ @@ -496,14 +547,15 @@ } This->acquired = 1; + return DI_OK; } - return DI_OK; + return S_FALSE; } /****************************************************************************** * Unacquire : frees the mouse */ -static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE2A iface) +static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { ICOM_THIS(SysMouseAImpl,iface); @@ -512,8 +564,12 @@ if (This->acquired) { /* Reinstall previous mouse event handler */ - if (This->hook) UnhookWindowsHookEx( This->hook ); - This->hook = 0; + if (This->hook) { + UnhookWindowsHookEx( This->hook ); + This->hook = 0; + if (This->dwCoopLevel & DISCL_EXCLUSIVE) + ShowCursor(TRUE); /* show cursor */ + } /* No more locks */ current_lock = NULL; @@ -534,7 +590,7 @@ * supported. */ static HRESULT WINAPI SysMouseAImpl_GetDeviceState( - LPDIRECTINPUTDEVICE2A iface,DWORD len,LPVOID ptr + LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { ICOM_THIS(SysMouseAImpl,iface); @@ -548,13 +604,12 @@ if (This->absolute == 0) { This->m_state.lX = 0; This->m_state.lY = 0; + This->m_state.lZ = 0; } /* Check if we need to do a mouse warping */ if (This->need_warp == WARP_NEEDED) { - This->mapped_center.x = This->win_centerX; - This->mapped_center.y = This->win_centerY; - MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1); + dinput_window_check(This); TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y); SetCursorPos( This->mapped_center.x, This->mapped_center.y ); @@ -577,7 +632,7 @@ /****************************************************************************** * GetDeviceState : gets buffered input data. */ -static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface, DWORD dodsize, LPDIDEVICEOBJECTDATA dod, LPDWORD entries, @@ -594,11 +649,14 @@ if (len > *entries) len = *entries; if (dod == NULL) { + if (len) + TRACE("Application discarding %ld event(s).\n", len); + *entries = len; nqtail = This->queue_tail + len; while (nqtail >= This->queue_len) nqtail -= This->queue_len; } else { - if (dodsize != sizeof(DIDEVICEOBJECTDATA)) { + if (dodsize < sizeof(DIDEVICEOBJECTDATA)) { ERR("Wrong structure size !\n"); LeaveCriticalSection(&(This->crit)); return DIERR_INVALIDPARAM; @@ -629,9 +687,7 @@ /* Check if we need to do a mouse warping */ if (This->need_warp == WARP_NEEDED) { - This->mapped_center.x = This->win_centerX; - This->mapped_center.y = This->win_centerY; - MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1); + dinput_window_check(This); TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y); SetCursorPos( This->mapped_center.x, This->mapped_center.y ); @@ -647,7 +703,7 @@ /****************************************************************************** * SetProperty : change input device properties */ -static HRESULT WINAPI SysMouseAImpl_SetProperty(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI SysMouseAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPCDIPROPHEADER ph) { @@ -687,7 +743,7 @@ /****************************************************************************** * GetProperty : get input device properties */ -static HRESULT WINAPI SysMouseAImpl_GetProperty(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI SysMouseAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPDIPROPHEADER pdiph) { @@ -709,6 +765,15 @@ break; } + case (DWORD) DIPROP_GRANULARITY: { + LPDIPROPDWORD pr = (LPDIPROPDWORD) pdiph; + + /* We'll just assume that the app asks about the Z axis */ + pr->dwData = WHEEL_DELTA; + + break; + } + case (DWORD) DIPROP_RANGE: { LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph; @@ -740,7 +805,7 @@ /****************************************************************************** * SetEventNotification : specifies event to be sent on state change */ -static HRESULT WINAPI SysMouseAImpl_SetEventNotification(LPDIRECTINPUTDEVICE2A iface, +static HRESULT WINAPI SysMouseAImpl_SetEventNotification(LPDIRECTINPUTDEVICE8A iface, HANDLE hnd) { ICOM_THIS(SysMouseAImpl,iface); @@ -755,7 +820,7 @@ * GetCapabilities : get the device capablitites */ static HRESULT WINAPI SysMouseAImpl_GetCapabilities( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { ICOM_THIS(SysMouseAImpl,iface); @@ -765,7 +830,7 @@ if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) { lpDIDevCaps->dwFlags = DIDC_ATTACHED; lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE; - lpDIDevCaps->dwAxes = 2; + lpDIDevCaps->dwAxes = 3; lpDIDevCaps->dwButtons = 3; lpDIDevCaps->dwPOVs = 0; lpDIDevCaps->dwFFSamplePeriod = 0; @@ -786,7 +851,7 @@ * EnumObjects : enumerate the different buttons and axis... */ static HRESULT WINAPI SysMouseAImpl_EnumObjects( - LPDIRECTINPUTDEVICE2A iface, + LPDIRECTINPUTDEVICE8A iface, LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) @@ -822,6 +887,14 @@ strcpy(ddoi.tszName, "Y-Axis"); _dump_OBJECTINSTANCEA(&ddoi); if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK; + + /* Z axis */ + ddoi.guidType = GUID_ZAxis; + ddoi.dwOfs = This->offset_array[WINE_MOUSE_Z_POSITION]; + ddoi.dwType = DIDFT_MAKEINSTANCE(WINE_MOUSE_Z_AXIS_INSTANCE) | DIDFT_RELAXIS; + strcpy(ddoi.tszName, "Z-Axis"); + _dump_OBJECTINSTANCEA(&ddoi); + if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) return DI_OK; } if ((dwFlags == DIDFT_ALL) || @@ -854,7 +927,7 @@ } -static ICOM_VTABLE(IDirectInputDevice2A) SysMouseAvt = +static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirectInputDevice2AImpl_QueryInterface, @@ -884,46 +957,9 @@ IDirectInputDevice2AImpl_Escape, IDirectInputDevice2AImpl_Poll, IDirectInputDevice2AImpl_SendDeviceData, + IDirectInputDevice7AImpl_EnumEffectsInFile, + IDirectInputDevice7AImpl_WriteEffectToFile, + IDirectInputDevice8AImpl_BuildActionMap, + IDirectInputDevice8AImpl_SetActionMap, + IDirectInputDevice8AImpl_GetImageInfo }; - -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(SysMouse7Avt.fun)) -#else -# define XCAST(fun) (void*) -#endif - -static ICOM_VTABLE(IDirectInputDevice7A) SysMouse7Avt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)IDirectInputDevice2AImpl_QueryInterface, - XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, - XCAST(Release)SysMouseAImpl_Release, - XCAST(GetCapabilities)SysMouseAImpl_GetCapabilities, - XCAST(EnumObjects)SysMouseAImpl_EnumObjects, - XCAST(GetProperty)SysMouseAImpl_GetProperty, - XCAST(SetProperty)SysMouseAImpl_SetProperty, - XCAST(Acquire)SysMouseAImpl_Acquire, - XCAST(Unacquire)SysMouseAImpl_Unacquire, - XCAST(GetDeviceState)SysMouseAImpl_GetDeviceState, - XCAST(GetDeviceData)SysMouseAImpl_GetDeviceData, - XCAST(SetDataFormat)SysMouseAImpl_SetDataFormat, - XCAST(SetEventNotification)SysMouseAImpl_SetEventNotification, - XCAST(SetCooperativeLevel)SysMouseAImpl_SetCooperativeLevel, - XCAST(GetObjectInfo)IDirectInputDevice2AImpl_GetObjectInfo, - XCAST(GetDeviceInfo)IDirectInputDevice2AImpl_GetDeviceInfo, - XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, - XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, - XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, - XCAST(EnumEffects)IDirectInputDevice2AImpl_EnumEffects, - XCAST(GetEffectInfo)IDirectInputDevice2AImpl_GetEffectInfo, - XCAST(GetForceFeedbackState)IDirectInputDevice2AImpl_GetForceFeedbackState, - XCAST(SendForceFeedbackCommand)IDirectInputDevice2AImpl_SendForceFeedbackCommand, - XCAST(EnumCreatedEffectObjects)IDirectInputDevice2AImpl_EnumCreatedEffectObjects, - XCAST(Escape)IDirectInputDevice2AImpl_Escape, - XCAST(Poll)IDirectInputDevice2AImpl_Poll, - XCAST(SendDeviceData)IDirectInputDevice2AImpl_SendDeviceData, - IDirectInputDevice7AImpl_EnumEffectsInFile, - IDirectInputDevice7AImpl_WriteEffectToFile -}; - -#undef XCAST Index: include/d3dtypes.h =================================================================== RCS file: /home/wine/wine/include/d3dtypes.h,v retrieving revision 1.8 diff -u -r1.8 d3dtypes.h --- include/d3dtypes.h 31 May 2002 23:06:48 -0000 1.8 +++ include/d3dtypes.h 10 Jun 2002 19:41:12 -0000 @@ -77,7 +77,10 @@ typedef HRESULT (CALLBACK *LPD3DENUMTEXTUREFORMATSCALLBACK)(LPDDSURFACEDESC lpDdsd, LPVOID lpContext); typedef HRESULT (CALLBACK *LPD3DENUMPIXELFORMATSCALLBACK)(LPDDPIXELFORMAT lpDDPixFmt, LPVOID lpContext); +#ifndef D3DCOLOR_DEFINED typedef DWORD D3DCOLOR, *LPD3DCOLOR; +#define D3DCOLOR_DEFINED +#endif typedef DWORD D3DMATERIALHANDLE, *LPD3DMATERIALHANDLE; typedef DWORD D3DTEXTUREHANDLE, *LPD3DTEXTUREHANDLE; Index: include/dinput.h =================================================================== RCS file: /home/wine/wine/include/dinput.h,v retrieving revision 1.29 diff -u -r1.29 dinput.h --- include/dinput.h 2 Jun 2002 21:18:48 -0000 1.29 +++ include/dinput.h 10 Jun 2002 19:41:12 -0000 @@ -22,12 +22,17 @@ #include "windef.h" /* for MAX_PATH */ #include "unknwn.h" -#define DIRECTINPUT_VERSION 0x0500 +#ifndef DIRECTINPUT_VERSION +#define DIRECTINPUT_VERSION 0x0800 +#endif /* Classes */ DEFINE_GUID(CLSID_DirectInput, 0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); DEFINE_GUID(CLSID_DirectInputDevice, 0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(CLSID_DirectInput8, 0x25E609E4,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); +DEFINE_GUID(CLSID_DirectInputDevice8, 0x25E609E5,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); + /* Interfaces */ DEFINE_GUID(IID_IDirectInputA, 0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); DEFINE_GUID(IID_IDirectInputW, 0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); @@ -35,12 +40,16 @@ DEFINE_GUID(IID_IDirectInput2W, 0x5944E663,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); DEFINE_GUID(IID_IDirectInput7A, 0x9A4CB684,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); DEFINE_GUID(IID_IDirectInput7W, 0x9A4CB685,0x236D,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInput8A, 0xBF798030,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00); +DEFINE_GUID(IID_IDirectInput8W, 0xBF798031,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00); DEFINE_GUID(IID_IDirectInputDeviceA, 0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); DEFINE_GUID(IID_IDirectInputDeviceW, 0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); DEFINE_GUID(IID_IDirectInputDevice2A, 0x5944E682,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); DEFINE_GUID(IID_IDirectInputDevice2W, 0x5944E683,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00); DEFINE_GUID(IID_IDirectInputDevice7A, 0x57D7C6BC,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); DEFINE_GUID(IID_IDirectInputDevice7W, 0x57D7C6BD,0x2356,0x11D3,0x8E,0x9D,0x00,0xC0,0x4F,0x68,0x44,0xAE); +DEFINE_GUID(IID_IDirectInputDevice8A, 0x54D41080,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79); +DEFINE_GUID(IID_IDirectInputDevice8W, 0x54D41081,0xDC15,0x4833,0xA4,0x1B,0x74,0x8F,0x73,0xA3,0x81,0x79); DEFINE_GUID(IID_IDirectInputEffect, 0xE7E1F7C0,0x88D2,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); /* Predefined object types */ @@ -76,23 +85,39 @@ DEFINE_GUID(GUID_CustomForce, 0x13541C2B,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35); typedef struct IDirectInputA IDirectInputA,*LPDIRECTINPUTA; +typedef struct IDirectInputW IDirectInputW,*LPDIRECTINPUTW; typedef struct IDirectInput2A IDirectInput2A,*LPDIRECTINPUT2A; +typedef struct IDirectInput2W IDirectInput2W,*LPDIRECTINPUT2W; typedef struct IDirectInput7A IDirectInput7A,*LPDIRECTINPUT7A; +typedef struct IDirectInput7W IDirectInput7W,*LPDIRECTINPUT7W; +typedef struct IDirectInput8A IDirectInput8A,*LPDIRECTINPUT8A; +typedef struct IDirectInput8W IDirectInput8W,*LPDIRECTINPUT8W; typedef struct IDirectInputDeviceA IDirectInputDeviceA,*LPDIRECTINPUTDEVICEA; +typedef struct IDirectInputDeviceW IDirectInputDeviceW,*LPDIRECTINPUTDEVICEW; typedef struct IDirectInputDevice2A IDirectInputDevice2A,*LPDIRECTINPUTDEVICE2A; +typedef struct IDirectInputDevice2W IDirectInputDevice2W,*LPDIRECTINPUTDEVICE2W; typedef struct IDirectInputDevice7A IDirectInputDevice7A,*LPDIRECTINPUTDEVICE7A; +typedef struct IDirectInputDevice7W IDirectInputDevice7W,*LPDIRECTINPUTDEVICE7W; +typedef struct IDirectInputDevice8A IDirectInputDevice8A,*LPDIRECTINPUTDEVICE8A; +typedef struct IDirectInputDevice8W IDirectInputDevice8W,*LPDIRECTINPUTDEVICE8W; typedef struct IDirectInputEffect IDirectInputEffect,*LPDIRECTINPUTEFFECT; typedef struct SysKeyboardA SysKeyboardA,*LPSYSKEYBOARDA; typedef struct SysMouseA SysMouseA,*LPSYSMOUSEA; #define IID_IDirectInput WINELIB_NAME_AW(IID_IDirectInput) DECL_WINELIB_TYPE_AW(LPDIRECTINPUT) +#define IID_IDirectInput2 WINELIB_NAME_AW(IID_IDirectInput2) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUT2) #define IID_IDirectInput7 WINELIB_NAME_AW(IID_IDirectInput7) DECL_WINELIB_TYPE_AW(LPDIRECTINPUT7) #define IID_IDirectInputDevice WINELIB_NAME_AW(IID_IDirectInputDevice) DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE) #define IID_IDirectInputDevice2 WINELIB_NAME_AW(IID_IDirectInputDevice2) DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE2) +#define IID_IDirectInputDevice7 WINELIB_NAME_AW(IID_IDirectInputDevice7) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE7) +#define IID_IDirectInputDevice8 WINELIB_NAME_AW(IID_IDirectInputDevice8) +DECL_WINELIB_TYPE_AW(LPDIRECTINPUTDEVICE8) #define DI_OK S_OK #define DI_NOTATTACHED S_FALSE @@ -158,6 +183,7 @@ #define DIEDFL_FORCEFEEDBACK 0x00000100 #define DIEDFL_INCLUDEALIASES 0x00010000 #define DIEDFL_INCLUDEPHANTOMS 0x00020000 +#define DIEDFL_INCLUDEHIDDEN 0x00040000 #define DIDEVTYPE_DEVICE 1 #define DIDEVTYPE_MOUSE 2 @@ -281,7 +307,15 @@ typedef BOOL (CALLBACK *LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW,LPVOID); DECL_WINELIB_TYPE_AW(LPDIENUMDEVICESCALLBACK) -typedef BOOL (CALLBACK *LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA, LPVOID); +#if DIRECTINPUT_VERSION >= 0x0800 +typedef BOOL (CALLBACK *LPDIENUMDEVICESBYSEMANTICSCBA)(LPCDIDEVICEINSTANCEA,LPDIRECTINPUTDEVICE8A,DWORD,DWORD,LPVOID); +typedef BOOL (CALLBACK *LPDIENUMDEVICESBYSEMANTICSCBW)(LPCDIDEVICEINSTANCEW,LPDIRECTINPUTDEVICE8W,DWORD,DWORD,LPVOID); +DECL_WINELIB_TYPE_AW(LPDIENUMDEVICESBYSEMANTICSCB) +#endif + +typedef BOOL (CALLBACK *LPDICONFIGUREDEVICESCALLBACK)(LPUNKNOWN,LPVOID); + +typedef BOOL (CALLBACK *LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA,LPVOID); typedef BOOL (CALLBACK *LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW,LPVOID); DECL_WINELIB_TYPE_AW(LPDIENUMDEVICEOBJECTSCALLBACK) @@ -591,14 +625,12 @@ typedef struct DICONSTANTFORCE { LONG lMagnitude; } DICONSTANTFORCE, *LPDICONSTANTFORCE; - typedef const DICONSTANTFORCE *LPCDICONSTANTFORCE; typedef struct DIRAMPFORCE { LONG lStart; LONG lEnd; } DIRAMPFORCE, *LPDIRAMPFORCE; - typedef const DIRAMPFORCE *LPCDIRAMPFORCE; typedef struct DIPERIODIC { @@ -607,7 +639,6 @@ DWORD dwPhase; DWORD dwPeriod; } DIPERIODIC, *LPDIPERIODIC; - typedef const DIPERIODIC *LPCDIPERIODIC; typedef struct DICONDITION { @@ -618,7 +649,6 @@ DWORD dwNegativeSaturation; LONG lDeadBand; } DICONDITION, *LPDICONDITION; - typedef const DICONDITION *LPCDICONDITION; typedef struct DICUSTOMFORCE { @@ -627,7 +657,6 @@ DWORD cSamples; LPLONG rglForceData; } DICUSTOMFORCE, *LPDICUSTOMFORCE; - typedef const DICUSTOMFORCE *LPCDICUSTOMFORCE; typedef struct DIENVELOPE { @@ -637,7 +666,6 @@ DWORD dwFadeLevel; DWORD dwFadeTime; } DIENVELOPE, *LPDIENVELOPE; - typedef const DIENVELOPE *LPCDIENVELOPE; typedef struct DIEFFECT { @@ -655,7 +683,6 @@ DWORD cbTypeSpecificParams; LPVOID lpvTypeSpecificParams; } DIEFFECT, *LPDIEFFECT; - typedef const DIEFFECT *LPCDIEFFECT; typedef struct DIEFFECTINFOA { @@ -794,6 +821,229 @@ typedef const DIFILEEFFECT *LPCDIFILEEFFECT; typedef BOOL (CALLBACK *LPDIENUMEFFECTSINFILECALLBACK)(LPCDIFILEEFFECT , LPVOID); +/* DInput 8 structures and types */ +#if DIRECTINPUT_VERSION >= 0x0800 +typedef struct _DIACTIONA { + UINT_PTR uAppData; + DWORD dwSemantics; + DWORD dwFlags; + union { + LPCSTR lptszActionName; + UINT uResIdString; + } DUMMYUNIONNAME; + GUID guidInstance; + DWORD dwObjID; + DWORD dwHow; +} DIACTIONA, *LPDIACTIONA; +typedef const DIACTIONA *LPCDIACTIONA; + +typedef struct _DIACTIONW { + UINT_PTR uAppData; + DWORD dwSemantics; + DWORD dwFlags; + union { + LPCWSTR lptszActionName; + UINT uResIdString; + } DUMMYUNIONNAME; + GUID guidInstance; + DWORD dwObjID; + DWORD dwHow; +} DIACTIONW, *LPDIACTIONW; +typedef const DIACTIONW *LPCDIACTIONW; + +DECL_WINELIB_TYPE_AW(DIACTION) +DECL_WINELIB_TYPE_AW(LPDIACTION) +DECL_WINELIB_TYPE_AW(LPCDIACTION) + +#define DIA_FORCEFEEDBACK 0x00000001 +#define DIA_APPMAPPED 0x00000002 +#define DIA_APPNOMAP 0x00000004 +#define DIA_NORANGE 0x00000008 +#define DIA_APPFIXED 0x00000010 + +#define DIAH_UNMAPPED 0x00000000 +#define DIAH_USERCONFIG 0x00000001 +#define DIAH_APPREQUESTED 0x00000002 +#define DIAH_HWAPP 0x00000004 +#define DIAH_HWDEFAULT 0x00000008 +#define DIAH_DEFAULT 0x00000020 +#define DIAH_ERROR 0x80000000 + +typedef struct _DIACTIONFORMATA { + DWORD dwSize; + DWORD dwActionSize; + DWORD dwDataSize; + DWORD dwNumActions; + LPDIACTIONA rgoAction; + GUID guidActionMap; + DWORD dwGenre; + DWORD dwBufferSize; + LONG lAxisMin; + LONG lAxisMax; + HINSTANCE hInstString; + FILETIME ftTimeStamp; + DWORD dwCRC; + CHAR tszActionMap[MAX_PATH]; +} DIACTIONFORMATA, *LPDIACTIONFORMATA; +typedef const DIACTIONFORMATA *LPCDIACTIONFORMATA; + +typedef struct _DIACTIONFORMATW { + DWORD dwSize; + DWORD dwActionSize; + DWORD dwDataSize; + DWORD dwNumActions; + LPDIACTIONW rgoAction; + GUID guidActionMap; + DWORD dwGenre; + DWORD dwBufferSize; + LONG lAxisMin; + LONG lAxisMax; + HINSTANCE hInstString; + FILETIME ftTimeStamp; + DWORD dwCRC; + WCHAR tszActionMap[MAX_PATH]; +} DIACTIONFORMATW, *LPDIACTIONFORMATW; +typedef const DIACTIONFORMATW *LPCDIACTIONFORMATW; + +DECL_WINELIB_TYPE_AW(DIACTIONFORMAT) +DECL_WINELIB_TYPE_AW(LPDIACTIONFORMAT) +DECL_WINELIB_TYPE_AW(LPCDIACTIONFORMAT) + +#define DIAFTS_NEWDEVICELOW 0xFFFFFFFF +#define DIAFTS_NEWDEVICEHIGH 0xFFFFFFFF +#define DIAFTS_UNUSEDDEVICELOW 0x00000000 +#define DIAFTS_UNUSEDDEVICEHIGH 0x00000000 + +#define DIDBAM_DEFAULT 0x00000000 +#define DIDBAM_PRESERVE 0x00000001 +#define DIDBAM_INITIALIZE 0x00000002 +#define DIDBAM_HWDEFAULTS 0x00000004 + +#define DIDSAM_DEFAULT 0x00000000 +#define DIDSAM_NOUSER 0x00000001 +#define DIDSAM_FORCESAVE 0x00000002 + +#define DICD_DEFAULT 0x00000000 +#define DICD_EDIT 0x00000001 + +#ifndef D3DCOLOR_DEFINED +typedef DWORD D3DCOLOR; +#define D3DCOLOR_DEFINED +#endif + +typedef struct _DICOLORSET { + DWORD dwSize; + D3DCOLOR cTextFore; + D3DCOLOR cTextHighlight; + D3DCOLOR cCalloutLine; + D3DCOLOR cCalloutHighlight; + D3DCOLOR cBorder; + D3DCOLOR cControlFill; + D3DCOLOR cHighlightFill; + D3DCOLOR cAreaFill; +} DICOLORSET, *LPDICOLORSET; +typedef const DICOLORSET *LPCDICOLORSET; + +typedef struct _DICONFIGUREDEVICESPARAMSA { + DWORD dwSize; + DWORD dwcUsers; + LPSTR lptszUserNames; + DWORD dwcFormats; + LPDIACTIONFORMATA lprgFormats; + HWND hwnd; + DICOLORSET dics; + LPUNKNOWN lpUnkDDSTarget; +} DICONFIGUREDEVICESPARAMSA, *LPDICONFIGUREDEVICESPARAMSA; +typedef const DICONFIGUREDEVICESPARAMSA *LPCDICONFIGUREDEVICESPARAMSA; + +typedef struct _DICONFIGUREDEVICESPARAMSW { + DWORD dwSize; + DWORD dwcUsers; + LPWSTR lptszUserNames; + DWORD dwcFormats; + LPDIACTIONFORMATW lprgFormats; + HWND hwnd; + DICOLORSET dics; + LPUNKNOWN lpUnkDDSTarget; +} DICONFIGUREDEVICESPARAMSW, *LPDICONFIGUREDEVICESPARAMSW; +typedef const DICONFIGUREDEVICESPARAMSW *LPCDICONFIGUREDEVICESPARAMSW; + +DECL_WINELIB_TYPE_AW(DICONFIGUREDEVICESPARAMS) +DECL_WINELIB_TYPE_AW(LPDICONFIGUREDEVICESPARAMS) +DECL_WINELIB_TYPE_AW(LPCDICONFIGUREDEVICESPARAMS) + +#define DIDIFT_CONFIGURATION 0x00000001 +#define DIDIFT_OVERLAY 0x00000002 + +#define DIDAL_CENTERED 0x00000000 +#define DIDAL_LEFTALIGNED 0x00000001 +#define DIDAL_RIGHTALIGNED 0x00000002 +#define DIDAL_MIDDLE 0x00000000 +#define DIDAL_TOPALIGNED 0x00000004 +#define DIDAL_BOTTOMALIGNED 0x00000008 + +typedef struct _DIDEVICEIMAGEINFOA { + CHAR tszImagePath[MAX_PATH]; + DWORD dwFlags; + DWORD dwViewID; + RECT rcOverlay; + DWORD dwObjID; + DWORD dwcValidPts; + POINT rgptCalloutLine[5]; + RECT rcCalloutRect; + DWORD dwTextAlign; +} DIDEVICEIMAGEINFOA, *LPDIDEVICEIMAGEINFOA; +typedef const DIDEVICEIMAGEINFOA *LPCDIDEVICEIMAGEINFOA; + +typedef struct _DIDEVICEIMAGEINFOW { + WCHAR tszImagePath[MAX_PATH]; + DWORD dwFlags; + DWORD dwViewID; + RECT rcOverlay; + DWORD dwObjID; + DWORD dwcValidPts; + POINT rgptCalloutLine[5]; + RECT rcCalloutRect; + DWORD dwTextAlign; +} DIDEVICEIMAGEINFOW, *LPDIDEVICEIMAGEINFOW; +typedef const DIDEVICEIMAGEINFOW *LPCDIDEVICEIMAGEINFOW; + +DECL_WINELIB_TYPE_AW(DIDEVICEIMAGEINFO) +DECL_WINELIB_TYPE_AW(LPDIDEVICEIMAGEINFO) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFO) + +typedef struct _DIDEVICEIMAGEINFOHEADERA { + DWORD dwSize; + DWORD dwSizeImageInfo; + DWORD dwcViews; + DWORD dwcButtons; + DWORD dwcAxes; + DWORD dwcPOVs; + DWORD dwBufferSize; + DWORD dwBufferUsed; + LPDIDEVICEIMAGEINFOA lprgImageInfoArray; +} DIDEVICEIMAGEINFOHEADERA, *LPDIDEVICEIMAGEINFOHEADERA; +typedef const DIDEVICEIMAGEINFOHEADERA *LPCDIDEVICEIMAGEINFOHEADERA; + +typedef struct _DIDEVICEIMAGEINFOHEADERW { + DWORD dwSize; + DWORD dwSizeImageInfo; + DWORD dwcViews; + DWORD dwcButtons; + DWORD dwcAxes; + DWORD dwcPOVs; + DWORD dwBufferSize; + DWORD dwBufferUsed; + LPDIDEVICEIMAGEINFOW lprgImageInfoArray; +} DIDEVICEIMAGEINFOHEADERW, *LPDIDEVICEIMAGEINFOHEADERW; +typedef const DIDEVICEIMAGEINFOHEADERW *LPCDIDEVICEIMAGEINFOHEADERW; + +DECL_WINELIB_TYPE_AW(DIDEVICEIMAGEINFOHEADER) +DECL_WINELIB_TYPE_AW(LPDIDEVICEIMAGEINFOHEADER) +DECL_WINELIB_TYPE_AW(LPCDIDEVICEIMAGEINFOHEADER) + +#endif /* DI8 */ + /***************************************************************************** * IDirectInputEffect interface @@ -894,7 +1144,7 @@ ICOM_METHOD3(HRESULT,EnumCreatedEffectObjects, LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,lpCallback, LPVOID,pvRef, DWORD,fl) \ ICOM_METHOD1(HRESULT,Escape, LPDIEFFESCAPE,pesc) \ ICOM_METHOD (HRESULT,Poll) \ - ICOM_METHOD4(HRESULT,SendDeviceData, DWORD,cbObjectData, LPDIDEVICEOBJECTDATA,rgdod, LPDWORD,pdwInOut, DWORD,fl) + ICOM_METHOD4(HRESULT,SendDeviceData, DWORD,cbObjectData, LPCDIDEVICEOBJECTDATA,rgdod, LPDWORD,pdwInOut, DWORD,fl) #define IDirectInputDevice2A_IMETHODS \ IDirectInputDeviceA_IMETHODS \ IDirectInputDevice2A_METHODS @@ -932,6 +1182,7 @@ #define IDirectInputDevice2_Poll(p) ICOM_CALL (Poll,p) #define IDirectInputDevice2_SendDeviceData(p,a,b,c,d) ICOM_CALL4(SendDeviceData,p,a,b,c,d) +#if DIRECTINPUT_VERSION >= 0x0700 /***************************************************************************** * IDirectInputDevice7A interface */ @@ -940,8 +1191,7 @@ ICOM_METHOD4(HRESULT,EnumEffectsInFile,LPCSTR,lpszFileName,LPDIENUMEFFECTSINFILECALLBACK,pec,LPVOID,pvRef,DWORD,dwFlags) \ ICOM_METHOD4(HRESULT,WriteEffectToFile,LPCSTR,lpszFileName,DWORD,dwEntries,LPDIFILEEFFECT,rgDiFileEft,DWORD,dwFlags) #define IDirectInputDevice7A_IMETHODS \ - IDirectInputDeviceA_IMETHODS \ - IDirectInputDevice2A_METHODS \ + IDirectInputDevice2A_IMETHODS \ IDirectInputDevice7A_METHODS ICOM_DEFINE(IDirectInputDevice7A,IDirectInputDevice2A) #undef ICOM_INTERFACE @@ -979,6 +1229,61 @@ /*** IDirectInputDevice7 methods ***/ #define IDirectInputDevice7_EnumEffectsInFile(p,a,b,c,d) ICOM_CALL4(EnumEffectsInFile,p,a,b,c,d) #define IDirectInputDevice7_WriteEffectToFile(p,a,b,c,d) ICOM_CALL4(WriteEffectToFile,p,a,b,c,d) +#endif /* DI7 */ + +#if DIRECTINPUT_VERSION >= 0x0800 +/***************************************************************************** + * IDirectInputDevice8A interface + */ +#define ICOM_INTERFACE IDirectInputDevice8A +#define IDirectInputDevice8A_METHODS \ + ICOM_METHOD3(HRESULT,BuildActionMap, LPDIACTIONFORMATA,lpdiaf, LPCSTR,lpszUserName, DWORD,dwFlags) \ + ICOM_METHOD3(HRESULT,SetActionMap, LPDIACTIONFORMATA,lpdiaf, LPCSTR,lpszUserName, DWORD,dwFlags) \ + ICOM_METHOD1(HRESULT,GetImageInfo, LPDIDEVICEIMAGEINFOHEADERA,lpdiDevImageInfoHeader) +#define IDirectInputDevice8A_IMETHODS \ + IDirectInputDevice7A_IMETHODS \ + IDirectInputDevice8A_METHODS +ICOM_DEFINE(IDirectInputDevice8A,IDirectInputDevice7A) +#undef ICOM_INTERFACE + +/*** IUnknown methods ***/ +#define IDirectInputDevice8_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b) +#define IDirectInputDevice8_AddRef(p) ICOM_CALL (AddRef,p) +#define IDirectInputDevice8_Release(p) ICOM_CALL (Release,p) +/*** IDirectInputDevice methods ***/ +#define IDirectInputDevice8_GetCapabilities(p,a) ICOM_CALL1(GetCapabilities,p,a) +#define IDirectInputDevice8_EnumObjects(p,a,b,c) ICOM_CALL3(EnumObjects,p,a,b,c) +#define IDirectInputDevice8_GetProperty(p,a,b) ICOM_CALL2(GetProperty,p,a,b) +#define IDirectInputDevice8_SetProperty(p,a,b) ICOM_CALL2(SetProperty,p,a,b) +#define IDirectInputDevice8_Acquire(p) ICOM_CALL (Acquire,p) +#define IDirectInputDevice8_Unacquire(p) ICOM_CALL (Unacquire,p) +#define IDirectInputDevice8_GetDeviceState(p,a,b) ICOM_CALL2(GetDeviceState,p,a,b) +#define IDirectInputDevice8_GetDeviceData(p,a,b,c,d) ICOM_CALL4(GetDeviceData,p,a,b,c,d) +#define IDirectInputDevice8_SetDataFormat(p,a) ICOM_CALL1(SetDataFormat,p,a) +#define IDirectInputDevice8_SetEventNotification(p,a) ICOM_CALL1(SetEventNotification,p,a) +#define IDirectInputDevice8_SetCooperativeLevel(p,a,b) ICOM_CALL2(SetCooperativeLevel,p,a,b) +#define IDirectInputDevice8_GetObjectInfo(p,a,b,c) ICOM_CALL3(GetObjectInfo,p,a,b,c) +#define IDirectInputDevice8_GetDeviceInfo(p,a) ICOM_CALL1(GetDeviceInfo,p,a) +#define IDirectInputDevice8_RunControlPanel(p,a,b) ICOM_CALL2(RunControlPanel,p,a,b) +#define IDirectInputDevice8_Initialize(p,a,b,c) ICOM_CALL3(Initialize,p,a,b,c) +/*** IDirectInputDevice2 methods ***/ +#define IDirectInputDevice8_CreateEffect(p,a,b,c,d) ICOM_CALL4(CreateEffect,p,a,b,c,d) +#define IDirectInputDevice8_EnumEffects(p,a,b,c) ICOM_CALL3(EnumEffects,p,a,b,c) +#define IDirectInputDevice8_GetEffectInfo(p,a,b) ICOM_CALL2(GetEffectInfo,p,a,b) +#define IDirectInputDevice8_GetForceFeedbackState(p,a) ICOM_CALL1(GetForceFeedbackState,p,a) +#define IDirectInputDevice8_SendForceFeedbackCommand(p,a) ICOM_CALL1(SendForceFeedbackCommand,p,a) +#define IDirectInputDevice8_EnumCreatedEffectObjects(p,a,b,c) ICOM_CALL3(EnumCreatedEffectObjects,p,a,b,c) +#define IDirectInputDevice8_Escape(p,a) ICOM_CALL1(Escape,p,a) +#define IDirectInputDevice8_Poll(p) ICOM_CALL (Poll,p) +#define IDirectInputDevice8_SendDeviceData(p,a,b,c,d) ICOM_CALL4(SendDeviceData,p,a,b,c,d) +/*** IDirectInputDevice7 methods ***/ +#define IDirectInputDevice8_EnumEffectsInFile(p,a,b,c,d) ICOM_CALL4(EnumEffectsInFile,p,a,b,c,d) +#define IDirectInputDevice8_WriteEffectToFile(p,a,b,c,d) ICOM_CALL4(WriteEffectToFile,p,a,b,c,d) +/*** IDirectInputDevice8 methods ***/ +#define IDirectInputDevice8_BuildActionMap(p,a,b,c) ICOM_CALL3(BuildActionMap,p,a,b,c) +#define IDirectInputDevice8_SetActionMap(p,a,b,c) ICOM_CALL3(SetActionMap,p,a,b,c) +#define IDirectInputDevice8_GetImageInfo(p,a) ICOM_CALL1(GetImageInfo,p,a) +#endif /* DI8 */ /* "Standard" Mouse report... */ typedef struct DIMOUSESTATE { @@ -1068,6 +1373,7 @@ /*** IDirectInput2A methods ***/ #define IDirectInput2A_FindDevice(p,a,b,c) ICOM_CALL3(FindDevice,p,a,b,c) +#if DIRECTINPUT_VERSION >= 0x0700 /***************************************************************************** * IDirectInput7A interface */ @@ -1094,11 +1400,51 @@ #define IDirectInput7A_FindDevice(p,a,b,c) ICOM_CALL3(FindDevice,p,a,b,c) /*** IDirectInput7A methods ***/ #define IDirectInput7A_CreateDeviceEx(p,a,b,c,d) ICOM_CALL4(CreateDeviceEx,p,a,b,c,d) +#endif /* DI7 */ + +#if DIRECTINPUT_VERSION >= 0x0800 +/***************************************************************************** + * IDirectInput8A interface + */ +#define ICOM_INTERFACE IDirectInput8A +#define IDirectInput8A_METHODS \ + ICOM_METHOD3(HRESULT,CreateDevice, REFGUID,rguid, LPDIRECTINPUTDEVICE8A*,lplpDirectInputDevice, LPUNKNOWN,pUnkOuter) \ + ICOM_METHOD4(HRESULT,EnumDevices, DWORD,dwDevType, LPDIENUMDEVICESCALLBACKA,lpCallback, LPVOID,pvRef, DWORD,dwFlags) \ + ICOM_METHOD1(HRESULT,GetDeviceStatus, REFGUID,rguidInstance) \ + ICOM_METHOD2(HRESULT,RunControlPanel, HWND,hwndOwner, DWORD,dwFlags) \ + ICOM_METHOD2(HRESULT,Initialize, HINSTANCE,hinst, DWORD,dwVersion) \ + ICOM_METHOD3(HRESULT,FindDevice, REFGUID,rguid, LPCSTR,pszName, LPGUID,pguidInstance) \ + ICOM_METHOD5(HRESULT,EnumDevicesBySemantics, LPCSTR,ptszUserName, LPDIACTIONFORMATA,lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBA,lpCallback, LPVOID,pvRef, DWORD,dwFlags) \ + ICOM_METHOD4(HRESULT,ConfigureDevices,LPDICONFIGUREDEVICESCALLBACK,lpdiCallback, LPDICONFIGUREDEVICESPARAMSA,lpdiCDParams, DWORD,dwFlags, LPVOID,pvRefData) +#define IDirectInput8A_IMETHODS \ + IUnknown_IMETHODS \ + IDirectInput8A_METHODS +ICOM_DEFINE(IDirectInput8A,IUnknown) +#undef ICOM_INTERFACE + +/*** IUnknown methods ***/ +#define IDirectInput8A_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b) +#define IDirectInput8A_AddRef(p) ICOM_CALL (AddRef,p) +#define IDirectInput8A_Release(p) ICOM_CALL (Release,p) + /*** IDirectInput8A methods ***/ +#define IDirectInput8A_CreateDevice(p,a,b,c) ICOM_CALL3(CreateDevice,p,a,b,c) +#define IDirectInput8A_EnumDevices(p,a,b,c,d) ICOM_CALL4(EnumDevices,p,a,b,c,d) +#define IDirectInput8A_GetDeviceStatus(p,a) ICOM_CALL1(GetDeviceStatus,p,a) +#define IDirectInput8A_RunControlPanel(p,a,b) ICOM_CALL2(RunControlPanel,p,a,b) +#define IDirectInput8A_Initialize(p,a,b) ICOM_CALL2(Initialize,p,a,b) +#define IDirectInput8A_FindDevice(p,a,b,c) ICOM_CALL3(FindDevice,p,a,b,c) +#define IDirectInput8A_EnumDevicesBySemantics(p,a,b,c,d,e) ICOM_CALL5(EnumDevicesBySemantics,p,a,b,c,d,e) +#define IDirectInput8A_ConfigureDevices(p,a,b,c,d) ICOM_CALL4(ConfigureDevices,p,a,b,c,d) +#endif /* DI8 */ /* Export functions */ #ifdef __cplusplus extern "C" { +#endif + +#if DIRECTINPUT_VERSION >= 0x0800 +HRESULT WINAPI DirectInput8Create(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN); #endif HRESULT WINAPI DirectInputCreateA(HINSTANCE,DWORD,LPDIRECTINPUTA *,LPUNKNOWN); --- /dev/null Mon Jul 18 01:46:18 1994 +++ dlls/dinput8/.cvsignore Sun Jun 9 22:14:10 2002 @@ -0,0 +1,2 @@ +Makefile +dinput8.spec.c --- /dev/null Mon Jul 18 01:46:18 1994 +++ dlls/dinput8/Makefile.in Mon Jun 10 21:10:53 2002 @@ -0,0 +1,18 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = dinput8.dll +IMPORTS = dinput +EXTRALIBS = $(LIBUUID) + +LDDLLFLAGS = @LDDLLFLAGS@ +SYMBOLFILE = $(MODULE).tmp.o + +C_SRCS = \ + dinput8_main.c + +@MAKE_DLL_RULES@ + +### Dependencies: + --- /dev/null Mon Jul 18 01:46:18 1994 +++ dlls/dinput8/dinput8.spec Mon Jun 10 21:10:37 2002 @@ -0,0 +1,7 @@ +name dinput8 + +@ stdcall DirectInput8Create(long long ptr ptr ptr) DirectInput8Create +@ stdcall DllCanUnloadNow() DINPUT8_DllCanUnloadNow +@ stdcall DllGetClassObject(ptr ptr ptr) DINPUT8_DllGetClassObject +@ stdcall DllRegisterServer() DINPUT8_DllRegisterServer +@ stdcall DllUnregisterServer() DINPUT8_DllUnregisterServer --- /dev/null Mon Jul 18 01:46:18 1994 +++ dlls/dinput8/dinput8_main.c Mon Jun 10 21:07:36 2002 @@ -0,0 +1,69 @@ +/* DirectInput 8 + * + * Copyright 2002 TransGaming Technologies Inc. + * + */ + +#include "config.h" +#include <assert.h> +#include <string.h> + +#include "wine/debug.h" +#include "winbase.h" +#include "winerror.h" +#include "windef.h" +#include "dinput.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dinput); + +/****************************************************************************** + * DirectInput8Create (DINPUT8.@) + */ +HRESULT WINAPI DirectInput8Create( + HINSTANCE hinst, DWORD dwVersion, REFIID riid, LPVOID *ppDI, + LPUNKNOWN punkOuter +) { + return DirectInputCreateEx(hinst, dwVersion, riid, ppDI, punkOuter); +} + +/*********************************************************************** + * DllCanUnloadNow (DINPUT8.@) + */ +HRESULT WINAPI DINPUT8_DllCanUnloadNow(void) +{ + FIXME("(void): stub\n"); + + return S_FALSE; +} + +/*********************************************************************** + * DllGetClassObject (DINPUT8.@) + */ +HRESULT WINAPI DINPUT8_DllGetClassObject(REFCLSID rclsid, REFIID riid, + LPVOID *ppv) +{ + FIXME("(%p, %p, %p): stub\n", debugstr_guid(rclsid), + debugstr_guid(riid), ppv); + + return CLASS_E_CLASSNOTAVAILABLE; +} + +/*********************************************************************** + * DllRegisterServer (DINPUT8.@) + */ +HRESULT WINAPI DINPUT8_DllRegisterServer(void) +{ + FIXME("(void): stub\n"); + + return S_OK; +} + +/*********************************************************************** + * DllUnregisterServer (DINPUT8.@) + */ +HRESULT WINAPI DINPUT8_DllUnregisterServer(void) +{ + FIXME("(void): stub\n"); + + return S_OK; +}