Release 980726

Sat Jul 25 19:45:45 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [include/shlobj.h][misc/shell.c][misc/shellord.c][ole/folders.c]
	[shell32.spec]
	Added SHFILEOPSTRUCT32[A|W] and constants, prototypes.
	Implemented SHGetSpecialFolderLocation, SHGetPathFromIDList32[A].
	Many IShellFolder, pidl, shell -related changes.

	SHChangeNotifyRegister, SHChangeNotifyDeregister,
	SHShellFolderView_Message, SHMapPIDLToSystemImageListIndex,
	SHAddToRecentDocs32, SHFileOperation, SHChangeNotify, 
	SHCreateShellFolderViewEx stubs.

Sat Jul 25 17:16:25 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [files/profile.c]
	Fix return value of PROFILE_GetSection().

Fri Jul 24 22:45:19 1998  Ove Kaaven <ovek@isflak.arcticnet.no>

	* [controls/edit.c]
	Killed the modified flag on WM_SETTEXT. Eudora should no longer
	bother asking whether you want to save an unchanged message.

Fri Jul 24 21:21:35 1998  Andreas Mohr <100.30936@germany.net>

	* [controls/menu.c]
	Fixed bug in GetMenuState32.
	Doesn't fix Free Agent 32 :((

	* [documentation/debugging]
	Hints added.

	* [files/dos_fs.c] [include/msdos.h] [msdos/int21.c]
	Enhanced DOS device support.

	* [if1632/Makefile.in] [if1632/builtin.c] [if1632/rasapi16.spec]
	  [relay32/Makefile.in] [relay32/builtin32.c] [relay32/rasapi32.spec]
	Added RASAPI16/32.DLL.

	* [misc/aspi.c] [relay32/wnaspi32.spec]
	Implemented GetASPI32SupportInfo.

	* [multimedia/mmsystem.c]
	Implemented mmTaskCreate.

Fri Jul 24 20:55:31 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [controls/toolbar.c]
	Fixed some bugs and added new features.

	* [controls/tooltips.c][include/tooltips.h]
	Added more messages and started display code.

	* [misc/shell.c][misc/shellord.c][relay32/shell.spec]
	Fixed StrToOleStrN (SHELL32_79) and added OleStrToStrN (SHELL32_78).
	Added some new stubs.

	* [objects/cursoricon.c][misc/imagelist.c][include/windows.h]
	Fixed GetIconInfo and removed the GetIconInfo hack from the
	image list code.

	* [controls/pager.c][include/pager.h][controls/treeview.c]
	  [include/treeview.h]
	Added some messages.

	* [misc/tweak.c][winows/nonclient.c][documentation/win95look]
	Removed unused tweak variables.

	* [documentation/common_controls]
	Updated.

Fri Jul 24 18:36:32 1998  James Moody <013263m@dragon.acadiau.ca>

	* [objects/font.c]
	Fixed a bug in GetTextFace.

Fri Jul 24 17:09:33 1998  Marcus Meissner <marcus@jet.franken.de>

	* [misc/commdlg.c]
	Fixed stacksmashing bug due to invalid specified function
	pointers.

	* [files/dos_fs.c]
	Small change in case handling... be able to create files with
	uppercase in them (like Program Files/).

	* [graphics/ddraw.c]
	XF86DGA support made threadsafe, added more Xlib dependent stuff
	(create Window using CreateWindow(), draw into it). xlib support
	is not satisfying.

	* [scheduler/critsection.c]
	Don't recurse on HeapLock with semaphore id 0.

	* [win32/user32.c][windows/message.c][windows/event.c]
	Moved win32 *Message functions where they belong.
	Removed some potential races between XPending and XNextEvent by
	a bit more locking.

Fri Jul 24 13:58:19 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [loader/pe_image.c] [loader/ne/segment.c]
	Use bogus pointer value instead of NULL for unresolved externals.

	* [memory/selector.c]
	Clear saved_fs on selector free.

	* [msdos/cdrom.c] [configure.in]
	Added check for linux/ucdrom.h.

	* [scheduler/client.c] [server/socket.c]
	Fix for missing struct cmsghdr.
	Attempt to support msg_accrights fd passing (completely untested).

	* [windows/event.c]
	Do not grab the pointer in SetCapture (Win32 behavior).

Tue Jul 21 22:28:13 1998  James Juran  <jrj120@psu.edu>

	* [Make.rules.in]
	Changed $(MKDIR) macro to use -p option (make parent directories
	if they don't already exist.  This fixes an error in 'make install'
	if /usr/local/include doesn't already exist.

Tue Jul 21 13:37:04 Rein Klazes <rklazes@casema.net>

	* [include/heap.h]
	Replaced macro SEGPTR_GET by inline function to avoid *lots*
	of wrong use of this macro.

	* [relay32/comdlg32.spec]
	Corrected GetSaveFileNameW entry.

	* [relay32/advapi32.spec] [win32/advapi.c]
	  [relay32/ole32.spec] [ ole/moniker.c]
	Added stubs for SetFileSecurity[AW] and CreateFileMoniker32

	* [graphics/x11drv/graphics.c]
	Finished implementation of bezier drawing code.

Tue Jul 21 11:00:51 1998  Claus Fischer <cfischer@td2cad.intel.com>

	* [files/drive.c]
	Remove label trailing blanks in GetVolumeInformation32A.

	* [documentation/cdrom-labels]
	Added documentation on how to find out a CD-ROM label.

Sun Jul 19 23:16:41 1998  Pascal Cuoq <pcuoq@ens-lyon.fr>

	* [include/windows.h]
	Added some DM_* and DISP_CHANGE_* flags.

	* [relay32/user32.spec] [windows/user.c]
	Added stub for ChangeDisplaySettingA.

	* [ole/ole2nls.c]
	is_punctuation: reuse information from another table.

Sun Jul 19 22:04:46 1998  Douglas Ridgway  <ridgway@winehq.com>

	* [Make.rules.in]
	Updated automatic documentation rules.

	* [graphics/path.c] [misc/aspi.c] [misc/ntdll.c] [misc/winsock_dns.c]
	[ole/ole2dsp.c] [relay32/user32.spec]
	Comment format futzing to keep c2man happy.

	* [documentation/README.documentation]
	Updated description of automatic documentation.

Wed Jul 15 19:10:09 1998   Andrew M. Bishop <amb@gedanken.demon.co.uk>

	* [files/profile.c]
	Cache the 10 most recently used .ini files.

Tue May 20 19:20:23 1997  Pablo Saratxaga <srtxg@chanae.alphanet.ch>

	* [misc/commdlg.c]
	Makes PrintDlg32A() return TRUE even if it is an empty
	stub, so most programs are happy and run anyway instead of
	aborting at startup.

	* [graphics/x11drv/xfont.c]
	Increased the maximum font families as (X11) font aliases
	eated up a lot of families causing wine to stop reading fonts.
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 2c5add5..4420891 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -71,9 +71,11 @@
 #include "d3d.h"
 #include "debug.h"
 #include "compobj.h"
+#include "spy.h"
+#include "message.h"
 
 #ifdef HAVE_LIBXXF86DGA
-#include <X11/extensions/xf86dga.h>
+#include "ts_xf86dga.h"
 #endif
 
 /* restore signal handlers overwritten by XF86DGA 
@@ -105,8 +107,6 @@
 };
 
 static struct IDirectDrawSurface3_VTable	dga_dds3vt, xshm_dds3vt, xlib_dds3vt;
-static struct IDirectDrawSurface2_VTable	dga_dds2vt, xshm_dds2vt, xlib_dds2vt;
-static struct IDirectDrawSurface_VTable		dga_ddsvt, xshm_ddsvt, xlib_ddsvt;
 static struct IDirectDraw_VTable		dga_ddvt, xshm_ddvt, xlib_ddvt;
 static struct IDirectDraw2_VTable		dga_dd2vt, xshm_dd2vt, xlib_dd2vt;
 static struct IDirectDrawClipper_VTable	ddclipvt;
@@ -114,12 +114,23 @@
 static struct IDirect3D_VTable			d3dvt;
 static struct IDirect3D2_VTable			d3d2vt;
 
+void Xlib_MessagePump(HWND32 hwnd) {
+	MSG32	msg32;
+
+	while (PeekMessage32A(&msg32,0,0,0,PM_NOYIELD)) {
+		GetMessage32A(&msg32,0,0,0);
+		TranslateMessage32(&msg32);
+		DispatchMessage32A(&msg32);
+	}
+}
+
+
 BOOL32
 DDRAW_DGA_Available()
 {
 #ifdef HAVE_LIBXXF86DGA
 	int evbase, evret;
-	return (getuid() == 0) && XF86DGAQueryExtension(display,&evbase,&evret);
+	return (getuid() == 0)&&TSXF86DGAQueryExtension(display,&evbase,&evret);
 #else /* defined(HAVE_LIBXXF86DGA) */
 	return 0;
 #endif /* defined(HAVE_LIBXXF86DGA) */
@@ -138,12 +149,13 @@
 HRESULT WINAPI
 DirectDrawEnumerate32A(LPDDENUMCALLBACK32A ddenumproc,LPVOID data) {
 	if (DDRAW_DGA_Available()) {
-		ddenumproc(&DGA_DirectDraw_GUID,"WINE with XFree86 DGA","wine-dga",data);
+		ddenumproc(&DGA_DirectDraw_GUID,"WINE with XFree86 DGA","display",data);
 	}
 	if (DDRAW_XShm_Available()) {
-		ddenumproc(&XSHM_DirectDraw_GUID,"WINE with MIT XShm","wine-xshm",data);
+		ddenumproc(&XSHM_DirectDraw_GUID,"WINE with MIT XShm","display",data);
 	}
-	ddenumproc(&XLIB_DirectDraw_GUID,"WINE with Xlib","wine-xlib",data);
+	ddenumproc(&XLIB_DirectDraw_GUID,"WINE with Xlib","display",data);
+	ddenumproc(NULL,"WINE","display",data);
 	return 0;
 }
 
@@ -285,52 +297,6 @@
 	DUMP("\n");
 }
 
-static void _dump_DDCAPS(DWORD flagmask) {
-	int	i;
-	const struct {
-		DWORD	mask;
-		char	*name;
-} flags[] = {
-#define FE(x) { x, #x},
-		FE(DDCAPS_3D)
-		FE(DDCAPS_ALIGNBOUNDARYDEST)
-		FE(DDCAPS_ALIGNSIZEDEST)
-		FE(DDCAPS_ALIGNBOUNDARYSRC)
-		FE(DDCAPS_ALIGNSIZESRC)
-		FE(DDCAPS_ALIGNSTRIDE)
-		FE(DDCAPS_BLT)
-		FE(DDCAPS_BLTQUEUE)
-		FE(DDCAPS_BLTFOURCC)
-		FE(DDCAPS_BLTSTRETCH)
-		FE(DDCAPS_GDI)
-		FE(DDCAPS_OVERLAY)
-		FE(DDCAPS_OVERLAYCANTCLIP)
-		FE(DDCAPS_OVERLAYFOURCC)
-		FE(DDCAPS_OVERLAYSTRETCH)
-		FE(DDCAPS_PALETTE)
-		FE(DDCAPS_PALETTEVSYNC)
-		FE(DDCAPS_READSCANLINE)
-		FE(DDCAPS_STEREOVIEW)
-		FE(DDCAPS_VBI)
-		FE(DDCAPS_ZBLTS)
-		FE(DDCAPS_ZOVERLAYS)
-		FE(DDCAPS_COLORKEY)
-		FE(DDCAPS_ALPHA)
-		FE(DDCAPS_COLORKEYHWASSIST)
-		FE(DDCAPS_NOHARDWARE)
-		FE(DDCAPS_BLTCOLORFILL)
-		FE(DDCAPS_BANKSWITCHED)
-		FE(DDCAPS_BLTDEPTHFILL)
-		FE(DDCAPS_CANCLIP)
-		FE(DDCAPS_CANCLIPSTRETCHED)
-		FE(DDCAPS_CANBLTSYSMEM)
-	};
-	for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
-		if (flags[i].mask & flagmask)
-			DUMP("%s ",flags[i].name);
-	DUMP("\n");
-}
-
 static void _dump_DDSD(DWORD flagmask) {
 	int	i;
 	const struct {
@@ -392,11 +358,14 @@
 }
 
 /******************************************************************************
- *			IDirectDrawSurface
+ *		IDirectDrawSurface,IDirectDrawSurface2,IDirectDrawSurface3
+ *
+ * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let
+ * DDS and DDS2 use those functions. (Function calls did not change (except
+ * using different DirectDrawSurfaceX version), just added flags and functions)
  */
-
-static HRESULT WINAPI IDirectDrawSurface_Lock(
-    LPDIRECTDRAWSURFACE this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
+static HRESULT WINAPI IDirectDrawSurface3_Lock(
+    LPDIRECTDRAWSURFACE3 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
 ) {
         TRACE(ddraw, "(%p)->Lock(%p,%p,%08lx,%08lx)\n",
 		this,lprect,lpddsd,flags,(DWORD)hnd);
@@ -412,6 +381,7 @@
 			(lprect->top*this->s.lpitch) +
 			(lprect->left*(this->s.ddraw->d.depth/8));
 	} else {
+		assert(this->s.surface);
 		lpddsd->y.lpSurface = this->s.surface;
 	}
 	lpddsd->dwFlags = DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_PITCH|DDSD_LPSURFACE;
@@ -422,21 +392,18 @@
 	return 0;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface_Unlock(
-	LPDIRECTDRAWSURFACE this,LPVOID surface
+static HRESULT WINAPI DGA_IDirectDrawSurface3_Unlock(
+	LPDIRECTDRAWSURFACE3 this,LPVOID surface
 ) {
 	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
 	return 0;
 }
 
-static HRESULT WINAPI XShm_IDirectDrawSurface_Unlock(
-	LPDIRECTDRAWSURFACE this,LPVOID surface
+static HRESULT WINAPI XShm_IDirectDrawSurface3_Unlock(
+	LPDIRECTDRAWSURFACE3 this,LPVOID surface
 ) {
 #ifdef HAVE_LIBXXSHM
 	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
-	if (!this->t.xshm.surface_is_image_data) {
-		FIXME(ddraw,"(%p)->Unlock(%p) needs an image copy!\n",this,surface);
-	}
 	/* FIXME: is it really right to display the image on unlock?
 	 * or should it wait for a Flip()? */
 	TSXShmPutImage(display,
@@ -447,41 +414,40 @@
 				   this->t.xshm.image->width,
 				   this->t.xshm.image->height,
 				   False);
+/*
 	if (this->s.palette && this->s.palette->cm) {
 		TSXInstallColormap(display,this->s.palette->cm);
 	}
-	TSXSync(display,False);
+*/
+	/*TSXSync(display,False);*/
+	EVENT_Synchronize();
 	return 0;
 #else /* defined(HAVE_LIBXXSHM) */
 	return E_UNEXPECTED;
 #endif /* defined(HAVE_LIBXXSHM) */
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawSurface_Unlock(
-	LPDIRECTDRAWSURFACE this,LPVOID surface
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock(
+	LPDIRECTDRAWSURFACE3 this,LPVOID surface
 ) {
+	Xlib_MessagePump(this->s.ddraw->e.xlib.window);
+
 	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
-	if (!this->t.xshm.surface_is_image_data) {
-		FIXME(ddraw,"(%p)->Unlock(%p) needs an image copy!\n",this,surface);
-	}
-	/* FIXME: is it really right to display the image on unlock?
-	 * or should it wait for a Flip()? */
-	TSXPutImage(display,
+	TSXPutImage(		display,
 				this->s.ddraw->e.xlib.drawable,
 				DefaultGCOfScreen(screen),
 				this->t.xlib.image,
 				0, 0, 0, 0,
 				this->t.xlib.image->width,
-				this->t.xlib.image->width);
-	if (this->s.palette && this->s.palette->cm) {
-		TSXInstallColormap(display,this->s.palette->cm);
-	}
-	TSXSync(display,False);
+				this->t.xlib.image->height
+	);
+	/*TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm);*/
+	EVENT_Synchronize();
 	return 0;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface_Flip(
-	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+static HRESULT WINAPI DGA_IDirectDrawSurface3_Flip(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
 ) {
 #ifdef HAVE_LIBXXF86DGA
 	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
@@ -491,11 +457,12 @@
 		else
 			flipto = this;
 	}
-	XF86DGASetViewPort(display,DefaultScreen(display),0,flipto->t.dga.fb_height);
+	TSXF86DGASetViewPort(display,DefaultScreen(display),0,flipto->t.dga.fb_height);
+
 	if (flipto->s.palette && flipto->s.palette->cm) {
-		XF86DGAInstallColormap(display,DefaultScreen(display),flipto->s.palette->cm);
+		TSXF86DGAInstallColormap(display,DefaultScreen(display),flipto->s.palette->cm);
 	}
-	while (!XF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
+	while (!TSXF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
 	}
 	if (flipto!=this) {
 		int	tmp;
@@ -515,8 +482,8 @@
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static HRESULT WINAPI XShm_IDirectDrawSurface_Flip(
-	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+static HRESULT WINAPI XShm_IDirectDrawSurface3_Flip(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
 ) {
 #ifdef HAVE_LIBXXSHM
 	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
@@ -534,10 +501,12 @@
 				   flipto->t.xshm.image->width,
 				   flipto->t.xshm.image->height,
 				   False);
+/*
 	if (flipto->s.palette && flipto->s.palette->cm) {
 		TSXInstallColormap(display,flipto->s.palette->cm);
 	}
-	TSXSync(display,False);
+*/
+	EVENT_Synchronize();
 	if (flipto!=this) {
 		XImage *tmp;
 		tmp = this->t.xshm.image;
@@ -550,8 +519,8 @@
 #endif /* defined(HAVE_LIBXXSHM) */
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawSurface_Flip(
-	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
 ) {
 	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
 	if (!flipto) {
@@ -566,30 +535,32 @@
 				flipto->t.xlib.image,
 				0, 0, 0, 0,
 				flipto->t.xlib.image->width,
-				flipto->t.xlib.image->width);
-	if (flipto->s.palette && flipto->s.palette->cm) {
-		TSXInstallColormap(display,flipto->s.palette->cm);
-	}
-	TSXSync(display,False);
+				flipto->t.xlib.image->height);
+	TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm);
+	EVENT_Synchronize();
 	if (flipto!=this) {
 		XImage *tmp;
-		tmp = this->t.xshm.image;
-		this->t.xshm.image = flipto->t.xshm.image;
-		flipto->t.xshm.image = tmp;
+		LPVOID	*surf;
+		tmp = this->t.xlib.image;
+		this->t.xlib.image = flipto->t.xlib.image;
+		flipto->t.xlib.image = tmp;
+		surf = this->s.surface;
+		this->s.surface = flipto->s.surface;
+		flipto->s.surface = surf;
 	}
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_SetPalette(
-	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWPALETTE pal
+static HRESULT WINAPI IDirectDrawSurface3_SetPalette(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWPALETTE pal
 ) {
 	TRACE(ddraw,"(%p)->SetPalette(%p)\n",this,pal);
 	this->s.palette = pal; /* probably addref it too */
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_Blt(
-	LPDIRECTDRAWSURFACE this,LPRECT32 rdst,LPDIRECTDRAWSURFACE src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
+static HRESULT WINAPI IDirectDrawSurface3_Blt(
+	LPDIRECTDRAWSURFACE3 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE3 src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
 ) {
 	RECT32	xdst,xsrc;
 	int	i,j;
@@ -656,8 +627,8 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_BltFast(
-	LPDIRECTDRAWSURFACE this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE src,LPRECT32 rsrc,DWORD trans
+static HRESULT WINAPI IDirectDrawSurface3_BltFast(
+	LPDIRECTDRAWSURFACE3 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE3 src,LPRECT32 rsrc,DWORD trans
 ) {
 	int	i,bpp;
 	if (TRACE_ON(ddraw)) {
@@ -677,8 +648,8 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_BltBatch(
-	LPDIRECTDRAWSURFACE this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
+static HRESULT WINAPI IDirectDrawSurface3_BltBatch(
+	LPDIRECTDRAWSURFACE3 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
 ) {
 	TRACE(ddraw,"(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",
 		this,ddbltbatch,x,y
@@ -686,16 +657,16 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_GetCaps(
-	LPDIRECTDRAWSURFACE this,LPDDSCAPS caps
+static HRESULT WINAPI IDirectDrawSurface3_GetCaps(
+	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS caps
 ) {
 	TRACE(ddraw,"(%p)->GetCaps(%p)\n",this,caps);
 	caps->dwCaps = DDCAPS_PALETTE; /* probably more */
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_GetSurfaceDesc(
-	LPDIRECTDRAWSURFACE this,LPDDSURFACEDESC ddsd
+static HRESULT WINAPI IDirectDrawSurface3_GetSurfaceDesc(
+	LPDIRECTDRAWSURFACE3 this,LPDDSURFACEDESC ddsd
 ) { 
 	if (TRACE_ON(ddraw)) {
 		TRACE(ddraw, "(%p)->GetSurfaceDesc(%p)\n",
@@ -718,12 +689,12 @@
 	return 0;
 }
 
-static ULONG WINAPI IDirectDrawSurface_AddRef(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI IDirectDrawSurface3_AddRef(LPDIRECTDRAWSURFACE3 this) {
 	TRACE(ddraw,"(%p)->AddRef()\n",this);
 	return ++(this->ref);
 }
 
-static ULONG WINAPI DGA_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI DGA_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
 	TRACE(ddraw,"(%p)->Release()\n",this);
 #ifdef HAVE_LIBXXF86DGA
 	if (!--(this->ref)) {
@@ -741,16 +712,15 @@
 	return this->ref;
 }
 
-static ULONG WINAPI XShm_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI XShm_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
 	TRACE(ddraw,"(%p)->Release()\n",this);
 #ifdef HAVE_LIBXXSHM
 	if (!--(this->ref)) {
 		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
-		if (!this->t.xshm.surface_is_image_data) {
-			HeapFree(GetProcessHeap(),0,this->s.surface);
-		}
-		XShmDetach(display,&this->t.xshm.shminfo);
-		XDestroyImage(this->t.xshm.image);
+		HeapFree(GetProcessHeap(),0,this->s.surface);
+		this->t.xshm.image->data = NULL;
+		TSXShmDetach(display,&this->t.xshm.shminfo);
+		TSXDestroyImage(this->t.xshm.image);
 		shmdt(this->t.xshm.shminfo.shmaddr);
 		shmctl(this->t.xshm.shminfo.shmid, IPC_RMID, 0);
 		HeapFree(GetProcessHeap(),0,this);
@@ -760,22 +730,22 @@
 	return this->ref;
 }
 
-static ULONG WINAPI Xlib_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI Xlib_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
 	TRACE(ddraw,"(%p)->Release()\n",this);
 	if (!--(this->ref)) {
 		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
-		if (!this->t.xshm.surface_is_image_data) {
-			HeapFree(GetProcessHeap(),0,this->s.surface);
-		}
-		XDestroyImage(this->t.xshm.image);
+		HeapFree(GetProcessHeap(),0,this->s.surface);
+		this->t.xlib.image->data = NULL;
+		TSXDestroyImage(this->t.xlib.image);
+		this->t.xlib.image = 0;
 		HeapFree(GetProcessHeap(),0,this);
 		return 0;
 	}
 	return this->ref;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE *lpdsf
+static HRESULT WINAPI IDirectDrawSurface3_GetAttachedSurface(
+	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
 ) {
         TRACE(ddraw, "(%p)->GetAttachedSurface(%p,%p)\n",
 		     this, lpddsd, lpdsf);
@@ -792,674 +762,83 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_Initialize(
-	LPDIRECTDRAWSURFACE this,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
+static HRESULT WINAPI IDirectDrawSurface3_Initialize(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
 ) {
 	return DDERR_ALREADYINITIALIZED;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_GetPixelFormat(
-	LPDIRECTDRAWSURFACE this,LPDDPIXELFORMAT pf
-) {
-	return _getpixelformat(this->s.ddraw,pf);
-}
-
-static HRESULT WINAPI IDirectDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE this,DWORD dwFlags) {
-	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",
-		this,dwFlags
-	);
-	return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_GetOverlayPosition(
-	LPDIRECTDRAWSURFACE this,LPLONG x1,LPLONG x2
-) {
-	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",
-		this,x1,x2
-	);
-	return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_SetClipper(
-	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWCLIPPER clipper
-) {
-	FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper);
-	return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_AddAttachedSurface(
-	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE surf
-) {
-	FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf);
-	this->s.backbuffer = surf;
-	return 0;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_GetDC(LPDIRECTDRAWSURFACE this,HDC32* lphdc) {
-	FIXME(ddraw,"(%p)->GetDC(%p),stub!\n",this,lphdc);
-	return 0;
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
-        char    xrefiid[50];
-
-        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
-	
-	/* thats version 3 (DirectX 5) */
-	if (!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds3vt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
-		return 0;
-	}
-	/* thats version 2 (DirectX 3) */
-	if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds2vt;
-		*obj = this;
-		return 0;
-	}
-	/* thats us */
-	if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
-		return 0;
-	}
-	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
-	return OLE_E_ENUM_NOMORE;
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
-        char    xrefiid[50];
-
-        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
-	
-	/* thats version 3 (DirectX 5) */
-	if (	!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
-		this->lpvtbl->fnAddRef(this);
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds3vt;
-		*obj = this;
-		return 0;
-	}
-	/* thats version 2 (DirectX 3) */
-	if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds2vt;
-		*obj = this;
-		return 0;
-	}
-	/* thats us */
-	if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
-		return 0;
-	}
-	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
-	return OLE_E_ENUM_NOMORE;
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
-        char    xrefiid[50];
-
-        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
-	
-	/* thats version 3 (DirectX 5) */
-	if (!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
-		return 0;
-	}
-	/* thats version 2 (DirectX 3) */
-	if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds2vt;
-		*obj = this;
-		return 0;
-	}
-	/* thats us */
-	if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
-		return 0;
-	}
-	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
-    	return OLE_E_ENUM_NOMORE;
-}
-
-static HRESULT WINAPI IDirectDrawSurface_IsLost(LPDIRECTDRAWSURFACE this) {
-	return 0; /* hmm */
-}
-
-static struct IDirectDrawSurface_VTable dga_ddsvt = {
-	DGA_IDirectDrawSurface_QueryInterface,
-	IDirectDrawSurface_AddRef,
-	DGA_IDirectDrawSurface_Release,
-	IDirectDrawSurface_AddAttachedSurface,
-	(void*)5,
-	IDirectDrawSurface_Blt,
-	IDirectDrawSurface_BltBatch,
-	IDirectDrawSurface_BltFast,
-	(void*)9,
-	(void*)10,
-	(void*)11,
-	DGA_IDirectDrawSurface_Flip,
-	IDirectDrawSurface_GetAttachedSurface,
-	IDirectDrawSurface_GetBltStatus,
-	IDirectDrawSurface_GetCaps,
-	(void*)16,
-	(void*)17,
-	IDirectDrawSurface_GetDC,
-	(void*)19,
-	IDirectDrawSurface_GetOverlayPosition,
-	(void*)21,
-	IDirectDrawSurface_GetPixelFormat,
-	IDirectDrawSurface_GetSurfaceDesc,
-	IDirectDrawSurface_Initialize,
-	IDirectDrawSurface_IsLost,
-	IDirectDrawSurface_Lock,
-	(void*)27,
-	(void*)28,
-	IDirectDrawSurface_SetClipper,
-	(void*)30,
-	(void*)31,
-	IDirectDrawSurface_SetPalette,
-	DGA_IDirectDrawSurface_Unlock,
-	(void*)34,
-	(void*)35,
-	(void*)36,
-};
-
-static struct IDirectDrawSurface_VTable xshm_ddsvt = {
-	XShm_IDirectDrawSurface_QueryInterface,
-	IDirectDrawSurface_AddRef,
-	XShm_IDirectDrawSurface_Release,
-	IDirectDrawSurface_AddAttachedSurface,
-	(void*)5,
-	IDirectDrawSurface_Blt,
-	IDirectDrawSurface_BltBatch,
-	IDirectDrawSurface_BltFast,
-	(void*)9,
-	(void*)10,
-	(void*)11,
-	XShm_IDirectDrawSurface_Flip,
-	IDirectDrawSurface_GetAttachedSurface,
-	IDirectDrawSurface_GetBltStatus,
-	IDirectDrawSurface_GetCaps,
-	(void*)16,
-	(void*)17,
-	IDirectDrawSurface_GetDC,
-	(void*)19,
-	IDirectDrawSurface_GetOverlayPosition,
-	(void*)21,
-	IDirectDrawSurface_GetPixelFormat,
-	IDirectDrawSurface_GetSurfaceDesc,
-	IDirectDrawSurface_Initialize,
-	IDirectDrawSurface_IsLost,
-	IDirectDrawSurface_Lock,
-	(void*)27,
-	(void*)28,
-	IDirectDrawSurface_SetClipper,
-	(void*)30,
-	(void*)31,
-	IDirectDrawSurface_SetPalette,
-	XShm_IDirectDrawSurface_Unlock,
-	(void*)34,
-	(void*)35,
-	(void*)36,
-};
-
-static struct IDirectDrawSurface_VTable xlib_ddsvt = {
-	Xlib_IDirectDrawSurface_QueryInterface,
-	IDirectDrawSurface_AddRef,
-	Xlib_IDirectDrawSurface_Release,
-	IDirectDrawSurface_AddAttachedSurface,
-	(void*)5,
-	IDirectDrawSurface_Blt,
-	IDirectDrawSurface_BltBatch,
-	IDirectDrawSurface_BltFast,
-	(void*)9,
-	(void*)10,
-	(void*)11,
-	Xlib_IDirectDrawSurface_Flip,
-	IDirectDrawSurface_GetAttachedSurface,
-	IDirectDrawSurface_GetBltStatus,
-	IDirectDrawSurface_GetCaps,
-	(void*)16,
-	(void*)17,
-	IDirectDrawSurface_GetDC,
-	(void*)19,
-	IDirectDrawSurface_GetOverlayPosition,
-	(void*)21,
-	IDirectDrawSurface_GetPixelFormat,
-	IDirectDrawSurface_GetSurfaceDesc,
-	IDirectDrawSurface_Initialize,
-	IDirectDrawSurface_IsLost,
-	IDirectDrawSurface_Lock,
-	(void*)27,
-	(void*)28,
-	IDirectDrawSurface_SetClipper,
-	(void*)30,
-	(void*)31,
-	IDirectDrawSurface_SetPalette,
-	Xlib_IDirectDrawSurface_Unlock,
-	(void*)34,
-	(void*)35,
-	(void*)36,
-};
-
-/******************************************************************************
- *			IDirectDrawSurface2
- *
- * calls IDirectDrawSurface methods where possible
- */
-static HRESULT WINAPI IDirectDrawSurface2_Lock(
-    LPDIRECTDRAWSURFACE2 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
-) {
-	return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)this,lprect,lpddsd,flags,hnd);
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_Unlock(
-	LPDIRECTDRAWSURFACE2 this,LPVOID surface
-) {
-	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_Unlock(
-	LPDIRECTDRAWSURFACE2 this,LPVOID surface
-) {
-	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_Unlock(
-	LPDIRECTDRAWSURFACE2 this,LPVOID surface
-) {
-	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_SetPalette(
-	LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWPALETTE pal
-) {
-	return IDirectDrawSurface_SetPalette((LPDIRECTDRAWSURFACE)this,pal);
-}
-
-static ULONG WINAPI IDirectDrawSurface2_AddRef(LPDIRECTDRAWSURFACE2 this) {
-	TRACE(ddraw,"(%p)->AddRef()\n",this);
-	return ++(this->ref);
-}
-
-static ULONG WINAPI DGA_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
-	return DGA_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI XShm_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
-	return XShm_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI Xlib_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
-	return Xlib_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_Blt(
-	LPDIRECTDRAWSURFACE2 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE2 src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
-) {
-	return IDirectDrawSurface_Blt((LPDIRECTDRAWSURFACE)this, rdst, (LPDIRECTDRAWSURFACE)src, rsrc, dwFlags,lpbltfx);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_BltFast(
-	LPDIRECTDRAWSURFACE2 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE2 src,LPRECT32 rsrc,DWORD trans
-) {
-	return IDirectDrawSurface_BltFast((LPDIRECTDRAWSURFACE)this,dstx,dsty,(LPDIRECTDRAWSURFACE)src,rsrc,trans);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_BltBatch(
-	LPDIRECTDRAWSURFACE2 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
-) {
-	return IDirectDrawSurface_BltBatch((LPDIRECTDRAWSURFACE)this,ddbltbatch,x,y);
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
-) {
-	HRESULT	ret;
-
-	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
-	if (!ret) {
-		(*lpdsf)->lpvtbl = &dga_dds2vt;
-	}
-	return ret;
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
-) {
-	HRESULT	ret;
-
-	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
-	if (!ret) {
-		(*lpdsf)->lpvtbl = &xshm_dds2vt;
-	}
-	return ret;
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
-) {
-	HRESULT	ret;
-
-	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
-	if (!ret) {
-		(*lpdsf)->lpvtbl = &xlib_dds2vt;
-	}
-	return ret;
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_Flip(
-	LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
-) {
-	return DGA_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_Flip(
-	LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
-) {
-	return XShm_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_Flip(
-	LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
-) {
-	return Xlib_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE2 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
-	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb);
-	return 0;
-}
-
-static HRESULT WINAPI DGA_IDirectDrawSurface2_QueryInterface(
-	LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
-) {
-	return DGA_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface2_QueryInterface(
-	LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
-) {
-	return XShm_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface2_QueryInterface(
-	LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
-) {
-	return Xlib_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI IDirectDrawSurface2_IsLost(LPDIRECTDRAWSURFACE2 this) {
-	return 0; /* hmm */
-}
-
-static struct IDirectDrawSurface2_VTable dga_dds2vt = {
-	DGA_IDirectDrawSurface2_QueryInterface,
-	IDirectDrawSurface2_AddRef,
-	DGA_IDirectDrawSurface2_Release,
-	(void*)4,
-	(void*)5,
-	IDirectDrawSurface2_Blt,
-	IDirectDrawSurface2_BltBatch,
-	IDirectDrawSurface2_BltFast,
-	(void*)9,
-	IDirectDrawSurface2_EnumAttachedSurfaces,
-	(void*)11,
-	DGA_IDirectDrawSurface2_Flip,
-	DGA_IDirectDrawSurface2_GetAttachedSurface,
-	(void*)14,
-	(void*)15/*IDirectDrawSurface_GetCaps*/,
-	(void*)16,
-	(void*)17,
-	(void*)18,
-	(void*)19,
-	(void*)20,
-	(void*)21,
-	(void*)22,
-	(void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
-	(void*)24,
-	IDirectDrawSurface2_IsLost,
-	IDirectDrawSurface2_Lock,
-	(void*)27,
-	(void*)28,
-	(void*)29,
-	(void*)30,
-	(void*)31,
-	IDirectDrawSurface2_SetPalette,
-	DGA_IDirectDrawSurface2_Unlock,
-	(void*)34,
-	(void*)35,
-	(void*)36,
-	(void*)37,
-	(void*)38,
-	(void*)39,
-};
-
-static struct IDirectDrawSurface2_VTable xshm_dds2vt = {
-	XShm_IDirectDrawSurface2_QueryInterface,
-	IDirectDrawSurface2_AddRef,
-	XShm_IDirectDrawSurface2_Release,
-	(void*)4,
-	(void*)5,
-	IDirectDrawSurface2_Blt,
-	IDirectDrawSurface2_BltBatch,
-	IDirectDrawSurface2_BltFast,
-	(void*)9,
-	IDirectDrawSurface2_EnumAttachedSurfaces,
-	(void*)11,
-	XShm_IDirectDrawSurface2_Flip,
-	XShm_IDirectDrawSurface2_GetAttachedSurface,
-	(void*)14,
-	(void*)15/*IDirectDrawSurface_GetCaps*/,
-	(void*)16,
-	(void*)17,
-	(void*)18,
-	(void*)19,
-	(void*)20,
-	(void*)21,
-	(void*)22,
-	(void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
-	(void*)24,
-	IDirectDrawSurface2_IsLost,
-	IDirectDrawSurface2_Lock,
-	(void*)27,
-	(void*)28,
-	(void*)29,
-	(void*)30,
-	(void*)31,
-	IDirectDrawSurface2_SetPalette,
-	XShm_IDirectDrawSurface2_Unlock,
-	(void*)34,
-	(void*)35,
-	(void*)36,
-	(void*)37,
-	(void*)38,
-	(void*)39,
-};
-
-static struct IDirectDrawSurface2_VTable xlib_dds2vt = {
-	Xlib_IDirectDrawSurface2_QueryInterface,
-	IDirectDrawSurface2_AddRef,
-	Xlib_IDirectDrawSurface2_Release,
-	(void*)4,
-	(void*)5,
-	IDirectDrawSurface2_Blt,
-	IDirectDrawSurface2_BltBatch,
-	IDirectDrawSurface2_BltFast,
-	(void*)9,
-	IDirectDrawSurface2_EnumAttachedSurfaces,
-	(void*)11,
-	Xlib_IDirectDrawSurface2_Flip,
-	Xlib_IDirectDrawSurface2_GetAttachedSurface,
-	(void*)14,
-	(void*)15/*IDirectDrawSurface_GetCaps*/,
-	(void*)16,
-	(void*)17,
-	(void*)18,
-	(void*)19,
-	(void*)20,
-	(void*)21,
-	(void*)22,
-	(void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
-	(void*)24,
-	IDirectDrawSurface2_IsLost,
-	IDirectDrawSurface2_Lock,
-	(void*)27,
-	(void*)28,
-	(void*)29,
-	(void*)30,
-	(void*)31,
-	IDirectDrawSurface2_SetPalette,
-	Xlib_IDirectDrawSurface2_Unlock,
-	(void*)34,
-	(void*)35,
-	(void*)36,
-	(void*)37,
-	(void*)38,
-	(void*)39,
-};
-
-/******************************************************************************
- *			IDirectDrawSurface3
- */
-static HRESULT WINAPI IDirectDrawSurface3_SetPalette(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWPALETTE pal
-) {
-	return IDirectDrawSurface_SetPalette((LPDIRECTDRAWSURFACE)this,pal);
-}
-
 static HRESULT WINAPI IDirectDrawSurface3_GetPixelFormat(
 	LPDIRECTDRAWSURFACE3 this,LPDDPIXELFORMAT pf
 ) {
 	return _getpixelformat(this->s.ddraw,pf);
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface3_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
-) {
-	HRESULT	ret;
-
-	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
-	if (!ret) {
-		(*lpdsf)->lpvtbl = &dga_dds3vt;
-	}
-	return ret;
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface3_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
-) {
-	HRESULT	ret;
-
-	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
-	if (!ret) {
-		(*lpdsf)->lpvtbl = &xshm_dds3vt;
-	}
-	return ret;
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
-) {
-	HRESULT	ret;
-
-	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
-
-	if (!ret) {
-		(*lpdsf)->lpvtbl = &xlib_dds3vt;
-	}
-	return ret;
-}
-
-static ULONG WINAPI IDirectDrawSurface3_AddRef(LPDIRECTDRAWSURFACE3 this) {
-	TRACE(ddraw,"(%p)->AddRef()\n",this);
-	return ++(this->ref);
-}
-
-static ULONG WINAPI DGA_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
-	return DGA_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI XShm_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
-	return XShm_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static ULONG WINAPI Xlib_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
-	return Xlib_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
-}
-
-static HRESULT WINAPI IDirectDrawSurface3_Blt(
-        LPDIRECTDRAWSURFACE3 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE3 src,
-	LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
-) {
-	return IDirectDrawSurface_Blt((LPDIRECTDRAWSURFACE)this,rdst,(LPDIRECTDRAWSURFACE)src,rsrc,dwFlags,lpbltfx);
-}
-
-static HRESULT WINAPI IDirectDrawSurface3_IsLost(LPDIRECTDRAWSURFACE3 this) {
-	return 0; /* hmm */
-}
-
-static HRESULT WINAPI IDirectDrawSurface3_Restore(LPDIRECTDRAWSURFACE3 this) {
+static HRESULT WINAPI IDirectDrawSurface3_GetBltStatus(LPDIRECTDRAWSURFACE3 this,DWORD dwFlags) {
+	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",this,dwFlags);
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetBltStatus(
-	LPDIRECTDRAWSURFACE3 this,DWORD dwflags
+static HRESULT WINAPI IDirectDrawSurface3_GetOverlayPosition(
+	LPDIRECTDRAWSURFACE3 this,LPLONG x1,LPLONG x2
 ) {
-	return IDirectDrawSurface_GetBltStatus((LPDIRECTDRAWSURFACE)this,dwflags);
+	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,x1,x2);
+	return 0;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface3_Flip(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+static HRESULT WINAPI IDirectDrawSurface3_SetClipper(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWCLIPPER clipper
 ) {
-	return DGA_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+	FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper);
+	return 0;
 }
 
-static HRESULT WINAPI XShm_IDirectDrawSurface3_Flip(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+static HRESULT WINAPI IDirectDrawSurface3_AddAttachedSurface(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 surf
 ) {
-	return XShm_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+	FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf);
+	this->s.backbuffer = surf;
+	return 0;
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
-) {
-	return Xlib_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+static HRESULT WINAPI IDirectDrawSurface3_GetDC(LPDIRECTDRAWSURFACE3 this,HDC32* lphdc) {
+	FIXME(ddraw,"(%p)->GetDC(%p)\n",this,lphdc);
+	*lphdc = GetDC32(this->s.ddraw->e.xlib.window);
+	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_Lock(
-    LPDIRECTDRAWSURFACE3 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
-) {
-	return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)this,lprect,lpddsd,flags,hnd); 
+static HRESULT WINAPI IDirectDrawSurface3_ReleaseDC(LPDIRECTDRAWSURFACE3 this,HDC32 hdc) {
+	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",this,(long)hdc);
+	ReleaseDC32(this->s.ddraw->e.xlib.window,hdc);
+	return 0;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface3_Unlock(
-	LPDIRECTDRAWSURFACE3 this,LPVOID surface
-) {
-	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+
+static HRESULT WINAPI IDirectDrawSurface3_QueryInterface(LPDIRECTDRAWSURFACE3 this,REFIID refiid,LPVOID *obj) {
+        char    xrefiid[50];
+
+        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	
+	/* DirectDrawSurface,DirectDrawSurface2 and DirectDrawSurface3 use
+	 * the same interface. And IUnknown does that too of course.
+	 */
+	if (	!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID))	||
+		!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID))	||
+		!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID))	||
+		!memcmp(&IID_IUnknown,refiid,sizeof(IID))
+	) {
+		*obj = this;
+		this->lpvtbl->fnAddRef(this);
+		return 0;
+	}
+	FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",this,xrefiid);
+	return OLE_E_ENUM_NOMORE;
 }
 
-static HRESULT WINAPI XShm_IDirectDrawSurface3_Unlock(
-	LPDIRECTDRAWSURFACE3 this,LPVOID surface
-) {
-	return XShm_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock(
-	LPDIRECTDRAWSURFACE3 this,LPVOID surface
-) {
-	return Xlib_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+static HRESULT WINAPI IDirectDrawSurface3_IsLost(LPDIRECTDRAWSURFACE3 this) {
+	FIXME(ddraw,"(%p)->(), stub!\n",this);
+	return 0; /* hmm */
 }
 
 static HRESULT WINAPI IDirectDrawSurface3_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
@@ -1467,61 +846,49 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_SetClipper(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWCLIPPER clipper
-) {
-	return IDirectDrawSurface_SetClipper((LPDIRECTDRAWSURFACE)this,clipper);
+static HRESULT WINAPI IDirectDrawSurface3_Restore(LPDIRECTDRAWSURFACE3 this) {
+	FIXME(ddraw,"(%p)->(),stub!\n",this);
+	return 0;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface3_QueryInterface(
-	LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
+static HRESULT WINAPI IDirectDrawSurface3_SetColorKey(
+	LPDIRECTDRAWSURFACE3 this,DWORD x,LPDDCOLORKEY ckey
 ) {
-	return DGA_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI XShm_IDirectDrawSurface3_QueryInterface(
-	LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
-) {
-	return XShm_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
-}
-
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_QueryInterface(
-	LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
-) {
-	return Xlib_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+	FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n",this,x,ckey);
+	return 0;
 }
 
 static struct IDirectDrawSurface3_VTable dga_dds3vt = {
-	DGA_IDirectDrawSurface3_QueryInterface,
+	IDirectDrawSurface3_QueryInterface,
 	IDirectDrawSurface3_AddRef,
 	DGA_IDirectDrawSurface3_Release,
-	(void*)4,
+	IDirectDrawSurface3_AddAttachedSurface,
 	(void*)5,
 	IDirectDrawSurface3_Blt,
-	(void*)7,
-	(void*)8,
+	IDirectDrawSurface3_BltBatch,
+	IDirectDrawSurface3_BltFast,
 	(void*)9,
 	IDirectDrawSurface3_EnumAttachedSurfaces,
 	(void*)11,
 	DGA_IDirectDrawSurface3_Flip,
-	DGA_IDirectDrawSurface3_GetAttachedSurface,
+	IDirectDrawSurface3_GetAttachedSurface,
 	IDirectDrawSurface3_GetBltStatus,
-	(void*)15,
+	IDirectDrawSurface3_GetCaps,
 	(void*)16,
 	(void*)17,
-	(void*)18,
+	IDirectDrawSurface3_GetDC,
 	(void*)19,
-	(void*)20,
+	IDirectDrawSurface3_GetOverlayPosition,
 	(void*)21,
 	IDirectDrawSurface3_GetPixelFormat,
-	(void*)23,
-	(void*)24,
+	IDirectDrawSurface3_GetSurfaceDesc,
+	IDirectDrawSurface3_Initialize,
 	IDirectDrawSurface3_IsLost,
 	IDirectDrawSurface3_Lock,
-	(void*)27,
+	IDirectDrawSurface3_ReleaseDC,
 	IDirectDrawSurface3_Restore,
 	IDirectDrawSurface3_SetClipper,
-	(void*)30,
+	IDirectDrawSurface3_SetColorKey,
 	(void*)31,
 	IDirectDrawSurface3_SetPalette,
 	DGA_IDirectDrawSurface3_Unlock,
@@ -1535,36 +902,36 @@
 };
 
 static struct IDirectDrawSurface3_VTable xshm_dds3vt = {
-	XShm_IDirectDrawSurface3_QueryInterface,
+	IDirectDrawSurface3_QueryInterface,
 	IDirectDrawSurface3_AddRef,
 	XShm_IDirectDrawSurface3_Release,
-	(void*)4,
+	IDirectDrawSurface3_AddAttachedSurface,
 	(void*)5,
 	IDirectDrawSurface3_Blt,
-	(void*)7,
-	(void*)8,
+	IDirectDrawSurface3_BltBatch,
+	IDirectDrawSurface3_BltFast,
 	(void*)9,
 	IDirectDrawSurface3_EnumAttachedSurfaces,
 	(void*)11,
 	XShm_IDirectDrawSurface3_Flip,
-	XShm_IDirectDrawSurface3_GetAttachedSurface,
+	IDirectDrawSurface3_GetAttachedSurface,
 	IDirectDrawSurface3_GetBltStatus,
-	(void*)15,
+	IDirectDrawSurface3_GetCaps,
 	(void*)16,
 	(void*)17,
-	(void*)18,
+	IDirectDrawSurface3_GetDC,
 	(void*)19,
-	(void*)20,
+	IDirectDrawSurface3_GetOverlayPosition,
 	(void*)21,
 	IDirectDrawSurface3_GetPixelFormat,
-	(void*)23,
-	(void*)24,
+	IDirectDrawSurface3_GetSurfaceDesc,
+	IDirectDrawSurface3_Initialize,
 	IDirectDrawSurface3_IsLost,
 	IDirectDrawSurface3_Lock,
-	(void*)27,
+	IDirectDrawSurface3_ReleaseDC,
 	IDirectDrawSurface3_Restore,
 	IDirectDrawSurface3_SetClipper,
-	(void*)30,
+	IDirectDrawSurface3_SetColorKey,
 	(void*)31,
 	IDirectDrawSurface3_SetPalette,
 	XShm_IDirectDrawSurface3_Unlock,
@@ -1578,36 +945,36 @@
 };
 
 static struct IDirectDrawSurface3_VTable xlib_dds3vt = {
-	Xlib_IDirectDrawSurface3_QueryInterface,
+	IDirectDrawSurface3_QueryInterface,
 	IDirectDrawSurface3_AddRef,
 	Xlib_IDirectDrawSurface3_Release,
-	(void*)4,
+	IDirectDrawSurface3_AddAttachedSurface,
 	(void*)5,
 	IDirectDrawSurface3_Blt,
-	(void*)7,
-	(void*)8,
+	IDirectDrawSurface3_BltBatch,
+	IDirectDrawSurface3_BltFast,
 	(void*)9,
 	IDirectDrawSurface3_EnumAttachedSurfaces,
 	(void*)11,
 	Xlib_IDirectDrawSurface3_Flip,
-	Xlib_IDirectDrawSurface3_GetAttachedSurface,
+	IDirectDrawSurface3_GetAttachedSurface,
 	IDirectDrawSurface3_GetBltStatus,
-	(void*)15,
+	IDirectDrawSurface3_GetCaps,
 	(void*)16,
 	(void*)17,
-	(void*)18,
+	IDirectDrawSurface3_GetDC,
 	(void*)19,
-	(void*)20,
+	IDirectDrawSurface3_GetOverlayPosition,
 	(void*)21,
 	IDirectDrawSurface3_GetPixelFormat,
-	(void*)23,
-	(void*)24,
+	IDirectDrawSurface3_GetSurfaceDesc,
+	IDirectDrawSurface3_Initialize,
 	IDirectDrawSurface3_IsLost,
 	IDirectDrawSurface3_Lock,
-	(void*)27,
+	IDirectDrawSurface3_ReleaseDC,
 	IDirectDrawSurface3_Restore,
 	IDirectDrawSurface3_SetClipper,
-	(void*)30,
+	IDirectDrawSurface3_SetColorKey,
 	(void*)31,
 	IDirectDrawSurface3_SetPalette,
 	Xlib_IDirectDrawSurface3_Unlock,
@@ -1646,6 +1013,13 @@
 	return 0;
 }
 
+static HRESULT WINAPI IDirectDrawClipper_SetClipList(
+	LPDIRECTDRAWCLIPPER this,LPRGNDATA lprgn,DWORD hmm
+) {
+	FIXME(ddraw,"(%p,%p,%ld),stub!\n",this,lprgn,hmm);
+	return 0;
+}
+
 static struct IDirectDrawClipper_VTable ddclipvt = {
 	(void*)1,
 	(void*)2,
@@ -1654,7 +1028,7 @@
 	(void*)5,
 	(void*)6,
 	(void*)7,
-	(void*)8,
+	IDirectDrawClipper_SetClipList,
 	IDirectDrawClipper_SetHwnd
 };
 
@@ -1668,7 +1042,7 @@
 	int	i;
 
 	if (!this->cm) /* should not happen */ {
-		TRACE(ddraw,"app tried to read colormap for non-palettized mode\n");
+		FIXME(ddraw,"app tried to read colormap for non-palettized mode\n");
 		return DDERR_GENERIC;
 	}
 	for (i=start;i<end;i++) {
@@ -1691,11 +1065,11 @@
 		this,x,start,end,palent
 	);
 	if (!this->cm) /* should not happen */ {
-		TRACE(ddraw,"app tried to set colormap in non-palettized mode\n");
+		FIXME(ddraw,"app tried to set colormap in non-palettized mode\n");
 		return DDERR_GENERIC;
 	}
 	/* FIXME: free colorcells instead of freeing whole map */
-	this->cm = TSXCopyColormapAndFree(display,this->cm);
+	/*this->cm = TSXCopyColormapAndFree(display,this->cm);*/
 	for (i=start;i<end;i++) {
 		xc.red = palent[i-start].peRed<<8;
 		xc.blue = palent[i-start].peBlue<<8;
@@ -1717,23 +1091,13 @@
 	HRESULT hres;
 	hres = common_IDirectDrawPalette_SetEntries(this,x,start,end,palent);
 	if (hres != 0) return hres;
-	XF86DGAInstallColormap(display,DefaultScreen(display),this->cm);
+	TSXF86DGAInstallColormap(display,DefaultScreen(display),this->cm);
 	return 0;
 #else /* defined(HAVE_LIBXXF86DGA) */
 	return E_UNEXPECTED;
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawPalette_SetEntries(
-	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD end,LPPALETTEENTRY palent
-) {
-	HRESULT hres;
-	hres = common_IDirectDrawPalette_SetEntries(this,x,start,end,palent);
-	if (hres != 0) return hres;
-	TSXInstallColormap(display,this->cm);
-	return 0;
-}
-
 static ULONG WINAPI IDirectDrawPalette_Release(LPDIRECTDRAWPALETTE this) {
 	if (!--(this->ref)) {
 		if (this->cm) {
@@ -1773,7 +1137,7 @@
 	(void*)4,
 	IDirectDrawPalette_GetEntries,
 	IDirectDrawPalette_Initialize,
-	Xlib_IDirectDrawPalette_SetEntries
+	common_IDirectDrawPalette_SetEntries
 };
 
 static struct IDirectDrawPalette_VTable xlib_ddpalvt = {
@@ -1783,7 +1147,7 @@
 	(void*)4,
 	IDirectDrawPalette_GetEntries,
 	IDirectDrawPalette_Initialize,
-	Xlib_IDirectDrawPalette_SetEntries
+	common_IDirectDrawPalette_SetEntries
 };
 
 /*******************************************************************************
@@ -1850,8 +1214,7 @@
 #ifdef HAVE_LIBXXF86DGA
 	int	i;
 
-	TRACE(ddraw, "(%p)->(%p,%p,%p)\n",
-		     this,lpddsd,lpdsf,lpunk);
+	TRACE(ddraw, "(%p)->(%p,%p,%p)\n",this,lpddsd,lpdsf,lpunk);
 	if (TRACE_ON(ddraw)) {
 		DUMP("[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
 		_dump_DDSD(lpddsd->dwFlags);
@@ -1863,14 +1226,14 @@
 	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
 	this->lpvtbl->fnAddRef(this);
 	(*lpdsf)->ref = 1;
-	(*lpdsf)->lpvtbl = &dga_ddsvt;
+	(*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds3vt;
 	if (	(lpddsd->dwFlags & DDSD_CAPS) && 
 		(lpddsd->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN)
 	) {
 		if (!(lpddsd->dwFlags & DDSD_WIDTH))
 			lpddsd->dwWidth = this->e.dga.fb_width;
 		if (!(lpddsd->dwFlags & DDSD_HEIGHT))
-			lpddsd->dwWidth = this->e.dga.fb_height;
+			lpddsd->dwHeight = this->e.dga.fb_height;
 		(*lpdsf)->s.surface = (LPBYTE)HeapAlloc(GetProcessHeap(),0,lpddsd->dwWidth*lpddsd->dwHeight*this->d.depth/8);
 		(*lpdsf)->t.dga.fb_height = -1;
 		(*lpdsf)->s.lpitch = lpddsd->dwWidth*this->d.depth/8;
@@ -1894,15 +1257,15 @@
 	(*lpdsf)->s.ddraw = this;
 	(*lpdsf)->s.backbuffer = NULL;
 	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
-		LPDIRECTDRAWSURFACE	back;
+		LPDIRECTDRAWSURFACE3	back;
 
 		if (lpddsd->dwBackBufferCount>1)
 			FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
 
-		(*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
+		(*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE3)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface3));
 		this->lpvtbl->fnAddRef(this);
 		back->ref = 1;
-		back->lpvtbl = &dga_ddsvt;
+		back->lpvtbl = (LPDIRECTDRAWSURFACE3_VTABLE)&dga_dds3vt;
 		for (i=0;i<32;i++)
 			if (!(this->e.dga.vpmask & (1<<i)))
 				break;
@@ -1931,8 +1294,7 @@
 #ifdef HAVE_LIBXXSHM
 	XImage *img;
 	int shmid;
-	TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n",
-		     this,lpddsd,lpdsf,lpunk);
+	TRACE(ddraw,"(%p)->CreateSurface(%p,%p,%p)\n",this,lpddsd,lpdsf,lpunk);
 	if (TRACE_ON(ddraw)) {
 		fprintf(stderr,"[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
 		_dump_DDSD(lpddsd->dwFlags);
@@ -1945,7 +1307,7 @@
 	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
 	this->lpvtbl->fnAddRef(this);
 	(*lpdsf)->ref = 1;
-	(*lpdsf)->lpvtbl = &xshm_ddsvt;
+	(*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds3vt;
 	(*lpdsf)->t.xshm.image = img =
 		XShmCreateImage(display, /*FIXME:visual*/0, /*FIXME:depth*/8, ZPixmap,
 						NULL, &(*lpdsf)->t.xshm.shminfo,
@@ -1953,9 +1315,8 @@
 	(*lpdsf)->t.xshm.shminfo.shmid = shmid =
 		shmget(IPC_PRIVATE, img->bytes_per_line*img->height, IPC_CREAT|0777);
 	(*lpdsf)->t.xshm.shminfo.shmaddr = img->data = shmat(shmid, 0, 0);
-	XShmAttach(display, &(*lpdsf)->t.xshm.shminfo);
+	TSXShmAttach(display, &(*lpdsf)->t.xshm.shminfo);
 	/* POOLE FIXME: XShm: this will easily break */
-	(*lpdsf)->t.xshm.surface_is_image_data = TRUE;
 	(*lpdsf)->s.surface = img->data;
 	/* END FIXME: XShm */
 	(*lpdsf)->s.lpitch = img->bytes_per_line;
@@ -1986,21 +1347,74 @@
 	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
 	this->lpvtbl->fnAddRef(this);
 	(*lpdsf)->ref = 1;
-	(*lpdsf)->lpvtbl = &xlib_ddsvt;
-	TRACE(ddraw,"using standard XImage for a primary surface\n");
-	/* POOLE FIXME: Xlib: this will easily break */
-	(*lpdsf)->t.xshm.surface_is_image_data = TRUE;
-	(*lpdsf)->s.surface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,640*480);
-	(*lpdsf)->t.xlib.image = img =
-		XCreateImage(display, /*FIXME:visual*/0, /*FIXME: depth*/8, ZPixmap,
-					 0, (*lpdsf)->s.surface,
-					 /*FIXME:width*/640, /*FIXME:height*/480, 0, 640*1);
-	/* END FIXME: Xlib */
-	(*lpdsf)->s.lpitch = img->bytes_per_line;
-	(*lpdsf)->s.width = img->width;
-	(*lpdsf)->s.height = img->height;
+	(*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
+	if (	(lpddsd->dwFlags & DDSD_CAPS) && 
+		(lpddsd->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN)
+	) {
+		if (!(lpddsd->dwFlags & DDSD_WIDTH))
+			lpddsd->dwWidth = this->e.dga.fb_width;
+		if (!(lpddsd->dwFlags & DDSD_HEIGHT))
+			lpddsd->dwHeight = this->e.dga.fb_height;
+		(*lpdsf)->s.surface = (LPBYTE)HeapAlloc(GetProcessHeap(),0,lpddsd->dwWidth*lpddsd->dwHeight*this->d.depth/8);
+		TRACE(ddraw,"using system memory for a primary surface\n");
+	} else {
+		TRACE(ddraw,"using standard XImage for a primary surface\n");
+			/* FIXME: !8 bit images */
+		(*lpdsf)->s.surface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,lpddsd->dwHeight*lpddsd->dwWidth);
+		(*lpdsf)->s.width = this->d.width;
+		(*lpdsf)->s.height = this->d.height;
+	}
 	(*lpdsf)->s.ddraw = this;
-	(*lpdsf)->s.backbuffer = NULL;
+	(*lpdsf)->t.xlib.image = img =
+		TSXCreateImage(	display,
+				DefaultVisualOfScreen(screen),
+				/*FIXME: depth*/8,
+				ZPixmap,
+				0,
+				(*lpdsf)->s.surface,
+				(*lpdsf)->s.width,
+				(*lpdsf)->s.height,
+				32,
+				(*lpdsf)->s.width*1
+		/* FIXME: !8 bit images */
+		);
+		/* END FIXME: Xlib */
+	(*lpdsf)->s.lpitch = img->bytes_per_line;
+	assert(img);
+	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
+		LPDIRECTDRAWSURFACE3	back;
+
+		if (lpddsd->dwBackBufferCount>1)
+			FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
+
+		(*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE3)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface3));
+		this->lpvtbl->fnAddRef(this);
+		back->ref = 1;
+		back->lpvtbl = (LPDIRECTDRAWSURFACE3_VTABLE)&xlib_dds3vt;
+		/* FIXME: !8 bit images */
+		back->s.surface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
+			img->width*img->height
+		);
+		back->t.xlib.image = TSXCreateImage(
+			display,
+			DefaultVisualOfScreen(screen),
+			/*FIXME: depth*/8,
+			ZPixmap,
+			0,
+			back->s.surface,
+			this->d.width,
+			this->d.height,
+			32,
+			this->d.width*1
+			/* FIXME: !8 bit images */
+		);
+		back->s.width = this->d.width;
+		back->s.height = this->d.height;
+		back->s.ddraw = this;
+		back->s.lpitch = back->t.xlib.image->bytes_per_line;
+		back->s.backbuffer = NULL; /* does not have a backbuffer, it is
+					    * one! */
+	}
 	return 0;
 }
 
@@ -2052,8 +1466,7 @@
 #ifdef HAVE_LIBXXF86DGA
 	int	i,*depths,depcount;
 
-	TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n",
-		      this, width, height, depth);
+	TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n", this, width, height, depth);
 
 	depths = TSXListDepths(display,DefaultScreen(display),&depcount);
 	for (i=0;i<depcount;i++)
@@ -2064,8 +1477,8 @@
 		ERR(ddraw,"(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth);
 		return DDERR_UNSUPPORTEDMODE;
 	}
-	if (this->e.dga.fb_width < width) {
-		ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->e.dga.fb_width);
+	if (this->d.width < width) {
+		ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->d.width);
 		return DDERR_UNSUPPORTEDMODE;
 	}
 	this->d.width	= width;
@@ -2079,9 +1492,9 @@
 	 * can we save them? and restore them later? In a way that
 	 * it works for the library too?
 	 */
-	XF86DGADirectVideo(display,DefaultScreen(display),XF86DGADirectGraphics);
+	TSXF86DGADirectVideo(display,DefaultScreen(display),XF86DGADirectGraphics);
 /*
-	XF86DGASetViewPort(display,DefaultScreen(display),0,this->d.fb_height);
+	TSXF86DGASetViewPort(display,DefaultScreen(display),0,this->d.fb_height);
  */
 
 #ifdef RESTORE_SIGNALS
@@ -2089,7 +1502,7 @@
 #endif
 	return 0;
 #else /* defined(HAVE_LIBXXF86DGA) */
-	return E_UNEXPECTED
+	return E_UNEXPECTED;
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
@@ -2113,9 +1526,8 @@
 		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
 		return DDERR_UNSUPPORTEDMODE;
 	}
-	/* POOLE FIXME: XShm */
-	if (this->e.dga.fb_width < width) {
-		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->e.dga.fb_width);
+	if (this->d.width < width) {
+		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->d.width);
 		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
 		return DDERR_UNSUPPORTEDMODE;
 	}
@@ -2151,19 +1563,34 @@
 		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
 		return DDERR_UNSUPPORTEDMODE;
 	}
-	/* POOLE FIXME: Xlib */
-	if (this->e.dga.fb_width < width) {
-		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->e.dga.fb_width);
+	if (this->d.width < width) {
+		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->d.width);
 		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
 		return DDERR_UNSUPPORTEDMODE;
 	}
+	this->e.xlib.window = CreateWindowEx32A(
+		0,
+		"WINE_DirectDraw",
+		"WINE_DirectDraw",
+		WS_VISIBLE|WS_SYSMENU|WS_THICKFRAME,
+		0,0,
+		width,
+		height,
+		0,
+		0,
+		0,
+		NULL
+	);
+	ShowWindow32(this->e.xlib.window,TRUE);
+	UpdateWindow32(this->e.xlib.window);
+	assert(this->e.xlib.window);
+	this->e.xlib.drawable = WIN_FindWndPtr(this->e.xlib.window)->window;
 	this->d.width	= width;
 	this->d.height	= height;
 	/* adjust fb_height, so we don't overlap */
 	if (this->e.dga.fb_height < height)
 		this->e.dga.fb_height = height;
 	this->d.depth	= depth;
-	/* END FIXME: Xlib */
 	return 0;
 }
 
@@ -2243,6 +1670,7 @@
 	if (*lpddpal == NULL) return E_OUTOFMEMORY;
 	(*lpddpal)->ref = 1;
 	(*lpddpal)->ddraw = this;
+	(*lpddpal)->installed = 0;
 	if (this->d.depth<=8) {
 		(*lpddpal)->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(screen),AllocAll);
 	} else {
@@ -2269,9 +1697,7 @@
 	LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
 ) {
 	HRESULT res;
-	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
-		this,x,palent,lpddpal,lpunk
-	);
+	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,x,palent,lpddpal,lpunk);
 	res = common_IDirectDraw_CreatePalette(this,x,palent,lpddpal,lpunk);
 	if (res != 0) return res;
 	(*lpddpal)->lpvtbl = &xshm_ddpalvt;
@@ -2281,22 +1707,28 @@
 static HRESULT WINAPI Xlib_IDirectDraw_CreatePalette(
 	LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
 ) {
-	HRESULT res;
-	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
-		this,x,palent,lpddpal,lpunk
-	);
-	res = common_IDirectDraw_CreatePalette(this,x,palent,lpddpal,lpunk);
-	if (res != 0) return res;
+	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,x,palent,lpddpal,lpunk);
+	*lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette));
+	if (*lpddpal == NULL) return E_OUTOFMEMORY;
+	(*lpddpal)->ref = 1;
+	(*lpddpal)->installed = 0;
+	(*lpddpal)->ddraw = this;
+	if (this->d.depth<=8) {
+		(*lpddpal)->cm = TSXCreateColormap(display,this->e.xlib.drawable,DefaultVisualOfScreen(screen),AllocAll);
+		TSXInstallColormap(display,(*lpddpal)->cm);
+		TSXSetWindowColormap(display,this->e.xlib.drawable,(*lpddpal)->cm);
+	} else
+		/* we don't want palettes in hicolor or truecolor */
+		(*lpddpal)->cm = 0;
 	(*lpddpal)->lpvtbl = &xlib_ddpalvt;
 	return 0;
 }
 
 static HRESULT WINAPI DGA_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
 #ifdef HAVE_LIBXXF86DGA
-	TRACE(ddraw, "(%p)->()\n", 
-		      this);
+	TRACE(ddraw, "(%p)->()\n",this);
 	Sleep(1000);
-	XF86DGADirectVideo(display,DefaultScreen(display),0);
+	TSXF86DGADirectVideo(display,DefaultScreen(display),0);
 #ifdef RESTORE_SIGNALS
 	SIGNAL_InitEmulator();
 #endif
@@ -2308,8 +1740,7 @@
 
 static HRESULT WINAPI XShm_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
 #ifdef HAVE_LIBXXF86DGA
-	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", 
-		      this);
+	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", this);
 	Sleep(1000);
 	return 0;
 #else /* defined(HAVE_LIBXXF86DGA) */
@@ -2318,8 +1749,7 @@
 }
 
 static HRESULT WINAPI Xlib_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
-	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", 
-		      this);
+	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", this);
 	return 0;
 }
 
@@ -2337,7 +1767,7 @@
 static ULONG WINAPI DGA_IDirectDraw_Release(LPDIRECTDRAW this) {
 #ifdef HAVE_LIBXXF86DGA
 	if (!--(this->ref)) {
-		XF86DGADirectVideo(display,DefaultScreen(display),0);
+		TSXF86DGADirectVideo(display,DefaultScreen(display),0);
 #ifdef RESTORE_SIGNALS
 		SIGNAL_InitEmulator();
 #endif
@@ -3020,22 +2450,23 @@
 	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
 	(*lplpDD)->lpvtbl = &dga_ddvt;
 	(*lplpDD)->ref = 1;
-	XF86DGAQueryVersion(display,&major,&minor);
+	TSXF86DGAQueryVersion(display,&major,&minor);
 	TRACE(ddraw,"XF86DGA is version %d.%d\n",major,minor);
-	XF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags);
+	TSXF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags);
 	if (!(flags & XF86DGADirectPresent))
-		MSG("direct video is NOT ENABLED.\n");
-	XF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize);
+		MSG("direct video is NOT PRESENT.\n");
+	TSXF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize);
 	TRACE(ddraw,"video framebuffer: begin %p, width %d,banksize %d,memsize %d\n",
 		addr,width,banksize,memsize
 	);
 	(*lplpDD)->e.dga.fb_width = width;
+	(*lplpDD)->d.width = width;
 	(*lplpDD)->e.dga.fb_addr = addr;
 	(*lplpDD)->e.dga.fb_memsize = memsize;
 	(*lplpDD)->e.dga.fb_banksize = banksize;
 
-	XF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height);
-	XF86DGASetViewPort(display,DefaultScreen(display),0,0);
+	TSXF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height);
+	TSXF86DGASetViewPort(display,DefaultScreen(display),0,0);
 	(*lplpDD)->e.dga.fb_height = screenHeight;
 	(*lplpDD)->e.dga.vpmask = 0;
 
@@ -3059,54 +2490,77 @@
 	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
 	(*lplpDD)->lpvtbl = &xshm_ddvt;
 	(*lplpDD)->ref = 1;
-	(*lplpDD)->e.xshm.drawable = 0; /* FIXME: make a window */
+	(*lplpDD)->e.xshm.drawable = DefaultRootWindow(display); /* FIXME: make a window */
 	(*lplpDD)->d.depth = DefaultDepthOfScreen(screen);
-	(*lplpDD)->d.height = (*lplpDD)->d.width = 0; /* FIXME */
+	(*lplpDD)->d.height = screenHeight;
+	(*lplpDD)->d.width = screenWidth;
 	return 0;
 #else /* defined(HAVE_LIBXXSHM) */
 	return DDERR_INVALIDDIRECTDRAWGUID;
 #endif /* defined(HAVE_LIBXXSHM) */
 }
+LRESULT WINAPI Xlib_DDWndProc(HWND32 hwnd,UINT32 msg,WPARAM32 wParam,LPARAM lParam) {
+	LRESULT	ret;
+	/*FIXME(ddraw,"(0x%04x,%s,0x%08lx,0x%08lx),stub!\n",(int)hwnd,SPY_GetMsgName(msg),(long)wParam,(long)lParam); */
+	ret = DefWindowProc32A(hwnd,msg,wParam,lParam);
+	return ret;
+}
 
 HRESULT WINAPI Xlib_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
+	WNDCLASS32A	wc;
+
 	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
 	(*lplpDD)->lpvtbl = &xlib_ddvt;
 	(*lplpDD)->ref = 1;
-	(*lplpDD)->e.xshm.drawable = 0; /* FIXME: make a window */
+	(*lplpDD)->e.xlib.drawable = 0; /* in SetDisplayMode */
+	wc.style	= CS_GLOBALCLASS;
+	wc.lpfnWndProc	= Xlib_DDWndProc;
+	wc.cbClsExtra	= 0;
+	wc.cbWndExtra	= 0;
+	wc.hInstance	= 0;
+	wc.hIcon	= 0;
+	wc.hCursor	= (HCURSOR32)IDC_ARROW32A;
+	wc.hbrBackground= NULL_BRUSH;
+	wc.lpszMenuName	= 0;
+	wc.lpszClassName= "WINE_DirectDraw";
+
+	(*lplpDD)->e.xlib.winclass = RegisterClass32A(&wc);
+
 	(*lplpDD)->d.depth = DefaultDepthOfScreen(screen);
-	(*lplpDD)->d.height = (*lplpDD)->d.width = 0; /* FIXME */
+	(*lplpDD)->d.height = screenHeight;
+	(*lplpDD)->d.width = screenWidth;
 	return 0;
 }
 
 HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter ) {
 	char	xclsid[50];
 
-	if (lpGUID)
+	if (HIWORD(lpGUID))
 		WINE_StringFromCLSID(lpGUID,xclsid);
-	else
-		strcpy(xclsid,"<null>");
+	else {
+		sprintf(xclsid,"<guid-%0x08x>",(int)lpGUID);
+		lpGUID = NULL;
+	}
 
 	TRACE(ddraw,"(%s,%p,%p)\n",xclsid,lplpDD,pUnkOuter);
 
 	if (!lpGUID) {
 		/* if they didn't request a particular interface, use the best
 		 * supported one */
-		if (DDRAW_DGA_Available()) {
+		if (DDRAW_DGA_Available())
 			lpGUID = &DGA_DirectDraw_GUID;
-		} else if (DDRAW_XShm_Available()) {
+		else if (DDRAW_XShm_Available())
 			lpGUID = &XSHM_DirectDraw_GUID;
-		} else {
+		else
 			lpGUID = &XLIB_DirectDraw_GUID;
-		}
 	}
 
-	if (!memcmp(lpGUID, &DGA_DirectDraw_GUID, sizeof(GUID))) {
+	if (!memcmp(lpGUID, &DGA_DirectDraw_GUID, sizeof(GUID)))
 		return DGA_DirectDrawCreate(lplpDD, pUnkOuter);
-	} else if (!memcmp(lpGUID, &XSHM_DirectDraw_GUID, sizeof(GUID))) {
+	else if (!memcmp(lpGUID, &XSHM_DirectDraw_GUID, sizeof(GUID)))
 		return XShm_DirectDrawCreate(lplpDD, pUnkOuter);
-	} else if (!memcmp(lpGUID, &XLIB_DirectDraw_GUID, sizeof(GUID))) {
+	else if (!memcmp(lpGUID, &XLIB_DirectDraw_GUID, sizeof(GUID)))
 		return Xlib_DirectDrawCreate(lplpDD, pUnkOuter);
-	}
 
 	fprintf(stderr,"DirectDrawCreate(%s,%p,%p): did not recognize requested GUID\n",xclsid,lplpDD,pUnkOuter);
 	return DDERR_INVALIDDIRECTDRAWGUID;
diff --git a/graphics/painting.c b/graphics/painting.c
index 659e9e8..6797fcc 100644
--- a/graphics/painting.c
+++ b/graphics/painting.c
@@ -1104,8 +1104,8 @@
     if(!dc) return FALSE;
     if(dc && PATH_IsPathOpen(dc->w.path))
         FIXME(gdi, "PATH_PolyBezier is not implemented!\n");
-//        if(!PATH_PolyBezier(hdc, x, y))
-//	   return FALSE;
+/*        if(!PATH_PolyBezier(hdc, x, y))
+	   return FALSE; */
     return dc->funcs->pPolyBezier&&
     	   dc->funcs->pPolyBezier(dc, lppt[0], lppt+1, cPoints-1);
 }
@@ -1131,8 +1131,8 @@
     pt.y=dc->w.CursPosY;
     if(dc && PATH_IsPathOpen(dc->w.path))
         FIXME(gdi, "PATH_PolyBezierTo is not implemented!\n");
-//        if(!PATH_PolyBezier(hdc, x, y))
-//	   return FALSE;
+/*        if(!PATH_PolyBezier(hdc, x, y))
+	   return FALSE; */
     ret= dc->funcs->pPolyBezier &&
     	   dc->funcs->pPolyBezier(dc, pt, lppt, cPoints);
     if( dc->funcs->pMoveToEx)
diff --git a/graphics/path.c b/graphics/path.c
index b68d286..9fd23ca 100644
--- a/graphics/path.c
+++ b/graphics/path.c
@@ -199,9 +199,10 @@
 
 /***********************************************************************
  *           CloseFigure32    (GDI32.16)
+ *
+ * FIXME: Check that SetLastError is being called correctly 
  */
 BOOL32 WINAPI CloseFigure32(HDC32 hdc)
-/* FIXME: Check that SetLastError is being called correctly */
 {
    GdiPath *pPath;
    
@@ -293,12 +294,14 @@
 
 /***********************************************************************
  *           PathToRegion32    (GDI32.261)
- */
-HRGN32 WINAPI PathToRegion32(HDC32 hdc)
-/* FIXME: Check that SetLastError is being called correctly */
-/* The documentation does not state this explicitly, but a test under Windows
+ *
+ * FIXME 
+ *   Check that SetLastError is being called correctly 
+ *
+ * The documentation does not state this explicitly, but a test under Windows
  * shows that the region which is returned should be in device coordinates.
  */
+HRGN32 WINAPI PathToRegion32(HDC32 hdc)
 {
    GdiPath *pPath;
    HRGN32  hrgnRval;
@@ -329,9 +332,11 @@
 
 /***********************************************************************
  *           FillPath32    (GDI32.100)
+ *
+ * FIXME
+ *    Check that SetLastError is being called correctly 
  */
 BOOL32 WINAPI FillPath32(HDC32 hdc)
-/* FIXME: Check that SetLastError is being called correctly */
 {
    GdiPath *pPath;
    INT32   mapMode, graphicsMode;
@@ -413,9 +418,10 @@
 
 /***********************************************************************
  *           SelectClipPath32    (GDI32.296)
+ * FIXME 
+ *  Check that SetLastError is being called correctly 
  */
 BOOL32 WINAPI SelectClipPath32(HDC32 hdc, INT32 iMode)
-/* FIXME: Check that SetLastError is being called correctly */
 {
    GdiPath *pPath;
    HRGN32  hrgnPath, hrgnClip;
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index 10dbf65..e0f9699 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -177,7 +177,7 @@
     if (lstrcmpi32A(printerEnabled,"on"))
     {
         MSG("Printing disabled in wine.conf or .winerc file\n");
-        MSG("Use \"printer=on\" in the \"[wine]\" section to enable it.");
+        MSG("Use \"printer=on\" in the \"[wine]\" section to enable it.\n");
         return FALSE;
     }
 
diff --git a/graphics/wing.c b/graphics/wing.c
index f6dffa1..a68cacf 100644
--- a/graphics/wing.c
+++ b/graphics/wing.c
@@ -147,7 +147,7 @@
 		{
 		    WORD	sel = 0;
 
-		    XShmAttach(display, &p->si);
+		    TSXShmAttach(display, &p->si);
 		    bmpObjPtr->pixmap = XShmCreatePixmap(display, rootWindow, 
 				  p->si.shmaddr, &p->si, bmpObjPtr->bitmap.bmWidth, 
 				  bmpObjPtr->bitmap.bmHeight, bmpi->biBitCount );
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index 0f385ad..ef1cf1c 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -920,7 +920,7 @@
     return result;
 }
 
-/****************** WARNING: WORK IN PROGRESS AHEAD !!!! ****************
+/******************************************************************
  * 
  *   *Very* simple bezier drawing code, 
  *
@@ -938,82 +938,71 @@
   * to avoid trucation errors the coordinates are
   * shifted upwards. When used in drawing they are
   * shifted down again, including correct rounding
-  * and avoiding floating points
+  * and avoiding floating point arithmatic
+  * 4 bits should allow 27 bits coordinates which I saw
+  * somewere in the win32 doc's
+  * 
   */
 
 #define BEZIERSHIFTBITS 4
 #define BEZIERSHIFTUP(x)    ((x)<<BEZIERSHIFTBITS)
-#define BEZIERFACTOR        BEZIERSHIFTUP(1)    
+#define BEZIERPIXEL        BEZIERSHIFTUP(1)    
 #define BEZIERSHIFTDOWN(x)  (((x)+(1<<(BEZIERSHIFTBITS-1)))>>BEZIERSHIFTBITS)
 /* maximum depth of recursion */
-#define BEZIERMAXDEPTH  6
+#define BEZIERMAXDEPTH  8
 
 /* size of array to store points on */
 /* enough for one curve */
-#define BEZMAXPOINTS    ((1<<BEZIERMAXDEPTH)+1)
+#define BEZMAXPOINTS    (150)
 
-/* calculate Bezier average, in this case the middle */
+/* calculate Bezier average, in this case the middle 
+ * correctly rounded...
+ * */
 
 #define BEZIERMIDDLE(Mid, P1, P2) \
-    (Mid).x=((P1).x+(P2).x)/2;\
-    (Mid).y=((P1).y+(P2).y)/2;
+    (Mid).x=((P1).x+(P2).x + 1)/2;\
+    (Mid).y=((P1).y+(P2).y + 1)/2;
     
-/* check to terminate recursion */
-static int BezierCheck( int level, POINT32 *Points)
+/**********************************************************
+* BezierCheck helper function to check
+* that recursion can be terminated
+*       Points[0] and Points[3] are begin and endpoint
+*       Points[1] and Points[2] are control points
+*       level is the recursion depth
+*       returns true if the recusion can be terminated
+*/
+static BOOL32 BezierCheck( int level, POINT32 *Points)
 { 
-#if 0
-/* this code works, it just is too much work for
- * the savings that are created. This should be done
- * with integer arithmetic and simpler.
- */
-    double hyp, r1, r2;
-    /* first check that the control points are "near" */
-    if(Points[3].x>Points[0].x)
-        if(Points[1].x > Points[3].x+BEZIERFACTOR || 
-                Points[1].x < Points[0].x-BEZIERFACTOR ||
-                Points[2].x > Points[3].x+BEZIERFACTOR || 
-                Points[2].x < Points[0].x-BEZIERFACTOR)
-        return FALSE;
-    else
-        if(Points[1].x < Points[3].x-BEZIERFACTOR || 
-                Points[1].x > Points[0].x+BEZIERFACTOR ||
-                Points[2].x < Points[3].x-BEZIERFACTOR || 
-                Points[2].x > Points[0].x+BEZIERFACTOR)
-        return FALSE;
-    if(Points[3].y>Points[0].y)
-        if(Points[1].y > Points[3].y+BEZIERFACTOR || 
-                Points[1].y < Points[0].y-BEZIERFACTOR ||
-                Points[2].y > Points[3].y+BEZIERFACTOR || 
-                Points[2].y < Points[0].y-BEZIERFACTOR)
-        return FALSE;
-    else
-        if(Points[1].x < Points[3].x-BEZIERFACTOR || 
-                Points[1].x > Points[0].x+BEZIERFACTOR ||
-                Points[2].x < Points[3].x-BEZIERFACTOR || 
-                Points[2].x > Points[0].x+BEZIERFACTOR)
-        return FALSE;o
-        
-    /* calculate the distance squared of the control point from
-     * the line from begin and endpoint
-     */
-        
-    hyp=((double)(Points[3].x-Points[0].x)*(double)(Points[3].x-Points[0].x)+
-           (double) (Points[3].y-Points[0].y)*(double)(Points[3].y-Points[0].y));
-    r1=((double)(Points[2].y-Points[0].y)*(double)(Points[3].x-Points[0].x)-
-           (double) (Points[3].y-Points[0].y)*(double)(Points[2].x-Points[0].x))
-           /BEZIERFACTOR;
-    r2=((double)(Points[1].y-Points[0].y)*(double)(Points[3].x-Points[0].x)-
-            (double)(Points[3].y-Points[0].y)*(double)(Points[1].x-Points[0].x))
-            /BEZIERFACTOR;
-    r1=r1*r1/hyp;
-    r1=r2*r2/hyp;
-    if( r1<1 && r2 <1){ /* distance less then a pixel */
-//        fprintf(stderr,"level is %d\n", level);
-        return TRUE;
+    INT32 dx, dy;
+    dx=Points[3].x-Points[0].x;
+    dy=Points[3].y-Points[0].y;
+    if(ABS(dy)<ABS(dx)){/* shallow line */
+        /* check that control points are between begin and end */
+        if( (Points[1].x-Points[0].x)*dx < 0 ||
+            (Points[2].x-Points[0].x)*dx < 0 ) return FALSE;
+        dx=BEZIERSHIFTDOWN(dx);
+        if(!dx) return TRUE;
+        if(abs(Points[1].y-Points[0].y-(dy/dx)*
+                BEZIERSHIFTDOWN(Points[1].x-Points[0].x)) > BEZIERPIXEL ||
+           abs(Points[2].y-Points[0].y-(dy/dx)*
+                   BEZIERSHIFTDOWN(Points[2].x-Points[0].x)) > BEZIERPIXEL )
+            return FALSE;
+        else
+            return TRUE;
+    }else{ /* steep line */
+        /* check that control points are between begin and end */
+        if( (Points[1].y-Points[0].y)*dy < 0 ||
+            (Points[2].y-Points[0].y)*dy < 0 ) return FALSE;
+        dy=BEZIERSHIFTDOWN(dy);
+        if(!dy) return TRUE;
+        if(abs(Points[1].x-Points[0].x-(dx/dy)*
+                BEZIERSHIFTDOWN(Points[1].y-Points[0].y)) > BEZIERPIXEL ||
+           abs(Points[2].x-Points[0].x-(dx/dy)*
+                   BEZIERSHIFTDOWN(Points[2].y-Points[0].y)) > BEZIERPIXEL )
+            return FALSE;
+        else
+            return TRUE;
     }
-#endif
-    return FALSE;
-    
 }
     
 /***********************************************************************
@@ -1021,24 +1010,31 @@
  *   Draw a -what microsoft calls- bezier curve
  *   The routine recursively devides the curve
  *   in two parts until a straight line can be drawn
+ *
+ *   level      recusion depth counted backwards
+ *   dc         device context
+ *   Points     array of begin(0), end(3) and control points(1 and 2)
+ *   XPoints    array with points calculated sofar
+ *   *pIx       nr points calculated sofar
+ *   
  */
 static void X11DRV_Bezier(int level, DC * dc, POINT32 *Points, 
-                          XPoint* xpoints, unsigned int* pix)
+                          XPoint* xpoints, unsigned int* pIx)
 {
-    if(*pix == BEZMAXPOINTS){
+    if(*pIx == BEZMAXPOINTS){
         TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
-                    xpoints, *pix, CoordModeOrigin );
-        *pix=0;
+                    xpoints, *pIx, CoordModeOrigin );
+        *pIx=0;
     }
     if(!level || BezierCheck(level, Points)) {
-        if(*pix == 0){
-            xpoints[*pix].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[0].x);
-            xpoints[*pix].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[0].y);
-            *pix=1;
+        if(*pIx == 0){
+            xpoints[*pIx].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[0].x);
+            xpoints[*pIx].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[0].y);
+            *pIx=1;
         }
-        xpoints[*pix].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[3].x);
-        xpoints[*pix].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[3].y);
-        (*pix) ++;
+        xpoints[*pIx].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[3].x);
+        xpoints[*pIx].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[3].y);
+        (*pIx) ++;
     } else {
         POINT32 Points2[4]; /* for the second recursive call */
         Points2[3]=Points[3];
@@ -1053,8 +1049,8 @@
         Points2[0]=Points[3];
 
         /* do the two halves */
-        X11DRV_Bezier(level-1, dc, Points, xpoints, pix);
-        X11DRV_Bezier(level-1, dc, Points2, xpoints, pix);
+        X11DRV_Bezier(level-1, dc, Points, xpoints, pIx);
+        X11DRV_Bezier(level-1, dc, Points2, xpoints, pIx);
     }
 }
 
@@ -1081,9 +1077,9 @@
             (Points+0)->x, (Points+0)->y, 
             (Points+1)->x, (Points+1)->y, 
             (Points+2)->x, (Points+2)->y); 
-    if(!count || count % 3){
+    if(!count || count % 3){/* paranoid */
         WARN(graphics," bad value for count : %ld\n", count);
-        return FALSE; /* paranoid */
+        return FALSE; 
     }
     xpoints=(XPoint*) xmalloc( sizeof(XPoint)*BEZMAXPOINTS);
     Points[3].x=BEZIERSHIFTUP(XLPTODP(dc,start.x));
@@ -1100,8 +1096,6 @@
     }
     if( ix) TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
                 xpoints, ix, CoordModeOrigin );
-//    fprintf(stderr," ix is %d\n",ix);
     free(xpoints);
     return TRUE;
 }
-/***************************END OF WORK IN PROGRESS ********************/
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index edefaf7..7120689 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -29,7 +29,7 @@
 #define X_PFONT_MAGIC		(0xFADE0000)
 #define X_FMC_MAGIC		(0x0000CAFE)
 
-#define MAX_FONT_FAMILIES	64
+#define MAX_FONT_FAMILIES	128
 #define MAX_LFD_LENGTH		256
 
 #define REMOVE_SUBSETS		1
@@ -575,7 +575,7 @@
         Atom RAW_CAP_HEIGHT = TSXInternAtom(display, "RAW_CAP_HEIGHT", TRUE);
 	if(TSXGetFontProperty(x_fs, RAW_CAP_HEIGHT, &height))
 	    *pIL = XFT->ascent - 
-                            (INT32)(hypotf(XFT->a, XFT->b) / 1000.0 * height);
+                            (INT32)(XFT->pixelsize / 1000.0 * height);
 	else
 	    *pIL = 0;
 	return bHaveCapHeight && x_fs->per_char;
@@ -2015,7 +2015,7 @@
   XGetFontProperty( pfo->fs, RAW_ASCENT, &PX->RAW_ASCENT );
   XGetFontProperty( pfo->fs, RAW_DESCENT, &PX->RAW_DESCENT );
 
-  PX->pixelsize = hypotf(PX->a, PX->b);
+  PX->pixelsize = hypot(PX->a, PX->b);
   PX->ascent = PX->pixelsize / 1000.0 * PX->RAW_ASCENT;
   PX->descent = PX->pixelsize / 1000.0 * PX->RAW_DESCENT;