ReWind port of DirectInput patch

Lionel Ulmer lionel.ulmer at free.fr
Mon Jun 10 14:47:57 CDT 2002


Hi all,

Here is my first ReWind backport.

You will need to create a dlls/dinput8 directory and re-run both 'make_dlls'
and 'autoconf'. The new files are part of the patch as a diff against
/dev/null. Hope it will work.

I did some minimal regression testing, but do not hesitate to shout if I
broke anything.

Time now to look at the other ones :-)

Changelog:
   Ove Kaaven <ovek at transgaming.com>
   - support DirectInput 8 interfaces.
   - implemented mouse wheel support.

                                 Lionel

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


More information about the wine-patches mailing list