-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Le Lundi 09 Juin 2003 15:38, Christian Costa a écrit : > Hi, > > This patch makes dinput8 behaviour more correct for mouse and keyboard. > Now, controls work in the Incoming Forces demo. > I suppose the game is playable. I didn't play too much since it's slow > with my P2-400 / TNT2. good news ;) > At the very least, this will give some material for Raphael and Jason. well now we have to look it ;)) > Bye, > Christian > > Changelog : > Make dinput8 behaviour more correct for mouse and keyboard. > Fix small bug when keyboard buffer overflows. > Use DI_OK instead of 0 for returned values. As your patch is a little malformed and conflicts with mine (a big one) i send my patch merged with yours, can you look if all is correct. Changelog addin: - - DInput WideChar classes support try 2: with this unreal tournament 2003 is playable and unreal2 can launch. This time all dinput versions have widechar classes. Sorry about this huge patch Alexandre :( Regards, Raphael -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2 (GNU/Linux) iD8DBQE+5MXMp7NA3AmQTU4RAgQAAJ9f1/EDWNZ0AAE1yM94uCV+93lxtgCfSJNR OYyJXFmkp9Hp9pSGT962cQg= =S9OR -----END PGP SIGNATURE-----
Index: include/dinput.h =================================================================== RCS file: /home/wine/wine/include/dinput.h,v retrieving revision 1.34 diff -u -r1.34 dinput.h --- include/dinput.h 11 Apr 2003 00:31:04 -0000 1.34 +++ include/dinput.h 9 Jun 2003 17:29:28 -0000 @@ -191,6 +191,25 @@ #define DIDEVTYPE_JOYSTICK 4 #define DIDEVTYPE_HID 0x00010000 +#define DI8DEVCLASS_ALL 0 +#define DI8DEVCLASS_DEVICE 1 +#define DI8DEVCLASS_POINTER 2 +#define DI8DEVCLASS_KEYBOARD 3 +#define DI8DEVCLASS_GAMECTRL 4 + +#define DI8DEVTYPE_DEVICE 0x11 +#define DI8DEVTYPE_MOUSE 0x12 +#define DI8DEVTYPE_KEYBOARD 0x13 +#define DI8DEVTYPE_JOYSTICK 0x14 +#define DI8DEVTYPE_GAMEPAD 0x15 +#define DI8DEVTYPE_DRIVING 0x16 +#define DI8DEVTYPE_FLIGHT 0x17 +#define DI8DEVTYPE_1STPERSON 0x18 +#define DI8DEVTYPE_DEVICECTRL 0x19 +#define DI8DEVTYPE_SCREENPOINTER 0x1A +#define DI8DEVTYPE_REMOTE 0x1B +#define DI8DEVTYPE_SUPPLEMENTAL 0x1C + #define DIDEVTYPEMOUSE_UNKNOWN 1 #define DIDEVTYPEMOUSE_TRADITIONAL 2 #define DIDEVTYPEMOUSE_FINGERSTICK 3 @@ -219,6 +238,76 @@ #define DIDEVTYPEJOYSTICK_WHEEL 6 #define DIDEVTYPEJOYSTICK_HEADTRACKER 7 +#define DI8DEVTYPEMOUSE_UNKNOWN 1 +#define DI8DEVTYPEMOUSE_TRADITIONAL 2 +#define DI8DEVTYPEMOUSE_FINGERSTICK 3 +#define DI8DEVTYPEMOUSE_TOUCHPAD 4 +#define DI8DEVTYPEMOUSE_TRACKBALL 5 +#define DI8DEVTYPEMOUSE_ABSOLUTE 6 + +#define DI8DEVTYPEKEYBOARD_UNKNOWN 0 +#define DI8DEVTYPEKEYBOARD_PCXT 1 +#define DI8DEVTYPEKEYBOARD_OLIVETTI 2 +#define DI8DEVTYPEKEYBOARD_PCAT 3 +#define DI8DEVTYPEKEYBOARD_PCENH 4 +#define DI8DEVTYPEKEYBOARD_NOKIA1050 5 +#define DI8DEVTYPEKEYBOARD_NOKIA9140 6 +#define DI8DEVTYPEKEYBOARD_NEC98 7 +#define DI8DEVTYPEKEYBOARD_NEC98LAPTOP 8 +#define DI8DEVTYPEKEYBOARD_NEC98106 9 +#define DI8DEVTYPEKEYBOARD_JAPAN106 10 +#define DI8DEVTYPEKEYBOARD_JAPANAX 11 +#define DI8DEVTYPEKEYBOARD_J3100 12 + +#define DI8DEVTYPE_LIMITEDGAMESUBTYPE 1 + +#define DI8DEVTYPEJOYSTICK_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEJOYSTICK_STANDARD 2 + +#define DI8DEVTYPEGAMEPAD_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEGAMEPAD_STANDARD 2 +#define DI8DEVTYPEGAMEPAD_TILT 3 + +#define DI8DEVTYPEDRIVING_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEDRIVING_COMBINEDPEDALS 2 +#define DI8DEVTYPEDRIVING_DUALPEDALS 3 +#define DI8DEVTYPEDRIVING_THREEPEDALS 4 +#define DI8DEVTYPEDRIVING_HANDHELD 5 + +#define DI8DEVTYPEFLIGHT_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPEFLIGHT_STICK 2 +#define DI8DEVTYPEFLIGHT_YOKE 3 +#define DI8DEVTYPEFLIGHT_RC 4 + +#define DI8DEVTYPE1STPERSON_LIMITED DI8DEVTYPE_LIMITEDGAMESUBTYPE +#define DI8DEVTYPE1STPERSON_UNKNOWN 2 +#define DI8DEVTYPE1STPERSON_SIXDOF 3 +#define DI8DEVTYPE1STPERSON_SHOOTER 4 + +#define DI8DEVTYPESCREENPTR_UNKNOWN 2 +#define DI8DEVTYPESCREENPTR_LIGHTGUN 3 +#define DI8DEVTYPESCREENPTR_LIGHTPEN 4 +#define DI8DEVTYPESCREENPTR_TOUCH 5 + +#define DI8DEVTYPEREMOTE_UNKNOWN 2 + +#define DI8DEVTYPEDEVICECTRL_UNKNOWN 2 +#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION 3 +#define DI8DEVTYPEDEVICECTRL_COMMSSELECTION_HARDWIRED 4 + +#define DI8DEVTYPESUPPLEMENTAL_UNKNOWN 2 +#define DI8DEVTYPESUPPLEMENTAL_2NDHANDCONTROLLER 3 +#define DI8DEVTYPESUPPLEMENTAL_HEADTRACKER 4 +#define DI8DEVTYPESUPPLEMENTAL_HANDTRACKER 5 +#define DI8DEVTYPESUPPLEMENTAL_SHIFTSTICKGATE 6 +#define DI8DEVTYPESUPPLEMENTAL_SHIFTER 7 +#define DI8DEVTYPESUPPLEMENTAL_THROTTLE 8 +#define DI8DEVTYPESUPPLEMENTAL_SPLITTHROTTLE 9 +#define DI8DEVTYPESUPPLEMENTAL_COMBINEDPEDALS 10 +#define DI8DEVTYPESUPPLEMENTAL_DUALPEDALS 11 +#define DI8DEVTYPESUPPLEMENTAL_THREEPEDALS 12 +#define DI8DEVTYPESUPPLEMENTAL_RUDDERPEDALS 13 + #define GET_DIDEVICE_TYPE(dwDevType) LOBYTE(dwDevType) #define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType) @@ -1107,6 +1196,30 @@ ICOM_DEFINE(IDirectInputDeviceA,IUnknown) #undef INTERFACE +/***************************************************************************** + * IDirectInputDeviceW interface + */ +#define INTERFACE IDirectInputDeviceW +#define IDirectInputDeviceW_METHODS \ + IUnknown_METHODS \ + STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS lpDIDevCaps) PURE; \ + STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \ + STDMETHOD(GetProperty)(THIS_ REFGUID rguidProp, LPDIPROPHEADER pdiph) PURE; \ + STDMETHOD(SetProperty)(THIS_ REFGUID rguidProp, LPCDIPROPHEADER pdiph) PURE; \ + STDMETHOD(Acquire)(THIS) PURE; \ + STDMETHOD(Unacquire)(THIS) PURE; \ + STDMETHOD(GetDeviceState)(THIS_ DWORD cbData, LPVOID lpvData) PURE; \ + STDMETHOD(GetDeviceData)(THIS_ DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) PURE; \ + STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT lpdf) PURE; \ + STDMETHOD(SetEventNotification)(THIS_ HANDLE hEvent) PURE; \ + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwFlags) PURE; \ + STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) PURE; \ + STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW pdidi) PURE; \ + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; \ + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) PURE; +ICOM_DEFINE(IDirectInputDeviceW,IUnknown) +#undef INTERFACE + #ifdef COBJMACROS /*** IUnknown methods ***/ #define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) @@ -1149,6 +1262,24 @@ ICOM_DEFINE(IDirectInputDevice2A,IDirectInputDeviceA) #undef INTERFACE +/***************************************************************************** + * IDirectInputDevice2W interface + */ +#define INTERFACE IDirectInputDevice2W +#define IDirectInputDevice2W_METHODS \ + IDirectInputDeviceW_METHODS \ + STDMETHOD(CreateEffect)(THIS_ REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) PURE; \ + STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) PURE; \ + STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW pdei, REFGUID rguid) PURE; \ + STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD pdwOut) PURE; \ + STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD dwFlags) PURE; \ + STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) PURE; \ + STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE pesc) PURE; \ + STDMETHOD(Poll)(THIS) PURE; \ + STDMETHOD(SendDeviceData)(THIS_ DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) PURE; +ICOM_DEFINE(IDirectInputDevice2W,IDirectInputDeviceW) +#undef INTERFACE + #ifdef COBJMACROS /*** IUnknown methods ***/ #define IDirectInputDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) @@ -1194,6 +1325,17 @@ ICOM_DEFINE(IDirectInputDevice7A,IDirectInputDevice2A) #undef INTERFACE +/***************************************************************************** + * IDirectInputDevice7W interface + */ +#define INTERFACE IDirectInputDevice7W +#define IDirectInputDevice7W_METHODS \ + IDirectInputDevice2W_METHODS \ + STDMETHOD(EnumEffectsInFile)(THIS_ LPCWSTR lpszFileName,LPDIENUMEFFECTSINFILECALLBACK pec,LPVOID pvRef,DWORD dwFlags) PURE; \ + STDMETHOD(WriteEffectToFile)(THIS_ LPCWSTR lpszFileName,DWORD dwEntries,LPDIFILEEFFECT rgDiFileEft,DWORD dwFlags) PURE; +ICOM_DEFINE(IDirectInputDevice7W,IDirectInputDevice2W) +#undef INTERFACE + #ifdef COBJMACROS /*** IUnknown methods ***/ #define IDirectInputDevice7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) @@ -1245,6 +1387,18 @@ ICOM_DEFINE(IDirectInputDevice8A,IDirectInputDevice7A) #undef INTERFACE +/***************************************************************************** + * IDirectInputDevice8W interface + */ +#define INTERFACE IDirectInputDevice8W +#define IDirectInputDevice8W_METHODS \ + IDirectInputDevice7W_METHODS \ + STDMETHOD(BuildActionMap)(THIS_ LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) PURE; \ + STDMETHOD(SetActionMap)(THIS_ LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) PURE; \ + STDMETHOD(GetImageInfo)(THIS_ LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader) PURE; +ICOM_DEFINE(IDirectInputDevice8W,IDirectInputDevice7W) +#undef INTERFACE + #ifdef COBJMACROS /*** IUnknown methods ***/ #define IDirectInputDevice8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) @@ -1351,6 +1505,33 @@ #endif /***************************************************************************** + * IDirectInputW interface + */ +#define INTERFACE IDirectInputW +#define IDirectInputW_METHODS \ + IUnknown_METHODS \ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICEW *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; \ + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \ + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; \ + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; \ + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; +ICOM_DEFINE(IDirectInputW,IUnknown) +#undef INTERFACE + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IDirectInputW_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInputW_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInputW_Release(p) (p)->lpVtbl->Release(p) + /*** IDirectInputW methods ***/ +#define IDirectInputW_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInputW_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInputW_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInputW_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInputW_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#endif + +/***************************************************************************** * IDirectInput2A interface */ #define INTERFACE IDirectInput2A @@ -1375,6 +1556,31 @@ #define IDirectInput2A_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) #endif +/***************************************************************************** + * IDirectInput2W interface + */ +#define INTERFACE IDirectInput2W +#define IDirectInput2W_METHODS \ + IDirectInputW_METHODS \ + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE; +ICOM_DEFINE(IDirectInput2W,IDirectInputW) +#undef INTERFACE + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IDirectInput2W_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput2W_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput2W_Release(p) (p)->lpVtbl->Release(p) + /*** IDirectInputW methods ***/ +#define IDirectInput2W_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput2W_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput2W_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput2W_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput2W_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) + /*** IDirectInput2W methods ***/ +#define IDirectInput2W_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +#endif + #if DIRECTINPUT_VERSION >= 0x0700 /***************************************************************************** * IDirectInput7A interface @@ -1403,6 +1609,33 @@ #define IDirectInput7A_CreateDeviceEx(p,a,b,c,d) (p)->lpVtbl->CreateDeviceEx(p,a,b,c,d) #endif +/***************************************************************************** + * IDirectInput7W interface + */ +#define INTERFACE IDirectInput7W +#define IDirectInput7W_METHODS \ + IDirectInput2W_METHODS \ + STDMETHOD(CreateDeviceEx)(THIS_ REFGUID rguid, REFIID riid, LPVOID *pvOut, LPUNKNOWN lpUnknownOuter) PURE; +ICOM_DEFINE(IDirectInput7W,IDirectInput2W) +#undef INTERFACE + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IDirectInput7W_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput7W_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput7W_Release(p) (p)->lpVtbl->Release(p) + /*** IDirectInputW methods ***/ +#define IDirectInput7W_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput7W_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput7W_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput7W_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput7W_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) + /*** IDirectInput2W methods ***/ +#define IDirectInput7W_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) + /*** IDirectInput7W methods ***/ +#define IDirectInput7W_CreateDeviceEx(p,a,b,c,d) (p)->lpVtbl->CreateDeviceEx(p,a,b,c,d) +#endif + #endif /* DI7 */ #if DIRECTINPUT_VERSION >= 0x0800 @@ -1439,6 +1672,39 @@ #define IDirectInput8A_ConfigureDevices(p,a,b,c,d) (p)->lpVtbl->ConfigureDevices(p,a,b,c,d) #endif +/***************************************************************************** + * IDirectInput8W interface + */ +#define INTERFACE IDirectInput8W +#define IDirectInput8W_METHODS \ + IUnknown_METHODS \ + STDMETHOD(CreateDevice)(THIS_ REFGUID rguid, LPDIRECTINPUTDEVICE8W *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) PURE; \ + STDMETHOD(EnumDevices)(THIS_ DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \ + STDMETHOD(GetDeviceStatus)(THIS_ REFGUID rguidInstance) PURE; \ + STDMETHOD(RunControlPanel)(THIS_ HWND hwndOwner, DWORD dwFlags) PURE; \ + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; \ + STDMETHOD(FindDevice)(THIS_ REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) PURE; \ + STDMETHOD(EnumDevicesBySemantics)(THIS_ LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBW lpCallback, LPVOID pvRef, DWORD dwFlags) PURE; \ + STDMETHOD(ConfigureDevices)(THIS_ LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSW lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) PURE; +ICOM_DEFINE(IDirectInput8W,IUnknown) +#undef INTERFACE + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IDirectInput8W_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectInput8W_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectInput8W_Release(p) (p)->lpVtbl->Release(p) + /*** IDirectInput8W methods ***/ +#define IDirectInput8W_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c) +#define IDirectInput8W_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d) +#define IDirectInput8W_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a) +#define IDirectInput8W_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b) +#define IDirectInput8W_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IDirectInput8W_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c) +#define IDirectInput8W_EnumDevicesBySemantics(p,a,b,c,d,e) (p)->lpVtbl->EnumDevicesBySemantics(p,a,b,c,d,e) +#define IDirectInput8W_ConfigureDevices(p,a,b,c,d) (p)->lpVtbl->ConfigureDevices(p,a,b,c,d) +#endif + #endif /* DI8 */ /* Export functions */ @@ -1452,7 +1718,7 @@ #endif HRESULT WINAPI DirectInputCreateA(HINSTANCE,DWORD,LPDIRECTINPUTA *,LPUNKNOWN); -HRESULT WINAPI DirectInputCreateW(HINSTANCE,DWORD,LPDIRECTINPUTA *,LPUNKNOWN); +HRESULT WINAPI DirectInputCreateW(HINSTANCE,DWORD,LPDIRECTINPUTW *,LPUNKNOWN); #define DirectInputCreate WINELIB_NAME_AW(DirectInputCreate) HRESULT WINAPI DirectInputCreateEx(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN); Index: dlls/dinput/device.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/device.c,v retrieving revision 1.11 diff -u -r1.11 device.c --- dlls/dinput/device.c 29 Apr 2003 22:47:04 -0000 1.11 +++ dlls/dinput/device.c 9 Jun 2003 17:29:30 -0000 @@ -28,6 +28,7 @@ #include <string.h> #include "wine/debug.h" +#include "wine/unicode.h" #include "winbase.h" #include "winerror.h" #include "windef.h" @@ -107,6 +108,13 @@ } } +void _dump_OBJECTINSTANCEW(DIDEVICEOBJECTINSTANCEW *ddoi) { + if (TRACE_ON(dinput)) { + DPRINTF(" - enumerating : %s - %2ld - 0x%08lx - %s\n", + debugstr_guid(&ddoi->guidType), ddoi->dwOfs, ddoi->dwType, debugstr_w(ddoi->tszName)); + } +} + /* Conversion between internal data buffer and external data buffer */ void fill_DataFormat(void *out, void *in, DataFormat *df) { int i; @@ -267,6 +275,40 @@ return ret; } +BOOL DIEnumDevicesCallbackAtoW(LPCDIDEVICEOBJECTINSTANCEA lpddi, LPVOID lpvRef) { + DIDEVICEOBJECTINSTANCEW ddtmp; + device_enumobjects_AtoWcb_data* data; + + data = (device_enumobjects_AtoWcb_data*) lpvRef; + + memset(&ddtmp, 0, sizeof(DIDEVICEINSTANCEW)); + + ddtmp.dwSize = sizeof(DIDEVICEINSTANCEW); + ddtmp.guidType = lpddi->guidType; + ddtmp.dwOfs = lpddi->dwOfs; + ddtmp.dwType = lpddi->dwType; + ddtmp.dwFlags = lpddi->dwFlags; + MultiByteToWideChar(CP_ACP, 0, lpddi->tszName, -1, ddtmp.tszName, MAX_PATH); +#if(DIRECTINPUT_VERSION >= 0x0500) + if (lpddi->dwSize == sizeof(DIDEVICEINSTANCEA)) { + /** + * if dwSize < sizeof(DIDEVICEINSTANCEA of DInput version >= 5) + * force feedback and other newer datas aren't available + */ + ddtmp.dwFFMaxForce = lpddi->dwFFMaxForce; + ddtmp.dwFFForceResolution = lpddi->dwFFForceResolution; + ddtmp.wCollectionNumber = lpddi->wCollectionNumber; + ddtmp.wDesignatorIndex = lpddi->wDesignatorIndex; + ddtmp.wUsagePage = lpddi->wUsagePage; + ddtmp.wUsage = lpddi->wUsage; + ddtmp.dwDimension = lpddi->dwDimension; + ddtmp.wExponent = lpddi->wExponent; + ddtmp.wReserved = lpddi->wReserved; + } +#endif + return data->lpCallBack(&ddtmp, lpvRef); +} + /****************************************************************************** * IDirectInputDeviceA */ @@ -291,7 +333,7 @@ TRACE("dwType 0x%02x,dwInstance %d\n",DIDFT_GETTYPE(df->rgodf[i].dwType),DIDFT_GETINSTANCE(df->rgodf[i].dwType)); TRACE("df.rgodf[%d].dwFlags 0x%08lx\n",i,df->rgodf[i].dwFlags); } - return 0; + return DI_OK; } HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel( @@ -303,7 +345,7 @@ TRACE(" cooperative level : "); _dump_cooperativelevel_DI(dwflags); } - return 0; + return DI_OK; } HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification( @@ -311,7 +353,7 @@ ) { ICOM_THIS(IDirectInputDevice2AImpl,iface); FIXME("(this=%p,0x%08lx): stub\n",This,(DWORD)hnd); - return 0; + return DI_OK; } ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE8A iface) @@ -321,7 +363,7 @@ if (This->ref) return This->ref; HeapFree(GetProcessHeap(),0,This); - return 0; + return DI_OK; } HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface( @@ -334,17 +376,53 @@ if (IsEqualGUID(&IID_IUnknown,riid)) { IDirectInputDevice2_AddRef(iface); *ppobj = This; - return 0; + return DI_OK; } if (IsEqualGUID(&IID_IDirectInputDeviceA,riid)) { IDirectInputDevice2_AddRef(iface); *ppobj = This; - return 0; + return DI_OK; + } + if (IsEqualGUID(&IID_IDirectInputDevice2A,riid)) { + IDirectInputDevice2_AddRef(iface); + *ppobj = This; + return DI_OK; } if (IsEqualGUID(&IID_IDirectInputDevice7A,riid)) { IDirectInputDevice7_AddRef(iface); *ppobj = This; - return 0; + return DI_OK; + } + TRACE("Unsupported interface !\n"); + return E_FAIL; +} + +HRESULT WINAPI IDirectInputDevice2WImpl_QueryInterface( + LPDIRECTINPUTDEVICE8W iface,REFIID riid,LPVOID *ppobj +) +{ + ICOM_THIS(IDirectInputDevice2AImpl,iface); + + TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); + if (IsEqualGUID(&IID_IUnknown,riid)) { + IDirectInputDevice2_AddRef(iface); + *ppobj = This; + return DI_OK; + } + if (IsEqualGUID(&IID_IDirectInputDeviceW,riid)) { + IDirectInputDevice2_AddRef(iface); + *ppobj = This; + return DI_OK; + } + if (IsEqualGUID(&IID_IDirectInputDevice2W,riid)) { + IDirectInputDevice2_AddRef(iface); + *ppobj = This; + return DI_OK; + } + if (IsEqualGUID(&IID_IDirectInputDevice7W,riid)) { + IDirectInputDevice7_AddRef(iface); + *ppobj = This; + return DI_OK; } TRACE("Unsupported interface !\n"); return E_FAIL; @@ -373,6 +451,22 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice2WImpl_EnumObjects( + LPDIRECTINPUTDEVICE8W iface, + LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, + LPVOID lpvRef, + DWORD dwFlags) +{ + FIXME("(this=%p,%p,%p,%08lx): stub!\n", iface, lpCallback, lpvRef, dwFlags); + if (TRACE_ON(dinput)) { + DPRINTF(" - flags = "); + _dump_EnumObjects_flags(dwFlags); + DPRINTF("\n"); + } + + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice2AImpl_GetProperty( LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, @@ -399,6 +493,18 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice2WImpl_GetObjectInfo( + LPDIRECTINPUTDEVICE8W iface, + LPDIDEVICEOBJECTINSTANCEW pdidoi, + DWORD dwObj, + DWORD dwHow) +{ + FIXME("(this=%p,%p,%ld,0x%08lx): stub!\n", + iface, pdidoi, dwObj, dwHow); + + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo( LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEINSTANCEA pdidi) @@ -408,6 +514,15 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice2WImpl_GetDeviceInfo( + LPDIRECTINPUTDEVICE8W iface, + LPDIDEVICEINSTANCEW pdidi) +{ + FIXME("(this=%p,%p): stub!\n", + iface, pdidi); + + return DI_OK; +} HRESULT WINAPI IDirectInputDevice2AImpl_RunControlPanel( LPDIRECTINPUTDEVICE8A iface, @@ -461,6 +576,20 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice2WImpl_EnumEffects( + LPDIRECTINPUTDEVICE8W iface, + LPDIENUMEFFECTSCALLBACKW lpCallback, + LPVOID lpvRef, + DWORD dwFlags) +{ + FIXME("(this=%p,%p,%p,0x%08lx): stub!\n", + iface, lpCallback, lpvRef, dwFlags); + + if (lpCallback) + lpCallback(NULL, lpvRef); + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice2AImpl_GetEffectInfo( LPDIRECTINPUTDEVICE8A iface, LPDIEFFECTINFOA lpdei, @@ -471,6 +600,16 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice2WImpl_GetEffectInfo( + LPDIRECTINPUTDEVICE8W iface, + LPDIEFFECTINFOW lpdei, + REFGUID rguid) +{ + FIXME("(this=%p,%p,%s): stub!\n", + iface, lpdei, debugstr_guid(rguid)); + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice2AImpl_GetForceFeedbackState( LPDIRECTINPUTDEVICE8A iface, LPDWORD pdwOut) @@ -542,6 +681,17 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice7WImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE8W iface, + LPCWSTR lpszFileName, + LPDIENUMEFFECTSINFILECALLBACK pec, + LPVOID pvRef, + DWORD dwFlags) +{ + FIXME("(%p)->(%s,%p,%p,%08lx): stub !\n", iface, debugstr_w(lpszFileName), pec, pvRef, dwFlags); + + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8A iface, LPCSTR lpszFileName, DWORD dwEntries, @@ -553,6 +703,17 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice7WImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8W iface, + LPCWSTR lpszFileName, + DWORD dwEntries, + LPDIFILEEFFECT rgDiFileEft, + DWORD dwFlags) +{ + FIXME("(%p)->(%s,%08lx,%p,%08lx): stub !\n", iface, debugstr_w(lpszFileName), dwEntries, rgDiFileEft, dwFlags); + + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, @@ -563,6 +724,16 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, + LPDIACTIONFORMATW lpdiaf, + LPCWSTR lpszUserName, + DWORD dwFlags) +{ + FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags); + + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice8AImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, @@ -573,8 +744,26 @@ return DI_OK; } +HRESULT WINAPI IDirectInputDevice8WImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, + LPDIACTIONFORMATW lpdiaf, + LPCWSTR lpszUserName, + DWORD dwFlags) +{ + FIXME("(%p)->(%p,%s,%08lx): stub !\n", iface, lpdiaf, debugstr_w(lpszUserName), dwFlags); + + return DI_OK; +} + HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo(LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader) +{ + FIXME("(%p)->(%p): stub !\n", iface, lpdiDevImageInfoHeader); + + return DI_OK; +} + +HRESULT WINAPI IDirectInputDevice8WImpl_GetImageInfo(LPDIRECTINPUTDEVICE8W iface, + LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader) { FIXME("(%p)->(%p): stub !\n", iface, lpdiDevImageInfoHeader); Index: dlls/dinput/device_private.h =================================================================== RCS file: /home/wine/wine/dlls/dinput/device_private.h,v retrieving revision 1.4 diff -u -r1.4 device_private.h --- dlls/dinput/device_private.h 14 Jun 2002 00:39:44 -0000 1.4 +++ dlls/dinput/device_private.h 9 Jun 2003 17:29:30 -0000 @@ -70,12 +70,24 @@ } \ } +/** + * Callback Data used by specific callback + * for EnumObject on 'W' interfaces + */ +typedef struct { + LPDIENUMDEVICEOBJECTSCALLBACKW lpCallBack; + LPVOID lpvRef; +} device_enumobjects_AtoWcb_data; + +extern BOOL DIEnumDevicesCallbackAtoW(LPCDIDEVICEOBJECTINSTANCEA, LPVOID); + /* Various debug tools */ extern void _dump_cooperativelevel_DI(DWORD dwFlags) ; extern void _dump_EnumObjects_flags(DWORD dwFlags) ; extern void _dump_DIPROPHEADER(DIPROPHEADER *diph) ; extern void _dump_OBJECTINSTANCEA(DIDEVICEOBJECTINSTANCEA *ddoi) ; +extern void _dump_OBJECTINSTANCEW(DIDEVICEOBJECTINSTANCEW *ddoi) ; /* And the stubs */ extern HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat( @@ -85,8 +97,8 @@ extern HRESULT WINAPI IDirectInputDevice2AImpl_SetEventNotification( LPDIRECTINPUTDEVICE8A iface,HANDLE hnd ) ; extern ULONG WINAPI IDirectInputDevice2AImpl_Release(LPDIRECTINPUTDEVICE8A iface) ; -extern HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface( - LPDIRECTINPUTDEVICE8A iface,REFIID riid,LPVOID *ppobj ) ; +extern HRESULT WINAPI IDirectInputDevice2AImpl_QueryInterface(LPDIRECTINPUTDEVICE8A iface,REFIID riid,LPVOID *ppobj); +extern HRESULT WINAPI IDirectInputDevice2WImpl_QueryInterface(LPDIRECTINPUTDEVICE8W iface,REFIID riid,LPVOID *ppobj); extern ULONG WINAPI IDirectInputDevice2AImpl_AddRef( LPDIRECTINPUTDEVICE8A iface) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects( @@ -94,6 +106,11 @@ LPDIENUMDEVICEOBJECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) ; +extern HRESULT WINAPI IDirectInputDevice2WImpl_EnumObjects( + LPDIRECTINPUTDEVICE8W iface, + LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, + LPVOID lpvRef, + DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetProperty( LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, @@ -103,9 +120,16 @@ LPDIDEVICEOBJECTINSTANCEA pdidoi, DWORD dwObj, DWORD dwHow) ; +extern HRESULT WINAPI IDirectInputDevice2WImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface, + LPDIDEVICEOBJECTINSTANCEW pdidoi, + DWORD dwObj, + DWORD dwHow); extern HRESULT WINAPI IDirectInputDevice2AImpl_GetDeviceInfo( LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEINSTANCEA pdidi) ; +extern HRESULT WINAPI IDirectInputDevice2WImpl_GetDeviceInfo( + LPDIRECTINPUTDEVICE8W iface, + LPDIDEVICEINSTANCEW pdidi) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_RunControlPanel( LPDIRECTINPUTDEVICE8A iface, HWND hwndOwner, @@ -126,10 +150,19 @@ LPDIENUMEFFECTSCALLBACKA lpCallback, LPVOID lpvRef, DWORD dwFlags) ; +extern HRESULT WINAPI IDirectInputDevice2WImpl_EnumEffects( + LPDIRECTINPUTDEVICE8W iface, + LPDIENUMEFFECTSCALLBACKW lpCallback, + LPVOID lpvRef, + DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetEffectInfo( LPDIRECTINPUTDEVICE8A iface, LPDIEFFECTINFOA lpdei, REFGUID rguid) ; +extern HRESULT WINAPI IDirectInputDevice2WImpl_GetEffectInfo( + LPDIRECTINPUTDEVICE8W iface, + LPDIEFFECTINFOW lpdei, + REFGUID rguid) ; extern HRESULT WINAPI IDirectInputDevice2AImpl_GetForceFeedbackState( LPDIRECTINPUTDEVICE8A iface, LPDWORD pdwOut) ; @@ -157,20 +190,40 @@ LPDIENUMEFFECTSINFILECALLBACK pec, LPVOID pvRef, DWORD dwFlags) ; +extern HRESULT WINAPI IDirectInputDevice7WImpl_EnumEffectsInFile(LPDIRECTINPUTDEVICE8W iface, + LPCWSTR lpszFileName, + LPDIENUMEFFECTSINFILECALLBACK pec, + LPVOID pvRef, + DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8A iface, LPCSTR lpszFileName, DWORD dwEntries, LPDIFILEEFFECT rgDiFileEft, DWORD dwFlags) ; +extern HRESULT WINAPI IDirectInputDevice7WImpl_WriteEffectToFile(LPDIRECTINPUTDEVICE8W iface, + LPCWSTR lpszFileName, + DWORD dwEntries, + LPDIFILEEFFECT rgDiFileEft, + DWORD dwFlags) ; extern HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags); +extern HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, + LPDIACTIONFORMATW lpdiaf, + LPCWSTR lpszUserName, + DWORD dwFlags); extern HRESULT WINAPI IDirectInputDevice8AImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags); +extern HRESULT WINAPI IDirectInputDevice8WImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface, + LPDIACTIONFORMATW lpdiaf, + LPCWSTR lpszUserName, + DWORD dwFlags); extern HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo(LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader); +extern HRESULT WINAPI IDirectInputDevice8WImpl_GetImageInfo(LPDIRECTINPUTDEVICE8W iface, + LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader); #endif /* __WINE_DLLS_DINPUT_DINPUTDEVICE_PRIVATE_H */ Index: dlls/dinput/dinput.spec =================================================================== RCS file: /home/wine/wine/dlls/dinput/dinput.spec,v retrieving revision 1.12 diff -u -r1.12 dinput.spec --- dlls/dinput/dinput.spec 20 Mar 2003 03:53:15 -0000 1.12 +++ dlls/dinput/dinput.spec 9 Jun 2003 17:29:30 -0000 @@ -1,5 +1,5 @@ @ stdcall DirectInputCreateA(long long ptr ptr) -@ stub DirectInputCreateW +@ stdcall DirectInputCreateW(long long ptr ptr) @ stdcall DirectInputCreateEx(long long ptr ptr ptr) @ stdcall DllCanUnloadNow() DINPUT_DllCanUnloadNow @ stdcall DllGetClassObject(ptr ptr ptr) DINPUT_DllGetClassObject Index: dlls/dinput/dinput_main.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/dinput_main.c,v retrieving revision 1.34 diff -u -r1.34 dinput_main.c --- dlls/dinput/dinput_main.c 29 Apr 2003 22:43:48 -0000 1.34 +++ dlls/dinput/dinput_main.c 9 Jun 2003 17:29:31 -0000 @@ -34,6 +34,7 @@ #include <string.h> #include "wine/debug.h" +#include "wine/unicode.h" #include "winbase.h" #include "winuser.h" #include "winerror.h" @@ -43,7 +44,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput); static ICOM_VTABLE(IDirectInput7A) ddi7avt; +static ICOM_VTABLE(IDirectInput7W) ddi7awt; static ICOM_VTABLE(IDirectInput8A) ddi8avt; +static ICOM_VTABLE(IDirectInput8W) ddi8wvt; /* This array will be filled a dinput.so loading */ #define MAX_WINE_DINPUT_DEVICES 4 @@ -94,29 +97,50 @@ */ HRESULT WINAPI DirectInputCreateEx( HINSTANCE hinst, DWORD dwVersion, REFIID riid, LPVOID *ppDI, - LPUNKNOWN punkOuter -) { - IDirectInputAImpl* This; + LPUNKNOWN punkOuter) +{ + IDirectInputImpl* This; + + TRACE("(0x%08lx,%04lx,%s,%p,%p)\n", (DWORD)hinst,dwVersion,debugstr_guid(riid),ppDI,punkOuter); - TRACE("(0x%08lx,%04lx,%s,%p,%p)\n", - (DWORD)hinst,dwVersion,debugstr_guid(riid),ppDI,punkOuter - ); if (IsEqualGUID(&IID_IDirectInputA,riid) || IsEqualGUID(&IID_IDirectInput2A,riid) || IsEqualGUID(&IID_IDirectInput7A,riid)) { - This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl)); + This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); This->lpVtbl = &ddi7avt; This->ref = 1; + This->version = 1; *ppDI = This; return DI_OK; } + if (IsEqualGUID(&IID_IDirectInputW,riid) || + IsEqualGUID(&IID_IDirectInput2W,riid) || + IsEqualGUID(&IID_IDirectInput7W,riid)) { + This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); + This->lpVtbl = &ddi7awt; + This->ref = 1; + This->version = 1; + *ppDI = This; + + return DI_OK; + } if (IsEqualGUID(&IID_IDirectInput8A,riid)) { - This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl)); + This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); This->lpVtbl = &ddi8avt; This->ref = 1; + This->version = 8; + *ppDI = This; + + return DI_OK; + } + + if (IsEqualGUID(&IID_IDirectInput8W,riid)) { + This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); + This->lpVtbl = &ddi8wvt; + This->ref = 1; *ppDI = This; return DI_OK; @@ -130,17 +154,31 @@ */ HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter) { - IDirectInputAImpl* This; - TRACE("(0x%08lx,%04lx,%p,%p)\n", - (DWORD)hinst,dwVersion,ppDI,punkOuter - ); - This = (IDirectInputAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputAImpl)); + IDirectInputImpl* This; + TRACE("(0x%08lx,%04lx,%p,%p)\n", (DWORD)hinst,dwVersion,ppDI,punkOuter); + This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); This->lpVtbl = &ddi7avt; This->ref = 1; - *ppDI=(IDirectInputA*)This; + *ppDI = (IDirectInputA*)This; return 0; } + +/****************************************************************************** + * DirectInputCreateW (DINPUT.@) + */ +HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter) +{ + IDirectInputImpl* This; + TRACE("(0x%08lx,%04lx,%p,%p)\n", (DWORD)hinst,dwVersion,ppDI,punkOuter); + This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl)); + This->lpVtbl = &ddi7awt; + This->ref = 1; + *ppDI = (IDirectInputW*)This; + return 0; + +} + /****************************************************************************** * IDirectInputA_EnumDevices */ @@ -149,7 +187,7 @@ LPVOID pvRef, DWORD dwFlags ) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); DIDEVICEINSTANCEA devInstance; int i; @@ -157,7 +195,7 @@ for (i = 0; i < nrof_dinput_devices; i++) { devInstance.dwSize = sizeof(devInstance); - if (dinput_devices[i]->enum_device(dwDevType, dwFlags, &devInstance)) { + if (dinput_devices[i]->enum_deviceA(dwDevType, dwFlags, &devInstance, This->version)) { if (lpCallback(&devInstance,pvRef) == DIENUM_STOP) return 0; } @@ -165,11 +203,32 @@ return 0; } +/****************************************************************************** + * IDirectInputW_EnumDevices + */ +static HRESULT WINAPI IDirectInputWImpl_EnumDevices( + LPDIRECTINPUT7W iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, + LPVOID pvRef, DWORD dwFlags) +{ + ICOM_THIS(IDirectInputImpl,iface); + DIDEVICEINSTANCEW devInstance; + int i; -static HRESULT WINAPI IDirectInputAImpl_QueryInterface( - LPDIRECTINPUT7A iface,REFIID riid,LPVOID *ppobj -) { - ICOM_THIS(IDirectInputAImpl,iface); + TRACE("(this=%p,0x%04lx,%p,%p,%04lx)\n", This, dwDevType, lpCallback, pvRef, dwFlags); + + for (i = 0; i < nrof_dinput_devices; i++) { + devInstance.dwSize = sizeof(devInstance); + if (dinput_devices[i]->enum_deviceW(dwDevType, dwFlags, &devInstance, This->version)) { + if (lpCallback(&devInstance,pvRef) == DIENUM_STOP) + return 0; + } + } + + return 0; +} + +static HRESULT WINAPI IDirectInputAImpl_QueryInterface(LPDIRECTINPUT7A iface, REFIID riid, LPVOID *ppobj) { + ICOM_THIS(IDirectInputImpl,iface); TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); if (IsEqualGUID(&IID_IUnknown,riid) || @@ -184,15 +243,31 @@ return E_FAIL; } +static HRESULT WINAPI IDirectInputWImpl_QueryInterface(LPDIRECTINPUT7W iface, REFIID riid, LPVOID *ppobj) { + ICOM_THIS(IDirectInputImpl,iface); + + TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); + if (IsEqualGUID(&IID_IUnknown,riid) || + IsEqualGUID(&IID_IDirectInputW,riid) || + IsEqualGUID(&IID_IDirectInput2W,riid) || + IsEqualGUID(&IID_IDirectInput7W,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); + ICOM_THIS(IDirectInputImpl,iface); return ++(This->ref); } static ULONG WINAPI IDirectInputAImpl_Release(LPDIRECTINPUT7A iface) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); if (!(--This->ref)) { HeapFree(GetProcessHeap(),0,This); return 0; @@ -204,7 +279,7 @@ LPDIRECTINPUT7A iface,REFGUID rguid,LPDIRECTINPUTDEVICEA* pdev, LPUNKNOWN punk ) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); HRESULT ret_value = DIERR_DEVICENOTREG; int i; @@ -213,7 +288,7 @@ /* Loop on all the devices to see if anyone matches the given GUID */ for (i = 0; i < nrof_dinput_devices; i++) { HRESULT ret; - if ((ret = dinput_devices[i]->create_device(This, rguid, NULL, pdev)) == DI_OK) + if ((ret = dinput_devices[i]->create_deviceA(This, rguid, NULL, pdev)) == DI_OK) return DI_OK; if (ret == DIERR_NOINTERFACE) @@ -223,15 +298,34 @@ return ret_value; } -static HRESULT WINAPI IDirectInputAImpl_Initialize( - LPDIRECTINPUT7A iface,HINSTANCE hinst,DWORD x -) { +static HRESULT WINAPI IDirectInputWImpl_CreateDevice(LPDIRECTINPUT7A iface, + REFGUID rguid, LPDIRECTINPUTDEVICEW* pdev, LPUNKNOWN punk) { + ICOM_THIS(IDirectInputImpl,iface); + HRESULT ret_value = DIERR_DEVICENOTREG; + int i; + + TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk); + + /* Loop on all the devices to see if anyone matches the given GUID */ + for (i = 0; i < nrof_dinput_devices; i++) { + HRESULT ret; + if ((ret = dinput_devices[i]->create_deviceW(This, rguid, NULL, pdev)) == DI_OK) + return DI_OK; + + if (ret == DIERR_NOINTERFACE) + ret_value = DIERR_NOINTERFACE; + } + + return ret_value; +} + +static HRESULT WINAPI IDirectInputAImpl_Initialize(LPDIRECTINPUT7A iface, HINSTANCE hinst, DWORD x) { return DIERR_ALREADYINITIALIZED; } static HRESULT WINAPI IDirectInputAImpl_GetDeviceStatus(LPDIRECTINPUT7A iface, REFGUID rguid) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); FIXME("(%p)->(%s): stub\n",This,debugstr_guid(rguid)); @@ -241,7 +335,7 @@ static HRESULT WINAPI IDirectInputAImpl_RunControlPanel(LPDIRECTINPUT7A iface, HWND hwndOwner, DWORD dwFlags) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); FIXME("(%p)->(%08lx,%08lx): stub\n",This, (DWORD) hwndOwner, dwFlags); return DI_OK; @@ -249,16 +343,24 @@ static HRESULT WINAPI IDirectInput2AImpl_FindDevice(LPDIRECTINPUT7A iface, REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); FIXME("(%p)->(%s, %s, %p): stub\n", This, debugstr_guid(rguid), pszName, pguidInstance); return DI_OK; } +static HRESULT WINAPI IDirectInput2WImpl_FindDevice(LPDIRECTINPUT7W iface, REFGUID rguid, + LPCWSTR pszName, LPGUID pguidInstance) { + ICOM_THIS(IDirectInputImpl,iface); + FIXME("(%p)->(%s, %s, %p): stub\n", This, debugstr_guid(rguid), debugstr_w(pszName), pguidInstance); + + return DI_OK; +} + static HRESULT WINAPI IDirectInput7AImpl_CreateDeviceEx(LPDIRECTINPUT7A iface, REFGUID rguid, REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); HRESULT ret_value = DIERR_DEVICENOTREG; int i; @@ -267,7 +369,7 @@ /* Loop on all the devices to see if anyone matches the given GUID */ for (i = 0; i < nrof_dinput_devices; i++) { HRESULT ret; - if ((ret = dinput_devices[i]->create_device(This, rguid, riid, (LPDIRECTINPUTDEVICEA*) pvOut)) == DI_OK) + if ((ret = dinput_devices[i]->create_deviceA(This, rguid, riid, (LPDIRECTINPUTDEVICEA*) pvOut)) == DI_OK) return DI_OK; if (ret == DIERR_NOINTERFACE) @@ -277,10 +379,30 @@ return ret_value; } -static HRESULT WINAPI IDirectInput8AImpl_QueryInterface( - LPDIRECTINPUT8A iface,REFIID riid,LPVOID *ppobj -) { - ICOM_THIS(IDirectInputAImpl,iface); +static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, REFGUID rguid, + REFIID riid, LPVOID* pvOut, LPUNKNOWN lpUnknownOuter) +{ + ICOM_THIS(IDirectInputImpl,iface); + HRESULT ret_value = DIERR_DEVICENOTREG; + int i; + + TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter); + + /* Loop on all the devices to see if anyone matches the given GUID */ + for (i = 0; i < nrof_dinput_devices; i++) { + HRESULT ret; + if ((ret = dinput_devices[i]->create_deviceW(This, rguid, riid, (LPDIRECTINPUTDEVICEW*) pvOut)) == DI_OK) + return DI_OK; + + if (ret == DIERR_NOINTERFACE) + ret_value = DIERR_NOINTERFACE; + } + + return ret_value; +} + +static HRESULT WINAPI IDirectInput8AImpl_QueryInterface(LPDIRECTINPUT8A iface, REFIID riid, LPVOID *ppobj) { + ICOM_THIS(IDirectInputImpl,iface); TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); if (IsEqualGUID(&IID_IUnknown,riid) || @@ -290,7 +412,21 @@ return 0; } TRACE("Unsupported interface !\n"); - return E_FAIL; + return E_NOINTERFACE; +} + +static HRESULT WINAPI IDirectInput8WImpl_QueryInterface(LPDIRECTINPUT8W iface, REFIID riid, LPVOID *ppobj) { + ICOM_THIS(IDirectInputImpl,iface); + + TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); + if (IsEqualGUID(&IID_IUnknown,riid) || + IsEqualGUID(&IID_IDirectInput8W,riid)) { + IDirectInputA_AddRef(iface); + *ppobj = This; + return 0; + } + TRACE("Unsupported interface !\n"); + return E_NOINTERFACE; } static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics( @@ -299,19 +435,44 @@ LPVOID pvRef, DWORD dwFlags ) { - ICOM_THIS(IDirectInputAImpl,iface); + ICOM_THIS(IDirectInputImpl,iface); FIXME("(this=%p,%s,%p,%p,%p,%04lx): stub\n", This, ptszUserName, lpdiActionFormat, lpCallback, pvRef, dwFlags); return 0; } +static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics( + LPDIRECTINPUT8W iface, LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat, + LPDIENUMDEVICESBYSEMANTICSCBW lpCallback, + LPVOID pvRef, DWORD dwFlags +) +{ + ICOM_THIS(IDirectInputImpl,iface); + + FIXME("(this=%p,%s,%p,%p,%p,%04lx): stub\n", This, debugstr_w(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); + ICOM_THIS(IDirectInputImpl,iface); + + FIXME("(this=%p,%p,%p,%04lx,%p): stub\n", This, lpdiCallback, lpdiCDParams, + dwFlags, pvRefData); + return 0; +} + +static HRESULT WINAPI IDirectInput8WImpl_ConfigureDevices( + LPDIRECTINPUT8W iface, LPDICONFIGUREDEVICESCALLBACK lpdiCallback, + LPDICONFIGUREDEVICESPARAMSW lpdiCDParams, DWORD dwFlags, LPVOID pvRefData +) +{ + ICOM_THIS(IDirectInputImpl,iface); FIXME("(this=%p,%p,%p,%04lx,%p): stub\n", This, lpdiCallback, lpdiCDParams, dwFlags, pvRefData); @@ -335,7 +496,28 @@ XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, XCAST(Initialize)IDirectInputAImpl_Initialize, XCAST(FindDevice)IDirectInput2AImpl_FindDevice, - IDirectInput7AImpl_CreateDeviceEx + XCAST(CreateDeviceEx)IDirectInput7AImpl_CreateDeviceEx +}; + +#undef XCAST +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(ddi7awt.fun)) +#else +# define XCAST(fun) (void*) +#endif + +static ICOM_VTABLE(IDirectInput7W) ddi7awt = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + XCAST(QueryInterface)IDirectInputWImpl_QueryInterface, + XCAST(AddRef)IDirectInputAImpl_AddRef, + XCAST(Release)IDirectInputAImpl_Release, + XCAST(CreateDevice)IDirectInputWImpl_CreateDevice, + XCAST(EnumDevices)IDirectInputWImpl_EnumDevices, + XCAST(GetDeviceStatus)IDirectInputAImpl_GetDeviceStatus, + XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, + XCAST(Initialize)IDirectInputAImpl_Initialize, + XCAST(FindDevice)IDirectInput2WImpl_FindDevice, + XCAST(CreateDeviceEx)IDirectInput7WImpl_CreateDeviceEx }; #undef XCAST @@ -356,8 +538,29 @@ XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, XCAST(Initialize)IDirectInputAImpl_Initialize, XCAST(FindDevice)IDirectInput2AImpl_FindDevice, - IDirectInput8AImpl_EnumDevicesBySemantics, - IDirectInput8AImpl_ConfigureDevices + XCAST(EnumDevicesBySemantics)IDirectInput8AImpl_EnumDevicesBySemantics, + XCAST(ConfigureDevices)IDirectInput8AImpl_ConfigureDevices +}; +#undef XCAST + +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(ddi8wvt.fun)) +#else +# define XCAST(fun) (void*) +#endif +static ICOM_VTABLE(IDirectInput8W) ddi8wvt = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + XCAST(QueryInterface)IDirectInput8WImpl_QueryInterface, + XCAST(AddRef)IDirectInputAImpl_AddRef, + XCAST(Release)IDirectInputAImpl_Release, + XCAST(CreateDevice)IDirectInputWImpl_CreateDevice, + XCAST(EnumDevices)IDirectInputWImpl_EnumDevices, + XCAST(GetDeviceStatus)IDirectInputAImpl_GetDeviceStatus, + XCAST(RunControlPanel)IDirectInputAImpl_RunControlPanel, + XCAST(Initialize)IDirectInputAImpl_Initialize, + XCAST(FindDevice)IDirectInput2WImpl_FindDevice, + XCAST(EnumDevicesBySemantics)IDirectInput8WImpl_EnumDevicesBySemantics, + XCAST(ConfigureDevices)IDirectInput8WImpl_ConfigureDevices }; #undef XCAST @@ -398,7 +601,8 @@ if ( IsEqualGUID( &IID_IDirectInputA, riid ) || IsEqualGUID( &IID_IDirectInput2A, riid ) || IsEqualGUID( &IID_IDirectInput7A, riid ) || - IsEqualGUID( &IID_IDirectInput8A, riid ) ) { + IsEqualGUID( &IID_IDirectInput8A, riid ) || + IsEqualGUID( &IID_IDirectInput8W, riid ) ) { /* FIXME: reuse already created dinput if present? */ return DirectInputCreateEx(0,0,riid,ppobj,pOuter); } Index: dlls/dinput/dinput_private.h =================================================================== RCS file: /home/wine/wine/dlls/dinput/dinput_private.h,v retrieving revision 1.8 diff -u -r1.8 dinput_private.h --- dlls/dinput/dinput_private.h 11 Feb 2003 22:10:11 -0000 1.8 +++ dlls/dinput/dinput_private.h 9 Jun 2003 17:29:32 -0000 @@ -23,24 +23,28 @@ #include "dinput.h" /* Implementation specification */ -typedef struct IDirectInputAImpl IDirectInputAImpl; -struct IDirectInputAImpl +typedef struct IDirectInputImpl IDirectInputImpl; +struct IDirectInputImpl { LPVOID lpVtbl; DWORD ref; /* Used to have an unique sequence number for all the events */ DWORD evsequence; + + int version; }; /* Function called by all devices that Wine supports */ typedef struct dinput_device { INT pref; - BOOL (*enum_device)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi); - HRESULT (*create_device)(IDirectInputAImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev); + BOOL (*enum_deviceA)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version); + BOOL (*enum_deviceW)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version); + HRESULT (*create_deviceA)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev); + HRESULT (*create_deviceW)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev); } dinput_device; -extern void dinput_register_device(dinput_device *device) ; +extern void dinput_register_device(dinput_device *device); extern HINSTANCE DINPUT_instance; Index: dlls/dinput/joystick/linux.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/joystick/linux.c,v retrieving revision 1.14 diff -u -r1.14 linux.c --- dlls/dinput/joystick/linux.c 15 Mar 2003 00:12:43 -0000 1.14 +++ dlls/dinput/joystick/linux.c 9 Jun 2003 17:29:33 -0000 @@ -47,6 +47,7 @@ #define JOYDEV "/dev/js0" #include "wine/debug.h" +#include "wine/unicode.h" #include "winbase.h" #include "winerror.h" #include "windef.h" @@ -61,16 +62,17 @@ #define WINE_JOYSTICK_AXIS_BASE 0 #define WINE_JOYSTICK_BUTTON_BASE 8 -typedef struct JoystickAImpl JoystickAImpl; +typedef struct JoystickImpl JoystickImpl; static ICOM_VTABLE(IDirectInputDevice8A) JoystickAvt; -struct JoystickAImpl +static ICOM_VTABLE(IDirectInputDevice8W) JoystickWvt; +struct JoystickImpl { LPVOID lpVtbl; DWORD ref; GUID guid; /* The 'parent' DInput */ - IDirectInputAImpl *dinput; + IDirectInputImpl *dinput; /* joystick private */ int joyfd; @@ -89,7 +91,7 @@ {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7} }; -static BOOL joydev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi) +static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version) { int fd = -1; @@ -121,11 +123,43 @@ return FALSE; } -static JoystickAImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputAImpl *dinput) +static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version) { - JoystickAImpl* newDevice; + 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 ((fd = open(JOYDEV,O_RDONLY) != -1) || (errno!=ENODEV && errno!=ENOENT)) { + TRACE("Enumerating the linux Joystick device\n"); + + /* Return joystick */ + lpddi->guidInstance = GUID_Joystick; + lpddi->guidProduct = DInput_Wine_Joystick_GUID; + /* we only support traditional joysticks for now */ + lpddi->dwDevType = DIDEVTYPE_JOYSTICK | + (DIDEVTYPEJOYSTICK_TRADITIONAL<<8); - newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickAImpl)); + MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, lpddi->tszInstanceName, MAX_PATH); + /* ioctl JSIOCGNAME(len) */ + MultiByteToWideChar(CP_ACP, 0, "Wine Joystick", -1, lpddi->tszProductName, MAX_PATH); + lpddi->guidFFDriver = GUID_NULL; + if (fd != -1) + close(fd); + return TRUE; + } + } + + return FALSE; +} + +static JoystickImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputImpl *dinput) +{ + JoystickImpl* newDevice; + + newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl)); newDevice->lpVtbl = jvt; newDevice->ref = 1; newDevice->joyfd = -1; @@ -137,7 +171,7 @@ return newDevice; } -static HRESULT joydev_create_device(IDirectInputAImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) +static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) { if ((IsEqualGUID(&GUID_Joystick,rguid)) || (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) { @@ -157,10 +191,32 @@ return DIERR_DEVICENOTREG; } +static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev) +{ + if ((IsEqualGUID(&GUID_Joystick,rguid)) || + (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) { + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceW,riid) || + IsEqualGUID(&IID_IDirectInputDevice2W,riid) || + IsEqualGUID(&IID_IDirectInputDevice7W,riid) || + IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { + *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &JoystickWvt, dinput); + + TRACE("Creating a Joystick device (%p)\n", *pdev); + return DI_OK; + } else + return DIERR_NOINTERFACE; + } + + return DIERR_DEVICENOTREG; +} + static dinput_device joydev = { 10, - joydev_enum_device, - joydev_create_device + joydev_enum_deviceA, + joydev_enum_deviceW, + joydev_create_deviceA, + joydev_create_deviceW }; DECL_GLOBAL_CONSTRUCTOR(joydev_register) { dinput_register_device(&joydev); } @@ -170,7 +226,7 @@ */ static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); This->ref--; if (This->ref) @@ -195,7 +251,7 @@ LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); int i; TRACE("(this=%p,%p)\n",This,df); @@ -227,7 +283,7 @@ */ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p)\n",This); if (This->joyfd!=-1) @@ -243,7 +299,7 @@ */ static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p)\n",This); if (This->joyfd!=-1) { @@ -255,7 +311,7 @@ #define map_axis(val) ((val+32768)*(This->lMax-This->lMin)/65536+This->lMin) -static void joy_polldev(JoystickAImpl *This) { +static void joy_polldev(JoystickImpl *This) { struct timeval tv; fd_set readfds; struct js_event jse; @@ -305,7 +361,7 @@ static HRESULT WINAPI JoystickAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); joy_polldev(This); TRACE("(this=%p,0x%08lx,%p)\n",This,len,ptr); @@ -327,7 +383,7 @@ LPDWORD entries, DWORD flags ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); FIXME("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx),STUB!\n",This,dodsize,*entries,flags); @@ -348,7 +404,7 @@ REFGUID rguid, LPCDIPROPHEADER ph) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); FIXME("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph); FIXME("ph.dwSize = %ld, ph.dwHeaderSize =%ld, ph.dwObj = %ld, ph.dwHow= %ld\n",ph->dwSize, ph->dwHeaderSize,ph->dwObj,ph->dwHow); @@ -390,7 +446,7 @@ static HRESULT WINAPI JoystickAImpl_SetEventNotification( LPDIRECTINPUTDEVICE8A iface, HANDLE hnd ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd); This->hEvent = hnd; @@ -401,7 +457,7 @@ LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); BYTE axes,buttons; int xfd = This->joyfd; @@ -425,7 +481,7 @@ return DI_OK; } static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(),stub!\n"); joy_polldev(This); @@ -441,7 +497,7 @@ LPVOID lpvRef, DWORD dwFlags) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); DIDEVICEOBJECTINSTANCEA ddoi; int xfd = This->joyfd; @@ -518,13 +574,32 @@ } /****************************************************************************** + * EnumObjects : enumerate the different buttons and axis... + */ +static HRESULT WINAPI JoystickWImpl_EnumObjects( + LPDIRECTINPUTDEVICE8W iface, + LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, + LPVOID lpvRef, + DWORD dwFlags) +{ + ICOM_THIS(JoystickImpl,iface); + + device_enumobjects_AtoWcb_data data; + + data.lpCallBack = lpCallback; + data.lpvRef = lpvRef; + + return JoystickAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags); +} + +/****************************************************************************** * GetProperty : get input device properties */ static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, REFGUID rguid, LPDIPROPHEADER pdiph) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p,%s,%p): stub!\n", iface, debugstr_guid(rguid), pdiph); @@ -601,5 +676,49 @@ IDirectInputDevice8AImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; + +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(SysJoystickWvt.fun)) +#else +# define XCAST(fun) (void*) +#endif + +static ICOM_VTABLE(IDirectInputDevice8W) SysJoystickWvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectInputDevice2WImpl_QueryInterface, + XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, + XCAST(Release)JoystickAImpl_Release, + XCAST(GetCapabilities)JoystickAImpl_GetCapabilities, + JoystickWImpl_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, + IDirectInputDevice2WImpl_GetObjectInfo, + IDirectInputDevice2WImpl_GetDeviceInfo, + XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, + XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, + XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, + IDirectInputDevice2WImpl_EnumEffects, + IDirectInputDevice2WImpl_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, + IDirectInputDevice7WImpl_EnumEffectsInFile, + IDirectInputDevice7WImpl_WriteEffectToFile, + IDirectInputDevice8WImpl_BuildActionMap, + IDirectInputDevice8WImpl_SetActionMap, + IDirectInputDevice8WImpl_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.14 diff -u -r1.14 linuxinput.c --- dlls/dinput/joystick/linuxinput.c 15 Mar 2003 00:12:43 -0000 1.14 +++ dlls/dinput/joystick/linuxinput.c 9 Jun 2003 17:29:34 -0000 @@ -53,6 +53,7 @@ #define EVDEVPREFIX "/dev/input/event" #include "wine/debug.h" +#include "wine/unicode.h" #include "winbase.h" #include "winerror.h" #include "windef.h" @@ -67,9 +68,10 @@ #define WINE_JOYSTICK_AXIS_BASE 0 #define WINE_JOYSTICK_BUTTON_BASE 8 -typedef struct JoystickAImpl JoystickAImpl; +typedef struct JoystickImpl JoystickImpl; static ICOM_VTABLE(IDirectInputDevice8A) JoystickAvt; -struct JoystickAImpl +static ICOM_VTABLE(IDirectInputDevice8W) JoystickWvt; +struct JoystickImpl { LPVOID lpVtbl; DWORD ref; @@ -77,7 +79,7 @@ /* The 'parent' DInput */ - IDirectInputAImpl *dinput; + IDirectInputImpl *dinput; /* joystick private */ /* what range and deadzone the game wants */ @@ -122,15 +124,10 @@ #define test_bit(arr,bit) (((BYTE*)arr)[bit>>3]&(1<<(bit&7))) -static BOOL joydev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi) +static int joydev_have(void) { - int i, fd, havejoy = 0; - - if ((dwDevType != 0) && (GET_DIDEVICE_TYPE(dwDevType) != DIDEVTYPE_JOYSTICK)) - return FALSE; - - if (dwFlags & DIEDFL_FORCEFEEDBACK) - return FALSE; + int i, fd; + int havejoy = 0; for (i=0;i<64;i++) { char buf[200]; @@ -164,6 +161,20 @@ if (havejoy || (errno==ENODEV)) break; } + return havejoy; +} + +static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version) +{ + int havejoy = 0; + + if ((dwDevType != 0) && (GET_DIDEVICE_TYPE(dwDevType) != DIDEVTYPE_JOYSTICK)) + return FALSE; + + if (dwFlags & DIEDFL_FORCEFEEDBACK) + return FALSE; + + havejoy = joydev_have(); if (!havejoy) return FALSE; @@ -175,21 +186,50 @@ lpddi->guidProduct = DInput_Wine_Joystick_GUID; lpddi->guidFFDriver = GUID_NULL; - lpddi->dwDevType = DIDEVTYPE_JOYSTICK | - (DIDEVTYPEJOYSTICK_TRADITIONAL<<8); + lpddi->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL<<8); - strcpy(lpddi->tszInstanceName, "Joystick"); + strcpy(lpddi->tszInstanceName, "Joystick"); /* ioctl JSIOCGNAME(len) */ strcpy(lpddi->tszProductName, "Wine Joystick"); return TRUE; } -static JoystickAImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputAImpl *dinput) +static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version) +{ + int havejoy = 0; + + if ((dwDevType != 0) && (GET_DIDEVICE_TYPE(dwDevType) != DIDEVTYPE_JOYSTICK)) + return FALSE; + + if (dwFlags & DIEDFL_FORCEFEEDBACK) + return FALSE; + + havejoy = joydev_have(); + + if (!havejoy) + return FALSE; + + 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); + + MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, lpddi->tszInstanceName, MAX_PATH); + /* ioctl JSIOCGNAME(len) */ + MultiByteToWideChar(CP_ACP, 0, "Wine Joystick", -1, lpddi->tszProductName, MAX_PATH); + return TRUE; +} + +static JoystickImpl *alloc_device(REFGUID rguid, LPVOID jvt, IDirectInputImpl *dinput) { - JoystickAImpl* newDevice; + JoystickImpl* newDevice; int i; - newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickAImpl)); + newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl)); newDevice->lpVtbl = jvt; newDevice->ref = 1; newDevice->joyfd = -1; @@ -203,42 +243,11 @@ return newDevice; } -static HRESULT joydev_create_device(IDirectInputAImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) +static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) { - int i, fd, havejoy = 0; + int havejoy = 0; - for (i=0;i<64;i++) { - char buf[200]; - BYTE absbits[(ABS_MAX+7)/8],keybits[(KEY_MAX+7)/8]; - - sprintf(buf,EVDEVPREFIX"%d",i); - if (-1!=(fd=open(buf,O_RDONLY))) { - if (-1==ioctl(fd,EVIOCGBIT(EV_ABS,sizeof(absbits)),absbits)) { - perror("EVIOCGBIT EV_ABS"); - close(fd); - continue; - } - if (-1==ioctl(fd,EVIOCGBIT(EV_KEY,sizeof(keybits)),keybits)) { - perror("EVIOCGBIT EV_KEY"); - close(fd); - continue; - } - /* A true joystick has at least axis X and Y, and at least 1 - * button. copied from linux/drivers/input/joydev.c */ - if (test_bit(absbits,ABS_X) && test_bit(absbits,ABS_Y) && - ( test_bit(keybits,BTN_TRIGGER) || - test_bit(keybits,BTN_A) || - test_bit(keybits,BTN_1) - ) - ) { - FIXME("found a joystick at %s!\n",buf); - havejoy = 1; - } - close(fd); - } - if (havejoy || (errno==ENODEV)) - break; - } + havejoy = joydev_have(); if (!havejoy) return DIERR_DEVICENOTREG; @@ -250,7 +259,34 @@ IsEqualGUID(&IID_IDirectInputDevice2A,riid) || IsEqualGUID(&IID_IDirectInputDevice7A,riid) || IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { - *pdev=(IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput); + *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput); + TRACE("Creating a Joystick device (%p)\n", *pdev); + return DI_OK; + } else + return DIERR_NOINTERFACE; + } + + return DIERR_DEVICENOTREG; +} + + +static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev) +{ + int havejoy = 0; + + havejoy = joydev_have(); + + if (!havejoy) + return DIERR_DEVICENOTREG; + + if ((IsEqualGUID(&GUID_Joystick,rguid)) || + (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) { + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceW,riid) || + IsEqualGUID(&IID_IDirectInputDevice2W,riid) || + IsEqualGUID(&IID_IDirectInputDevice7W,riid) || + IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { + *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &JoystickWvt, dinput); TRACE("Creating a Joystick device (%p)\n", *pdev); return DI_OK; } else @@ -262,8 +298,10 @@ static dinput_device joydev = { 20, - joydev_enum_device, - joydev_create_device + joydev_enum_deviceA, + joydev_enum_deviceW, + joydev_create_deviceA, + joydev_create_deviceW }; DECL_GLOBAL_CONSTRUCTOR(joydev_register) { dinput_register_device(&joydev); } @@ -273,7 +311,7 @@ */ static ULONG WINAPI JoystickAImpl_Release(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); This->ref--; if (This->ref) @@ -298,7 +336,7 @@ LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); int i; TRACE("(this=%p,%p)\n",This,df); @@ -331,7 +369,7 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { int i; - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); char buf[200]; TRACE("(this=%p)\n",This); @@ -387,7 +425,7 @@ */ static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p)\n",This); if (This->joyfd!=-1) { @@ -403,7 +441,7 @@ * adapts values accordingly. */ static int -map_axis(JoystickAImpl* This, int axis, int val) { +map_axis(JoystickImpl* This, int axis, int val) { int xmid = This->axes[axis][AXE_ABS]; int xmin = This->axes[axis][AXE_ABSMIN]; int xmax = This->axes[axis][AXE_ABSMAX]; @@ -436,7 +474,7 @@ return ret; } -static void joy_polldev(JoystickAImpl *This) { +static void joy_polldev(JoystickImpl *This) { struct timeval tv; fd_set readfds; struct input_event ie; @@ -515,7 +553,7 @@ static HRESULT WINAPI JoystickAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); joy_polldev(This); @@ -538,7 +576,7 @@ LPDWORD entries, DWORD flags ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); FIXME("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx),STUB!\n",This,dodsize,*entries,flags); @@ -559,7 +597,7 @@ REFGUID rguid, LPCDIPROPHEADER ph) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); FIXME("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph); FIXME("ph.dwSize = %ld, ph.dwHeaderSize =%ld, ph.dwObj = %ld, ph.dwHow= %ld\n",ph->dwSize, ph->dwHeaderSize,ph->dwObj,ph->dwHow); @@ -612,7 +650,7 @@ static HRESULT WINAPI JoystickAImpl_SetEventNotification( LPDIRECTINPUTDEVICE8A iface, HANDLE hnd ) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd); This->hEvent = hnd; @@ -623,7 +661,7 @@ LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); int xfd = This->joyfd; int i,axes,buttons; int wasacquired = 1; @@ -653,7 +691,7 @@ } static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(),stub!\n"); joy_polldev(This); @@ -669,7 +707,7 @@ LPVOID lpvRef, DWORD dwFlags) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); DIDEVICEOBJECTINSTANCEA ddoi; int xfd = This->joyfd; @@ -825,6 +863,21 @@ return DI_OK; } +static HRESULT WINAPI JoystickWImpl_EnumObjects(LPDIRECTINPUTDEVICE8W iface, + LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, + LPVOID lpvRef, + DWORD dwFlags) +{ + ICOM_THIS(JoystickImpl,iface); + + device_enumobjects_AtoWcb_data data; + + data.lpCallBack = lpCallback; + data.lpvRef = lpvRef; + + return JoystickAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags); +} + /****************************************************************************** * GetProperty : get input device properties */ @@ -832,7 +885,7 @@ REFGUID rguid, LPDIPROPHEADER pdiph) { - ICOM_THIS(JoystickAImpl,iface); + ICOM_THIS(JoystickImpl,iface); TRACE("(this=%p,%s,%p): stub!\n", iface, debugstr_guid(rguid), pdiph); @@ -907,6 +960,50 @@ IDirectInputDevice8AImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; + +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(JoystickWvt.fun)) +#else +# define XCAST(fun) (void*) +#endif + +static ICOM_VTABLE(IDirectInputDevice8W) JoystickWvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectInputDevice2WImpl_QueryInterface, + XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, + XCAST(Release)JoystickAImpl_Release, + XCAST(GetCapabilities)JoystickAImpl_GetCapabilities, + JoystickWImpl_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, + IDirectInputDevice2WImpl_GetObjectInfo, + IDirectInputDevice2WImpl_GetDeviceInfo, + XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, + XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, + XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, + IDirectInputDevice2WImpl_EnumEffects, + IDirectInputDevice2WImpl_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, + IDirectInputDevice7WImpl_EnumEffectsInFile, + IDirectInputDevice7WImpl_WriteEffectToFile, + IDirectInputDevice8WImpl_BuildActionMap, + IDirectInputDevice8WImpl_SetActionMap, + IDirectInputDevice8WImpl_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.23 diff -u -r1.23 main.c --- dlls/dinput/keyboard/main.c 4 Jun 2003 20:11:56 -0000 1.23 +++ dlls/dinput/keyboard/main.c 9 Jun 2003 17:29:36 -0000 @@ -31,19 +31,21 @@ #include "dinput_private.h" #include "device_private.h" #include "wine/debug.h" +#include "wine/unicode.h" WINE_DEFAULT_DEBUG_CHANNEL(dinput); static ICOM_VTABLE(IDirectInputDevice8A) SysKeyboardAvt; +static ICOM_VTABLE(IDirectInputDevice8W) SysKeyboardWvt; -typedef struct SysKeyboardAImpl SysKeyboardAImpl; -struct SysKeyboardAImpl +typedef struct SysKeyboardImpl SysKeyboardImpl; +struct SysKeyboardImpl { LPVOID lpVtbl; DWORD ref; GUID guid; - IDirectInputAImpl *dinput; + IDirectInputImpl* dinput; HANDLE hEvent; /* SysKeyboardAImpl */ @@ -61,7 +63,7 @@ CRITICAL_SECTION crit; }; -SysKeyboardAImpl *current; /* Today's acquired device +SysKeyboardImpl *current; /* Today's acquired device FIXME: currently this can be only one. Maybe this should be a linked list or st. I don't know what the rules are for multiple acquired keyboards, @@ -117,7 +119,7 @@ if (current->count == current->buffersize) { - current->start++; + current->start = ++current->start % current->buffersize; current->overflow = TRUE; } else @@ -138,7 +140,7 @@ {0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41} }; -static void fill_keyboard_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi) { +static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, int version) { DWORD dwSize; DIDEVICEINSTANCEA ddi; @@ -152,19 +154,63 @@ ddi.dwSize = dwSize; ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */ ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */ - ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8); + if (version >= 8) + ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8); + else + ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8); strcpy(ddi.tszInstanceName, "Keyboard"); strcpy(ddi.tszProductName, "Wine Keyboard"); memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi))); } -static BOOL keyboarddev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi) +static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, int version) { + DWORD dwSize; + DIDEVICEINSTANCEW ddi; + + dwSize = lpddi->dwSize; + + TRACE("%ld %p\n", dwSize, lpddi); + + memset(lpddi, 0, dwSize); + memset(&ddi, 0, sizeof(ddi)); + + ddi.dwSize = dwSize; + ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */ + ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */ + if (version >= 8) + ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8); + else + ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8); + MultiByteToWideChar(CP_ACP, 0, "Keyboard", -1, ddi.tszInstanceName, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, "Wine Keyboard", -1, ddi.tszProductName, MAX_PATH); + + memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi))); +} + +static BOOL keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version) +{ + if ((dwDevType == 0) || + ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 8)) || + ((dwDevType == DI8DEVTYPE_KEYBOARD) && (version >= 8))) { + TRACE("Enumerating the Keyboard device\n"); + + fill_keyboard_dideviceinstanceA(lpddi, version); + + return TRUE; + } + + return FALSE; +} + +static BOOL keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version) { - if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_KEYBOARD)) { + if ((dwDevType == 0) || + ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 8)) || + ((dwDevType == DI8DEVTYPE_KEYBOARD) && (version >= 8))) { TRACE("Enumerating the Keyboard device\n"); - fill_keyboard_dideviceinstancea(lpddi); + fill_keyboard_dideviceinstanceW(lpddi, version); return TRUE; } @@ -172,10 +218,10 @@ return FALSE; } -static SysKeyboardAImpl *alloc_device(REFGUID rguid, LPVOID kvt, IDirectInputAImpl *dinput) +static SysKeyboardImpl *alloc_device(REFGUID rguid, LPVOID kvt, IDirectInputImpl *dinput) { - SysKeyboardAImpl* newDevice; - newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardAImpl)); + SysKeyboardImpl* newDevice; + newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardImpl)); newDevice->lpVtbl = kvt; newDevice->ref = 1; memcpy(&(newDevice->guid),rguid,sizeof(*rguid)); @@ -190,7 +236,7 @@ } -static HRESULT keyboarddev_create_device(IDirectInputAImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) +static HRESULT keyboarddev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) { if ((IsEqualGUID(&GUID_SysKeyboard,rguid)) || /* Generic Keyboard */ (IsEqualGUID(&DInput_Wine_Keyboard_GUID,rguid))) { /* Wine Keyboard */ @@ -199,27 +245,46 @@ IsEqualGUID(&IID_IDirectInputDevice2A,riid) || IsEqualGUID(&IID_IDirectInputDevice7A,riid) || IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { - *pdev=(IDirectInputDeviceA*) alloc_device(rguid, &SysKeyboardAvt, dinput); + *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysKeyboardAvt, dinput); TRACE("Creating a Keyboard device (%p)\n", *pdev); return DI_OK; } else return DIERR_NOINTERFACE; } + return DIERR_DEVICENOTREG; +} +static HRESULT keyboarddev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev) +{ + if ((IsEqualGUID(&GUID_SysKeyboard,rguid)) || /* Generic Keyboard */ + (IsEqualGUID(&DInput_Wine_Keyboard_GUID,rguid))) { /* Wine Keyboard */ + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceW,riid) || + IsEqualGUID(&IID_IDirectInputDevice2W,riid) || + IsEqualGUID(&IID_IDirectInputDevice7W,riid) || + IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { + *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysKeyboardWvt, dinput); + TRACE("Creating a Keyboard device (%p)\n", *pdev); + return DI_OK; + } else + return DIERR_NOINTERFACE; + } return DIERR_DEVICENOTREG; } static dinput_device keyboarddev = { 100, - keyboarddev_enum_device, - keyboarddev_create_device + keyboarddev_enum_deviceA, + keyboarddev_enum_deviceW, + keyboarddev_create_deviceA, + keyboarddev_create_deviceW }; DECL_GLOBAL_CONSTRUCTOR(keyboarddev_register) { dinput_register_device(&keyboarddev); } static ULONG WINAPI SysKeyboardAImpl_Release(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); This->ref--; if (This->ref) @@ -239,14 +304,14 @@ DeleteCriticalSection(&(This->crit)); HeapFree(GetProcessHeap(),0,This); - return 0; + return DI_OK; } static HRESULT WINAPI SysKeyboardAImpl_SetProperty( LPDIRECTINPUTDEVICE8A iface,REFGUID rguid,LPCDIPROPHEADER ph ) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph); TRACE("(size=%ld,headersize=%ld,obj=%ld,how=%ld\n", @@ -270,13 +335,15 @@ break; } } - return 0; + return DI_OK; } static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { + TRACE("(%p)->(%ld,%p)\n", iface, len, ptr); + /* Note: device does not need to be acquired */ if (len != 256) return DIERR_INVALIDPARAM; @@ -292,7 +359,7 @@ LPDWORD entries,DWORD flags ) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); int ret = DI_OK, i = 0; TRACE("(this=%p,%ld,%p,%p(%ld)),0x%08lx)\n", @@ -353,7 +420,7 @@ LPVOID lpvRef, DWORD dwFlags) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); DIDEVICEOBJECTINSTANCEA ddoi; int i; @@ -381,11 +448,26 @@ return DI_OK; } +static HRESULT WINAPI SysKeyboardWImpl_EnumObjects(LPDIRECTINPUTDEVICE8W iface, + LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, + LPVOID lpvRef, + DWORD dwFlags) +{ + ICOM_THIS(SysKeyboardImpl,iface); + + device_enumobjects_AtoWcb_data data; + + data.lpCallBack = lpCallback; + data.lpvRef = lpvRef; + + return SysKeyboardAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags); +} + static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface); static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); TRACE("(this=%p)\n",This); @@ -419,7 +501,7 @@ static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); TRACE("(this=%p)\n",This); if (This->acquired == 0) @@ -444,7 +526,7 @@ static HRESULT WINAPI SysKeyboardAImpl_SetEventNotification(LPDIRECTINPUTDEVICE8A iface, HANDLE hnd) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd); @@ -459,13 +541,16 @@ LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); TRACE("(this=%p,%p)\n",This,lpDIDevCaps); if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) { lpDIDevCaps->dwFlags = DIDC_ATTACHED; - lpDIDevCaps->dwDevType = DIDEVTYPE_KEYBOARD; + if (This->dinput->version >= 8) + lpDIDevCaps->dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8); + else + lpDIDevCaps->dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8); lpDIDevCaps->dwAxes = 0; lpDIDevCaps->dwButtons = 256; lpDIDevCaps->dwPOVs = 0; @@ -493,7 +578,7 @@ DWORD dwObj, DWORD dwHow) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); DIDEVICEOBJECTINSTANCEA ddoi; DWORD dwSize = pdidoi->dwSize; @@ -521,6 +606,39 @@ return DI_OK; } +static HRESULT WINAPI SysKeyboardWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface, + LPDIDEVICEOBJECTINSTANCEW pdidoi, + DWORD dwObj, + DWORD dwHow) +{ + ICOM_THIS(SysKeyboardImpl,iface); + DIDEVICEOBJECTINSTANCEW ddoi; + DWORD dwSize = pdidoi->dwSize; + + TRACE("(this=%p,%p,%ld,0x%08lx)\n", This, pdidoi, dwObj, dwHow); + + if (dwHow == DIPH_BYID) { + WARN(" querying by id not supported yet...\n"); + return DI_OK; + } + + memset(pdidoi, 0, dwSize); + memset(&ddoi, 0, sizeof(ddoi)); + + ddoi.dwSize = dwSize; + ddoi.guidType = GUID_Key; + ddoi.dwOfs = dwObj; + ddoi.dwType = DIDFT_MAKEINSTANCE(dwObj) | DIDFT_BUTTON; + GetKeyNameTextW(((dwObj & 0x7f) << 16) | ((dwObj & 0x80) << 17), ddoi.tszName, sizeof(ddoi.tszName)); + + /* And return our just filled device object instance structure */ + memcpy(pdidoi, &ddoi, (dwSize < sizeof(ddoi) ? dwSize : sizeof(ddoi))); + + _dump_OBJECTINSTANCEW(pdidoi); + + return DI_OK; +} + /****************************************************************************** * GetDeviceInfo : get information about a device's identity */ @@ -528,7 +646,7 @@ LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEINSTANCEA pdidi) { - ICOM_THIS(SysKeyboardAImpl,iface); + ICOM_THIS(SysKeyboardImpl,iface); TRACE("(this=%p,%p)\n", This, pdidi); if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEA)) { @@ -536,7 +654,22 @@ return DI_OK; } - fill_keyboard_dideviceinstancea(pdidi); + fill_keyboard_dideviceinstanceA(pdidi, This->dinput->version); + + return DI_OK; +} + +static HRESULT WINAPI SysKeyboardWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEINSTANCEW pdidi) +{ + ICOM_THIS(SysKeyboardImpl,iface); + TRACE("(this=%p,%p)\n", This, pdidi); + + if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEW)) { + WARN(" dinput3 not supporte yet...\n"); + return DI_OK; + } + + fill_keyboard_dideviceinstanceW(pdidi, This->dinput->version); return DI_OK; } @@ -578,3 +711,47 @@ IDirectInputDevice8AImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; + +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(SysKeyboardWvt.fun)) +#else +# define XCAST(fun) (void*) +#endif + +static ICOM_VTABLE(IDirectInputDevice8W) SysKeyboardWvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectInputDevice2WImpl_QueryInterface, + XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, + XCAST(Release)SysKeyboardAImpl_Release, + XCAST(GetCapabilities)SysKeyboardAImpl_GetCapabilities, + SysKeyboardWImpl_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, + SysKeyboardWImpl_GetObjectInfo, + SysKeyboardWImpl_GetDeviceInfo, + XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, + XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, + XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, + IDirectInputDevice2WImpl_EnumEffects, + IDirectInputDevice2WImpl_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, + IDirectInputDevice7WImpl_EnumEffectsInFile, + IDirectInputDevice7WImpl_WriteEffectToFile, + IDirectInputDevice8WImpl_BuildActionMap, + IDirectInputDevice8WImpl_SetActionMap, + IDirectInputDevice8WImpl_GetImageInfo +}; +#undef XCAST Index: dlls/dinput/mouse/main.c =================================================================== RCS file: /home/wine/wine/dlls/dinput/mouse/main.c,v retrieving revision 1.22 diff -u -r1.22 main.c --- dlls/dinput/mouse/main.c 7 Jun 2003 00:36:51 -0000 1.22 +++ dlls/dinput/mouse/main.c 9 Jun 2003 17:29:38 -0000 @@ -33,6 +33,7 @@ #include "dinput_private.h" #include "device_private.h" #include "wine/debug.h" +#include "wine/unicode.h" #define MOUSE_HACK @@ -92,7 +93,9 @@ }; static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt; -typedef struct SysMouseAImpl SysMouseAImpl; +static ICOM_VTABLE(IDirectInputDevice8W) SysMouseWvt; + +typedef struct SysMouseImpl SysMouseImpl; typedef enum { WARP_NEEDED, /* Warping is needed */ @@ -100,13 +103,13 @@ WARP_DONE /* Warping has been done */ } WARP_STATUS; -struct SysMouseAImpl +struct SysMouseImpl { LPVOID lpVtbl; DWORD ref; GUID guid; - IDirectInputAImpl *dinput; + IDirectInputImpl *dinput; /* The current data format and the conversion between internal and external data formats */ @@ -146,7 +149,7 @@ {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7} }; -static void fill_mouse_dideviceinstancea(LPDIDEVICEINSTANCEA lpddi) { +static void fill_mouse_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, int version) { DWORD dwSize; DIDEVICEINSTANCEA ddi; @@ -160,19 +163,48 @@ ddi.dwSize = dwSize; ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */ ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */ - ddi.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_UNKNOWN << 8); + if (version >= 8) + ddi.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8); + else + ddi.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8); strcpy(ddi.tszInstanceName, "Mouse"); strcpy(ddi.tszProductName, "Wine Mouse"); memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi))); } -static BOOL mousedev_enum_device(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi) +static void fill_mouse_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, int version) { + DWORD dwSize; + DIDEVICEINSTANCEW ddi; + + dwSize = lpddi->dwSize; + + TRACE("%ld %p\n", dwSize, lpddi); + + memset(lpddi, 0, dwSize); + memset(&ddi, 0, sizeof(ddi)); + + ddi.dwSize = dwSize; + ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */ + ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */ + if (version >= 8) + ddi.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8); + else + ddi.dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8); + MultiByteToWideChar(CP_ACP, 0, "Mouse", -1, ddi.tszInstanceName, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, "Wine Mouse", -1, ddi.tszProductName, MAX_PATH); + + memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi))); +} + +static BOOL mousedev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version) { - if ((dwDevType == 0) || (dwDevType == DIDEVTYPE_MOUSE)) { + if ((dwDevType == 0) || + ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) || + ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) { TRACE("Enumerating the mouse device\n"); - fill_mouse_dideviceinstancea(lpddi); + fill_mouse_dideviceinstanceA(lpddi, version); return TRUE; } @@ -180,7 +212,22 @@ return FALSE; } -static SysMouseAImpl *alloc_device(REFGUID rguid, LPVOID mvt, IDirectInputAImpl *dinput) +static BOOL mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version) +{ + if ((dwDevType == 0) || + ((dwDevType == DIDEVTYPE_MOUSE) && (version < 8)) || + ((dwDevType == DI8DEVTYPE_MOUSE) && (version >= 8))) { + TRACE("Enumerating the mouse device\n"); + + fill_mouse_dideviceinstanceW(lpddi, version); + + return TRUE; + } + + return FALSE; +} + +static SysMouseImpl *alloc_device(REFGUID rguid, LPVOID mvt, IDirectInputImpl *dinput) { int offset_array[WINE_INTERNALMOUSE_NUM_OBJS] = { FIELD_OFFSET(Wine_InternalMouseData, lX), @@ -190,8 +237,8 @@ FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 1, FIELD_OFFSET(Wine_InternalMouseData, rgbButtons) + 2 }; - SysMouseAImpl* newDevice; - newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseAImpl)); + SysMouseImpl* newDevice; + newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl)); newDevice->ref = 1; newDevice->lpVtbl = mvt; InitializeCriticalSection(&(newDevice->crit)); @@ -209,7 +256,7 @@ return newDevice; } -static HRESULT mousedev_create_device(IDirectInputAImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) +static HRESULT mousedev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev) { if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */ (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */ @@ -218,7 +265,7 @@ IsEqualGUID(&IID_IDirectInputDevice2A,riid) || IsEqualGUID(&IID_IDirectInputDevice7A,riid) || IsEqualGUID(&IID_IDirectInputDevice8A,riid)) { - *pdev=(IDirectInputDeviceA*) alloc_device(rguid, &SysMouseAvt, dinput); + *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysMouseAvt, dinput); TRACE("Creating a Mouse device (%p)\n", *pdev); return DI_OK; } else @@ -228,10 +275,30 @@ return DIERR_DEVICENOTREG; } +static HRESULT mousedev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev) +{ + if ((IsEqualGUID(&GUID_SysMouse,rguid)) || /* Generic Mouse */ + (IsEqualGUID(&DInput_Wine_Mouse_GUID,rguid))) { /* Wine Mouse */ + if ((riid == NULL) || + IsEqualGUID(&IID_IDirectInputDeviceW,riid) || + IsEqualGUID(&IID_IDirectInputDevice2W,riid) || + IsEqualGUID(&IID_IDirectInputDevice7W,riid) || + IsEqualGUID(&IID_IDirectInputDevice8W,riid)) { + *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysMouseWvt, dinput); + TRACE("Creating a Mouse device (%p)\n", *pdev); + return DI_OK; + } else + return DIERR_NOINTERFACE; + } + + return DIERR_DEVICENOTREG; +} static dinput_device mousedev = { 100, - mousedev_enum_device, - mousedev_create_device + mousedev_enum_deviceA, + mousedev_enum_deviceW, + mousedev_create_deviceA, + mousedev_create_deviceW }; DECL_GLOBAL_CONSTRUCTOR(mousedev_register) { dinput_register_device(&mousedev); } @@ -245,7 +312,7 @@ */ static ULONG WINAPI SysMouseAImpl_Release(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); This->ref--; if (This->ref) @@ -269,7 +336,7 @@ } HeapFree(GetProcessHeap(),0,This); - return 0; + return DI_OK; } @@ -281,7 +348,7 @@ LPDIRECTINPUTDEVICE8A iface,HWND hwnd,DWORD dwflags ) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); TRACE("(this=%p,0x%08lx,0x%08lx)\n",This,(DWORD)hwnd,dwflags); @@ -296,7 +363,7 @@ This->win = hwnd; This->dwCoopLevel = dwflags; - return 0; + return DI_OK; } @@ -311,7 +378,7 @@ LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); int i; TRACE("(this=%p,%p)\n",This,df); @@ -344,7 +411,7 @@ /* Prepare all the data-conversion filters */ This->wine_df = create_DataFormat(&(Wine_InternalMouseFormat), df, This->offset_array); - return 0; + return DI_OK; } /* low-level mouse hook */ @@ -352,7 +419,7 @@ { LRESULT ret; MSLLHOOKSTRUCT *hook = (MSLLHOOKSTRUCT *)lparam; - SysMouseAImpl* This = (SysMouseAImpl*) current_lock; + SysMouseImpl* This = (SysMouseImpl*) current_lock; DWORD dwCoop; static long last_event = 0; int wdata; @@ -484,7 +551,7 @@ } -static void dinput_window_check(SysMouseAImpl* This) +static void dinput_window_check(SysMouseImpl* This) { RECT rect; DWORD centerX, centerY; @@ -508,7 +575,7 @@ */ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); RECT rect; TRACE("(this=%p)\n",This); @@ -570,7 +637,7 @@ */ static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); TRACE("(this=%p)\n",This); @@ -605,7 +672,7 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceState( LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr ) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); EnterCriticalSection(&(This->crit)); TRACE("(this=%p,0x%08lx,%p): \n",This,len,ptr); @@ -639,7 +706,7 @@ This->m_state.lX, This->m_state.lY, This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]); - return 0; + return DI_OK; } /****************************************************************************** @@ -651,7 +718,7 @@ LPDWORD entries, DWORD flags ) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); DWORD len, nqtail; TRACE("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx)\n",This,dodsize,*entries,flags); @@ -716,7 +783,7 @@ This->need_warp = WARP_STARTED; #endif } - return 0; + return DI_OK; } /****************************************************************************** @@ -726,7 +793,7 @@ REFGUID rguid, LPCDIPROPHEADER ph) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph); @@ -756,7 +823,7 @@ } } - return 0; + return DI_OK; } /****************************************************************************** @@ -766,7 +833,7 @@ REFGUID rguid, LPDIPROPHEADER pdiph) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); TRACE("(this=%p,%s,%p): stub!\n", iface, debugstr_guid(rguid), pdiph); @@ -826,7 +893,7 @@ */ static HRESULT WINAPI SysMouseAImpl_SetEventNotification(LPDIRECTINPUTDEVICE8A iface, HANDLE hnd) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); TRACE("(this=%p,0x%08lx)\n",This,(DWORD)hnd); @@ -842,13 +909,16 @@ LPDIRECTINPUTDEVICE8A iface, LPDIDEVCAPS lpDIDevCaps) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); TRACE("(this=%p,%p)\n",This,lpDIDevCaps); if (lpDIDevCaps->dwSize == sizeof(DIDEVCAPS)) { lpDIDevCaps->dwFlags = DIDC_ATTACHED; - lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE; + if (This->dinput->version >= 8) + lpDIDevCaps->dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8); + else + lpDIDevCaps->dwDevType = DIDEVTYPE_MOUSE | (DIDEVTYPEMOUSE_TRADITIONAL << 8); lpDIDevCaps->dwAxes = 3; lpDIDevCaps->dwButtons = 3; lpDIDevCaps->dwPOVs = 0; @@ -875,7 +945,7 @@ LPVOID lpvRef, DWORD dwFlags) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); DIDEVICEOBJECTINSTANCEA ddoi; TRACE("(this=%p,%p,%p,%08lx)\n", This, lpCallback, lpvRef, dwFlags); @@ -946,6 +1016,19 @@ return DI_OK; } +static HRESULT WINAPI SysMouseWImpl_EnumObjects(LPDIRECTINPUTDEVICE8W iface, LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID lpvRef,DWORD dwFlags) +{ + ICOM_THIS(SysMouseImpl,iface); + + device_enumobjects_AtoWcb_data data; + + data.lpCallBack = lpCallback; + data.lpvRef = lpvRef; + + return SysMouseAImpl_EnumObjects((LPDIRECTINPUTDEVICE8A) This, (LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW, (LPVOID) &data, dwFlags); +} + + /****************************************************************************** * GetDeviceInfo : get information about a device's identity */ @@ -953,7 +1036,7 @@ LPDIRECTINPUTDEVICE8A iface, LPDIDEVICEINSTANCEA pdidi) { - ICOM_THIS(SysMouseAImpl,iface); + ICOM_THIS(SysMouseImpl,iface); TRACE("(this=%p,%p)\n", This, pdidi); if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEA)) { @@ -961,11 +1044,27 @@ return DI_OK; } - fill_mouse_dideviceinstancea(pdidi); + fill_mouse_dideviceinstanceA(pdidi, This->dinput->version); return DI_OK; } +static HRESULT WINAPI SysMouseWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface, LPDIDEVICEINSTANCEW pdidi) +{ + ICOM_THIS(SysMouseImpl,iface); + TRACE("(this=%p,%p)\n", This, pdidi); + + if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEW)) { + WARN(" dinput3 not supporte yet...\n"); + return DI_OK; + } + + fill_mouse_dideviceinstanceW(pdidi, This->dinput->version); + + return DI_OK; +} + + static ICOM_VTABLE(IDirectInputDevice8A) SysMouseAvt = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE @@ -1002,3 +1101,47 @@ IDirectInputDevice8AImpl_SetActionMap, IDirectInputDevice8AImpl_GetImageInfo }; + +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(SysMouseWvt.fun)) +#else +# define XCAST(fun) (void*) +#endif + +static ICOM_VTABLE(IDirectInputDevice8W) SysMouseWvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectInputDevice2WImpl_QueryInterface, + XCAST(AddRef)IDirectInputDevice2AImpl_AddRef, + XCAST(Release)SysMouseAImpl_Release, + XCAST(GetCapabilities)SysMouseAImpl_GetCapabilities, + SysMouseWImpl_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, + IDirectInputDevice2WImpl_GetObjectInfo, + SysMouseWImpl_GetDeviceInfo, + XCAST(RunControlPanel)IDirectInputDevice2AImpl_RunControlPanel, + XCAST(Initialize)IDirectInputDevice2AImpl_Initialize, + XCAST(CreateEffect)IDirectInputDevice2AImpl_CreateEffect, + IDirectInputDevice2WImpl_EnumEffects, + IDirectInputDevice2WImpl_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, + IDirectInputDevice7WImpl_EnumEffectsInFile, + IDirectInputDevice7WImpl_WriteEffectToFile, + IDirectInputDevice8WImpl_BuildActionMap, + IDirectInputDevice8WImpl_SetActionMap, + IDirectInputDevice8WImpl_GetImageInfo +}; +#undef XCAST