Added some basic IDirectDraw7 interface support, fixed argument count
of IDirectDraw{4,7}_SetDisplayMode defines.

diff --git a/dlls/ddraw/ddraw/dga.c b/dlls/ddraw/ddraw/dga.c
index 334f6e5..bc6b1f1 100644
--- a/dlls/ddraw/ddraw/dga.c
+++ b/dlls/ddraw/ddraw/dga.c
@@ -44,6 +44,7 @@
 struct ICOM_VTABLE(IDirectDraw)		dga_ddvt;
 struct ICOM_VTABLE(IDirectDraw2)	dga_dd2vt;
 struct ICOM_VTABLE(IDirectDraw4)	dga_dd4vt;
+struct ICOM_VTABLE(IDirectDraw7)	dga_dd7vt;
 
 #define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->d->private)
 #define DPPRIVATE(x) dga_dp_private *dppriv = ((dga_dp_private*)(x)->private)
@@ -412,14 +413,23 @@
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) {
-	IDirectDraw2Impl	*dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
-	ICOM_VTBL(dd) = &dga_dd2vt;dd->ref = 1;dd->d = This->d;This->d++;
+	IDirectDraw4Impl	*dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
+	ICOM_VTBL(dd) = &dga_dd4vt;dd->ref = 1;dd->d = This->d;This->d++;
 	*obj = dd;
 
-	IDirectDraw2_AddRef(iface);
+	IDirectDraw4_AddRef(iface);
 	TRACE("  Creating IDirectDraw4 interface (%p)\n", *obj);
 	return S_OK;
     }
+    if ( IsEqualGUID( &IID_IDirectDraw7, refiid ) ) {
+	IDirectDraw4Impl	*dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
+	ICOM_VTBL(dd) = &dga_dd7vt;dd->ref = 1;dd->d = This->d;This->d++;
+	*obj = dd;
+
+	IDirectDraw7_AddRef(iface);
+	FIXME("  Creating IDirectDraw7 interface (by using DirectDraw4 impl.) (%p)\n", *obj);
+	return S_OK;
+    }
     FIXME("(%p):interface for IID %s _NOT_ found!\n",This,debugstr_guid(refiid));
     return OLE_E_ENUM_NOMORE;
 }
@@ -660,3 +670,45 @@
     IDirectDraw4Impl_GetDeviceIdentifier
 };
 #undef XCAST
+
+#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
+# define XCAST(fun)	(typeof(dga_dd7vt.fn##fun))
+#else
+# define XCAST(fun)	(void*)
+#endif
+
+ICOM_VTABLE(IDirectDraw7) dga_dd7vt = 
+{
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    XCAST(QueryInterface)DGA_IDirectDraw2Impl_QueryInterface,
+    XCAST(AddRef)IDirectDraw2Impl_AddRef,
+    XCAST(Release)DGA_IDirectDraw2Impl_Release,
+    XCAST(Compact)IDirectDraw2Impl_Compact,
+    XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
+    XCAST(CreatePalette)DGA_IDirectDraw2Impl_CreatePalette,
+    XCAST(CreateSurface)DGA_IDirectDraw2Impl_CreateSurface,
+    XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface,
+    XCAST(EnumDisplayModes)DGA_IDirectDraw2Impl_EnumDisplayModes,
+    XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
+    XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
+    XCAST(GetCaps)DGA_IDirectDraw2Impl_GetCaps,
+    XCAST(GetDisplayMode)DGA_IDirectDraw2Impl_GetDisplayMode,
+    XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes,
+    XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
+    XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
+    XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine,
+    XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus,
+    XCAST(Initialize)IDirectDraw2Impl_Initialize,
+    XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode,
+    XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel,
+    XCAST(SetDisplayMode)DGA_IDirectDrawImpl_SetDisplayMode,
+    XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
+    XCAST(GetAvailableVidMem)DGA_IDirectDraw2Impl_GetAvailableVidMem,
+    XCAST(GetSurfaceFromDC)IDirectDraw4Impl_GetSurfaceFromDC,
+    XCAST(RestoreAllSurfaces)IDirectDraw4Impl_RestoreAllSurfaces,
+    XCAST(TestCooperativeLevel)IDirectDraw4Impl_TestCooperativeLevel,
+    XCAST(GetDeviceIdentifier)IDirectDraw4Impl_GetDeviceIdentifier,
+    IDirectDraw7Impl_StartModeTest,
+    IDirectDraw7Impl_EvaluateMode
+};
+#undef XCAST
diff --git a/dlls/ddraw/ddraw/main.c b/dlls/ddraw/ddraw/main.c
index 09de364..8becc21 100644
--- a/dlls/ddraw/ddraw/main.c
+++ b/dlls/ddraw/ddraw/main.c
@@ -528,6 +528,24 @@
     return DD_OK;
 }
 
+HRESULT WINAPI IDirectDraw7Impl_StartModeTest(
+    LPDIRECTDRAW7 iface,LPSIZE lpModesToTest,DWORD dwNumEntries,DWORD dwFlags
+) {
+    FIXME("(%p)->(%p,%ld,0x%08lx),empty stub!\n",iface,
+	lpModesToTest,dwNumEntries,dwFlags
+    );
+    return DD_OK;
+}
+
+HRESULT WINAPI IDirectDraw7Impl_EvaluateMode(
+    LPDIRECTDRAW7 iface,DWORD dwFlags, DWORD *pSecondsUntilTimeout
+) {
+    FIXME("(%p)->(0x%08lx,%p),empty stub!\n",iface,
+	dwFlags,pSecondsUntilTimeout
+    );
+    return DD_OK;
+}
+
 HRESULT common_off_screen_CreateSurface(
     IDirectDraw2Impl* This,IDirectDrawSurfaceImpl* lpdsf
 ) {
diff --git a/dlls/ddraw/ddraw/x11.c b/dlls/ddraw/ddraw/x11.c
index 135ff1e..ba96759 100644
--- a/dlls/ddraw/ddraw/x11.c
+++ b/dlls/ddraw/ddraw/x11.c
@@ -906,10 +906,19 @@
 	dd->ref = 1;ICOM_VTBL(dd) = &xlib_dd4vt;dd->d = This->d;This->d->ref++;
 	*obj = dd;
 
-	IDirectDraw2_AddRef(iface);
+	IDirectDraw4_AddRef(iface);
 	TRACE("  Creating IDirectDraw4 interface (%p)\n", *obj);
 	return S_OK;
     }
+    if ( IsEqualGUID( &IID_IDirectDraw7, refiid ) ) {
+	IDirectDraw4Impl *dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
+	dd->ref = 1;ICOM_VTBL(dd) = &xlib_dd7vt;dd->d = This->d;This->d->ref++;
+	*obj = dd;
+
+	IDirectDraw7_AddRef(iface);
+	FIXME("  Creating IDirectDraw7 interface by reusing DirectDraw4!(%p)\n", *obj);
+	return S_OK;
+    }
 #ifdef HAVE_OPENGL
     if ( IsEqualGUID( &IID_IDirect3D, refiid ) )
 	return create_direct3d(obj,This);
@@ -1266,7 +1275,7 @@
     XCAST(Initialize)IDirectDraw2Impl_Initialize,
     XCAST(RestoreDisplayMode)IDirectDraw2Impl_RestoreDisplayMode,
     XCAST(SetCooperativeLevel)Xlib_IDirectDraw2Impl_SetCooperativeLevel,
-    XCAST(SetDisplayMode)Xlib_IDirectDrawImpl_SetDisplayMode,
+    XCAST(SetDisplayMode)Xlib_IDirectDraw2Impl_SetDisplayMode,
     XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
     XCAST(GetAvailableVidMem)Xlib_IDirectDraw2Impl_GetAvailableVidMem,
     IDirectDraw4Impl_GetSurfaceFromDC,
@@ -1275,3 +1284,44 @@
     IDirectDraw4Impl_GetDeviceIdentifier
 };
 #undef XCAST
+
+#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
+# define XCAST(fun)	(typeof(xlib_dd7vt.fn##fun))
+#else
+# define XCAST(fun)	(void*)
+#endif
+
+ICOM_VTABLE(IDirectDraw7) xlib_dd7vt = {
+    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+    XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface,
+    XCAST(AddRef)IDirectDraw2Impl_AddRef,
+    XCAST(Release)Xlib_IDirectDraw2Impl_Release,
+    XCAST(Compact)IDirectDraw2Impl_Compact,
+    XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
+    XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette,
+    XCAST(CreateSurface)Xlib_IDirectDraw2Impl_CreateSurface,
+    XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface,
+    XCAST(EnumDisplayModes)Xlib_IDirectDraw2Impl_EnumDisplayModes,
+    XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
+    XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
+    XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps,
+    XCAST(GetDisplayMode)IDirectDraw2Impl_GetDisplayMode,
+    XCAST(GetFourCCCodes)Xlib_IDirectDraw2Impl_GetFourCCCodes,
+    XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
+    XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
+    XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine,
+    XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus,
+    XCAST(Initialize)IDirectDraw2Impl_Initialize,
+    XCAST(RestoreDisplayMode)IDirectDraw2Impl_RestoreDisplayMode,
+    XCAST(SetCooperativeLevel)Xlib_IDirectDraw2Impl_SetCooperativeLevel,
+    XCAST(SetDisplayMode)Xlib_IDirectDraw2Impl_SetDisplayMode,
+    XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
+    XCAST(GetAvailableVidMem)Xlib_IDirectDraw2Impl_GetAvailableVidMem,
+    XCAST(GetSurfaceFromDC)IDirectDraw4Impl_GetSurfaceFromDC,
+    XCAST(RestoreAllSurfaces)IDirectDraw4Impl_RestoreAllSurfaces,
+    XCAST(TestCooperativeLevel)IDirectDraw4Impl_TestCooperativeLevel,
+    XCAST(GetDeviceIdentifier)IDirectDraw4Impl_GetDeviceIdentifier,
+    IDirectDraw7Impl_StartModeTest,
+    IDirectDraw7Impl_EvaluateMode,
+};
+#undef XCAST
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 871cc89..f200a67 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -189,6 +189,13 @@
 						    DWORD dwFlags
 );
 
+extern HRESULT WINAPI IDirectDraw7Impl_StartModeTest(
+	LPDIRECTDRAW7 iface,LPSIZE modetotest,DWORD num,DWORD flags
+);
+extern HRESULT WINAPI IDirectDraw7Impl_EvaluateMode(
+	LPDIRECTDRAW7 iface,DWORD flags,DWORD *seconduntiltimeout
+);
+
 /*****************************************************************************
  * IDirectDrawPalette implementation structure
  */
diff --git a/dlls/ddraw/x11_private.h b/dlls/ddraw/x11_private.h
index 1644827..c13fdee 100644
--- a/dlls/ddraw/x11_private.h
+++ b/dlls/ddraw/x11_private.h
@@ -40,8 +40,9 @@
 #include "wine_gl.h"
 
 extern ICOM_VTABLE(IDirectDraw)		xlib_ddvt;
-extern ICOM_VTABLE(IDirectDraw2)         xlib_dd2vt;
+extern ICOM_VTABLE(IDirectDraw2)        xlib_dd2vt;
 extern ICOM_VTABLE(IDirectDraw4)        xlib_dd4vt;
+extern ICOM_VTABLE(IDirectDraw7)        xlib_dd7vt;
 extern ICOM_VTABLE(IDirectDrawPalette)	xlib_ddpalvt;
 extern ICOM_VTABLE(IDirectDrawSurface4) xlib_dds4vt;
 
diff --git a/include/ddraw.h b/include/ddraw.h
index d40ff31..dac90fc 100644
--- a/include/ddraw.h
+++ b/include/ddraw.h
@@ -1373,7 +1373,7 @@
 #define IDirectDraw4_Initialize(p,a)             ICOM_CALL1(Initialize,p,a)
 #define IDirectDraw4_RestoreDisplayMode(p)       ICOM_CALL (RestoreDisplayMode,p)
 #define IDirectDraw4_SetCooperativeLevel(p,a,b)  ICOM_CALL2(SetCooperativeLevel,p,a,b)
-#define IDirectDraw4_SetDisplayMode(p,a,b,c)     ICOM_CALL3(SetDisplayMode,p,a,b,c)
+#define IDirectDraw4_SetDisplayMode(p,a,b,c,d,e) ICOM_CALL5(SetDisplayMode,p,a,b,c,d,e)
 #define IDirectDraw4_WaitForVerticalBlank(p,a,b) ICOM_CALL2(WaitForVerticalBlank,p,a,b)
 /*** IDirectDraw2 methods ***/
 #define IDirectDraw4_GetAvailableVidMem(p,a,b,c) ICOM_CALL3(GetAvailableVidMem,p,a,b,c)
@@ -1451,7 +1451,7 @@
 #define IDirectDraw7_Initialize(p,a)             ICOM_CALL1(Initialize,p,a)
 #define IDirectDraw7_RestoreDisplayMode(p)       ICOM_CALL (RestoreDisplayMode,p)
 #define IDirectDraw7_SetCooperativeLevel(p,a,b)  ICOM_CALL2(SetCooperativeLevel,p,a,b)
-#define IDirectDraw7_SetDisplayMode(p,a,b,c)     ICOM_CALL3(SetDisplayMode,p,a,b,c)
+#define IDirectDraw7_SetDisplayMode(p,a,b,c,d,e) ICOM_CALL5(SetDisplayMode,p,a,b,c,d,e)
 #define IDirectDraw7_WaitForVerticalBlank(p,a,b) ICOM_CALL2(WaitForVerticalBlank,p,a,b)
 /*** added in IDirectDraw2 ***/
 #define IDirectDraw7_GetAvailableVidMem(p,a,b,c) ICOM_CALL3(GetAvailableVidMem,p,a,b,c)