IDirectDraw,IDirectDraw2,IDirectDraw4 fixed up in regard to COM usage.

diff --git a/dlls/ddraw/d3ddevice/mesa.c b/dlls/ddraw/d3ddevice/mesa.c
index 12e2a72..de9e888 100644
--- a/dlls/ddraw/d3ddevice/mesa.c
+++ b/dlls/ddraw/d3ddevice/mesa.c
@@ -28,7 +28,7 @@
 #undef HAVE_BUGGY_MESAGL
 
 #define D3DDPRIVATE(x) mesa_d3dd_private *odev=((mesa_d3dd_private*)x->private)
-#define DDPRIVATE(x) x11_dd_private *ddpriv=((x11_dd_private*)(x)->private)
+#define DDPRIVATE(x) x11_dd_private *ddpriv=((x11_dd_private*)(x)->d->private)
 
 static const float id_mat[16] = {
   1.0, 0.0, 0.0, 0.0,
diff --git a/dlls/ddraw/ddraw/dga.c b/dlls/ddraw/ddraw/dga.c
index a7b6b6a..1a98547 100644
--- a/dlls/ddraw/ddraw/dga.c
+++ b/dlls/ddraw/ddraw/dga.c
@@ -51,7 +51,7 @@
 static XF86VidModeModeInfo *orig_mode = NULL;
 #endif
 
-#define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->private)
+#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)
 
 /*******************************************************************************
@@ -99,9 +99,9 @@
     dsurf->s.surface_desc = *lpddsd;
 
     if (!(lpddsd->dwFlags & DDSD_WIDTH))
-	dsurf->s.surface_desc.dwWidth  = This->d.width;
+	dsurf->s.surface_desc.dwWidth  = This->d->width;
     if (!(lpddsd->dwFlags & DDSD_HEIGHT))
-	dsurf->s.surface_desc.dwHeight = This->d.height;
+	dsurf->s.surface_desc.dwHeight = This->d->height;
 
     dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT;
 
@@ -118,7 +118,7 @@
 	/* if i == 32 or maximum ... return error */
 	ddpriv->vpmask|=(1<<i);
 	lpddsd->lPitch = dsurf->s.surface_desc.lPitch = 
-		ddpriv->fb_width*PFGET_BPP(This->d.directdraw_pixelformat);
+		ddpriv->fb_width*PFGET_BPP(This->d->directdraw_pixelformat);
 
 	dsurf->s.surface_desc.u1.lpSurface =
 	    ddpriv->fb_addr + i*fbheight*lpddsd->lPitch;
@@ -127,12 +127,12 @@
 
 	/* Add flags if there were not present */
 	dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT;
-	dsurf->s.surface_desc.dwWidth = This->d.width;
-	dsurf->s.surface_desc.dwHeight = This->d.height;
-	TRACE("primary surface: dwWidth=%ld, dwHeight=%ld, lPitch=%ld\n",This->d.width,This->d.height,lpddsd->lPitch);
+	dsurf->s.surface_desc.dwWidth = This->d->width;
+	dsurf->s.surface_desc.dwHeight = This->d->height;
+	TRACE("primary surface: dwWidth=%ld, dwHeight=%ld, lPitch=%ld\n",This->d->width,This->d->height,lpddsd->lPitch);
 	/* We put our surface always in video memory */
 	SDDSCAPS(dsurf) |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY;
-	dsurf->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat;
+	dsurf->s.surface_desc.ddpfPixelFormat = This->d->directdraw_pixelformat;
 	dsurf->s.chain = NULL;
 
 	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
@@ -221,12 +221,12 @@
 	return DDERR_UNSUPPORTEDMODE;
     }
 
-    if (This->d.width < width) {
-	ERR("SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,This->d.width);
+    if (This->d->width < width) {
+	ERR("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;
-    This->d.height	= height;
+    This->d->width	= width;
+    This->d->height	= height;
 
     /* adjust fb_height, so we don't overlap */
     if (ddpriv->fb_height < height)
@@ -373,7 +373,7 @@
     dppriv = (dga_dp_private*)ddpal->private;
 
     ICOM_VTBL(ddpal)= &dga_ddpalvt;
-    if (This->d.directdraw_pixelformat.u.dwRGBBitCount<=8) {
+    if (This->d->directdraw_pixelformat.u.dwRGBBitCount<=8) {
 	dppriv->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(X11DRV_GetXScreen()),AllocAll);
     } else {
 	ERR("why are we doing CreatePalette in hi/truecolor?\n");
@@ -411,29 +411,32 @@
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
-      VirtualFree(ddpriv->fb_addr, 0, MEM_RELEASE);
-      TSXF86DGADirectVideo(display,DefaultScreen(display),0);
-      if (This->d.window && GetPropA(This->d.window,ddProp))
-	DestroyWindow(This->d.window);
+      if (!--(This->d->ref)) {
+	  VirtualFree(ddpriv->fb_addr, 0, MEM_RELEASE);
+	  TSXF86DGADirectVideo(display,DefaultScreen(display),0);
+	  if (This->d->window && GetPropA(This->d->window,ddProp))
+	    DestroyWindow(This->d->window);
 #ifdef HAVE_LIBXXF86VM
-      if (orig_mode) {
-	TSXF86VidModeSwitchToMode(
-				  display,
-				  DefaultScreen(display),
-				  orig_mode
-				  );
-	if (orig_mode->privsize)
-		TSXFree(orig_mode->private);		
-	free(orig_mode);
-	orig_mode = NULL;
-      }
+	  if (orig_mode) {
+	    TSXF86VidModeSwitchToMode(
+				      display,
+				      DefaultScreen(display),
+				      orig_mode
+				      );
+	    if (orig_mode->privsize)
+		    TSXFree(orig_mode->private);		
+	    free(orig_mode);
+	    orig_mode = NULL;
+	  }
 #endif
-	
+	    
 #ifdef RESTORE_SIGNALS
-	SIGNAL_Init();
+	  SIGNAL_Init();
 #endif
-	HeapFree(GetProcessHeap(),0,This);
-	return S_OK;
+	  HeapFree(GetProcessHeap(),0,This->d);
+      }
+      HeapFree(GetProcessHeap(),0,This);
+      return S_OK;
     }
     return This->ref;
 }
@@ -453,30 +456,31 @@
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) {
-	ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_ddvt;
-	IDirectDraw2_AddRef(iface);
-	*obj = This;
+	IDirectDrawImpl	*dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
+	ICOM_VTBL(dd) = &dga_ddvt;dd->ref = 1;dd->d = This->d;This->d++;
+	*obj = dd;
 
+	IDirectDraw2_AddRef(iface);
 	TRACE("  Creating IDirectDraw interface (%p)\n", *obj);
 	
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) {
-	ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd2vt;
+	IDirectDraw2Impl	*dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
+	ICOM_VTBL(dd) = &dga_dd2vt;dd->ref = 1;dd->d = This->d;This->d++;
+	*obj = dd;
+
 	IDirectDraw2_AddRef(iface);
-	*obj = This;
-
 	TRACE("  Creating IDirectDraw2 interface (%p)\n", *obj);
-
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) {
-	ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd4vt;
+	IDirectDraw2Impl	*dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
+	ICOM_VTBL(dd) = &dga_dd2vt;dd->ref = 1;dd->d = This->d;This->d++;
+	*obj = dd;
+
 	IDirectDraw2_AddRef(iface);
-	*obj = This;
-
 	TRACE("  Creating IDirectDraw4 interface (%p)\n", *obj);
-
 	return S_OK;
     }
     FIXME("(%p):interface for IID %s _NOT_ found!\n",This,debugstr_guid(refiid));
@@ -579,13 +583,13 @@
 
     TRACE("(%p)->(%p)\n",This,lpddsfd);
     lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
-    lpddsfd->dwHeight = This->d.height;
-    lpddsfd->dwWidth = This->d.width;
-    lpddsfd->lPitch = ddpriv->fb_width*PFGET_BPP(This->d.directdraw_pixelformat);
+    lpddsfd->dwHeight = This->d->height;
+    lpddsfd->dwWidth = This->d->width;
+    lpddsfd->lPitch = ddpriv->fb_width*PFGET_BPP(This->d->directdraw_pixelformat);
     lpddsfd->dwBackBufferCount = 2;
     lpddsfd->u.dwRefreshRate = 60;
     lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
-    lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat;
+    lpddsfd->ddpfPixelFormat = This->d->directdraw_pixelformat;
     if (TRACE_ON(ddraw))
 	_dump_surface_desc(lpddsfd);
     return DD_OK;
diff --git a/dlls/ddraw/ddraw/dga2.c b/dlls/ddraw/ddraw/dga2.c
index bb5cc9c..2c60201 100644
--- a/dlls/ddraw/ddraw/dga2.c
+++ b/dlls/ddraw/ddraw/dga2.c
@@ -29,7 +29,7 @@
 struct ICOM_VTABLE(IDirectDraw2)	dga2_dd2vt;
 struct ICOM_VTABLE(IDirectDraw4)	dga2_dd4vt;
 
-#define DDPRIVATE(x) dga2_dd_private *ddpriv = ((dga2_dd_private*)(x)->private)
+#define DDPRIVATE(x) dga2_dd_private *ddpriv = ((dga2_dd_private*)(x)->d->private)
 #define DPPRIVATE(x) dga2_dp_private *dppriv = ((dga2_dp_private*)(x)->private)
 
 /*******************************************************************************
@@ -69,7 +69,7 @@
 }
 
 void _DGA2_Initialize_FrameBuffer(IDirectDrawImpl *This, int mode) {
-    DDPIXELFORMAT *pf = &(This->d.directdraw_pixelformat);
+    DDPIXELFORMAT *pf = &(This->d->directdraw_pixelformat);
     DDPRIVATE(This);
 
     /* Now, get the device / mode description */
@@ -89,8 +89,8 @@
     /* Get the screen dimensions as seen by Wine.
      * In that case, it may be better to ignore the -desktop mode and return the
      * real screen size => print a warning */
-    This->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
-    This->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
+    This->d->height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
+    This->d->width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
     ddpriv->DGA.fb_addr = ddpriv->dev->data;
     ddpriv->DGA.fb_memsize = (ddpriv->dev->mode.imageWidth *
 			      ddpriv->dev->mode.imageHeight *
@@ -113,7 +113,7 @@
 	pf->u3.dwBBitMask = ddpriv->dev->mode.blueMask;
     }
     pf->u4.dwRGBAlphaBitMask= 0;
-    This->d.screen_pixelformat = *pf; 
+    This->d->screen_pixelformat = *pf; 
 }
 
 static HRESULT WINAPI DGA2_IDirectDrawImpl_SetDisplayMode(
@@ -185,7 +185,7 @@
     dppriv = (dga_dp_private*)ddpal->private;
 
     ICOM_VTBL(ddpal)= &dga_ddpalvt;
-    if (This->d.directdraw_pixelformat.u.dwRGBBitCount<=8) {
+    if (This->d->directdraw_pixelformat.u.dwRGBBitCount<=8) {
 	dppriv->cm = TSXDGACreateColormap(display,DefaultScreen(display), ddpriv->dev, AllocAll);
     } else {
 	ERR("why are we doing CreatePalette in hi/truecolor?\n");
@@ -223,23 +223,25 @@
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
-      TRACE("Closing access to the FrameBuffer\n");
-      VirtualFree(ddpriv->DGA.fb_addr, 0, MEM_RELEASE);
-      TSXDGACloseFramebuffer(display, DefaultScreen(display));
-      TRACE("Going back to normal X mode of operation\n");
-      TSXDGASetMode(display, DefaultScreen(display), 0);
+      if (!--(This->d->ref)) {
+	  TRACE("Closing access to the FrameBuffer\n");
+	  VirtualFree(ddpriv->DGA.fb_addr, 0, MEM_RELEASE);
+	  TSXDGACloseFramebuffer(display, DefaultScreen(display));
+	  TRACE("Going back to normal X mode of operation\n");
+	  TSXDGASetMode(display, DefaultScreen(display), 0);
 
-      /* Set the input handling back to absolute */
-      X11DRV_EVENT_SetInputMethod(X11DRV_INPUT_ABSOLUTE);
-      
-      /* Remove the handling of DGA2 events */
-      X11DRV_EVENT_SetDGAStatus(0, -1);
-      
-      /* Free the modes list */
-      TSXFree(ddpriv->modes);
-
+	  /* Set the input handling back to absolute */
+	  X11DRV_EVENT_SetInputMethod(X11DRV_INPUT_ABSOLUTE);
+	  
+	  /* Remove the handling of DGA2 events */
+	  X11DRV_EVENT_SetDGAStatus(0, -1);
+	  
+	  /* Free the modes list */
+	  TSXFree(ddpriv->modes);
+          HeapFree(GetProcessHeap(),0,This->d);
+      }
       HeapFree(GetProcessHeap(),0,This);
-      return S_OK;
+      return 0;
     }
     return This->ref;
 }
diff --git a/dlls/ddraw/ddraw/main.c b/dlls/ddraw/ddraw/main.c
index 93dbe81..ec4861e 100644
--- a/dlls/ddraw/ddraw/main.c
+++ b/dlls/ddraw/ddraw/main.c
@@ -46,7 +46,7 @@
 
     FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel);
     _dump_cooperativelevel(cooplevel);
-    This->d.mainWindow = hwnd;
+    This->d->mainWindow = hwnd;
     return DD_OK;
 }
 
@@ -60,45 +60,45 @@
     RECT	rect;
 
     /* Do destroy only our window */
-    if (This->d.window && GetPropA(This->d.window,ddProp)) {
-	DestroyWindow(This->d.window);
-	This->d.window = 0;
+    if (This->d->window && GetPropA(This->d->window,ddProp)) {
+	DestroyWindow(This->d->window);
+	This->d->window = 0;
     }
     /* Sanity check cooperative window before assigning it to drawing. */
-    if (IsWindow(This->d.mainWindow) &&
-	IsWindowVisible(This->d.mainWindow)
+    if (IsWindow(This->d->mainWindow) &&
+	IsWindowVisible(This->d->mainWindow)
     ) {
-	GetWindowRect(This->d.mainWindow,&rect);
-	if ((((rect.right-rect.left) >= This->d.width)	&&
-	     ((rect.bottom-rect.top) >= This->d.height))
+	GetWindowRect(This->d->mainWindow,&rect);
+	if ((((rect.right-rect.left) >= This->d->width)	&&
+	     ((rect.bottom-rect.top) >= This->d->height))
 	) {
-	    This->d.window = This->d.mainWindow;
+	    This->d->window = This->d->mainWindow;
 	    /* FIXME: resizing is not windows compatible behaviour, need test */
-	    /* SetWindowPos(This->d.mainWindow,HWND_TOPMOST,0,0,This->d.width,This->d.height,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); */
-	    This->d.paintable = 1; /* don't wait for WM_PAINT */
+	    /* SetWindowPos(This->d->mainWindow,HWND_TOPMOST,0,0,This->d->width,This->d->height,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); */
+	    This->d->paintable = 1; /* don't wait for WM_PAINT */
 	}
     }
     /* ... failed, create new one. */
-    if (!This->d.window) {
-	This->d.window = CreateWindowExA(
+    if (!This->d->window) {
+	This->d->window = CreateWindowExA(
 	    0,
 	    "WINE_DirectDraw",
 	    "WINE_DirectDraw",
 	    WS_POPUP,
 	    0,0,
-	    This->d.width,
-	    This->d.height,
+	    This->d->width,
+	    This->d->height,
 	    0,
 	    0,
 	    0,
 	    NULL
 	);
 	/*Store THIS with the window. We'll use it in the window procedure*/
-	SetPropA(This->d.window,ddProp,(LONG)This);
-	ShowWindow(This->d.window,TRUE);
-	UpdateWindow(This->d.window);
+	SetPropA(This->d->window,ddProp,(LONG)This);
+	ShowWindow(This->d->window,TRUE);
+	UpdateWindow(This->d->window);
     }
-    SetFocus(This->d.window);
+    SetFocus(This->d->window);
 }
 
 HRESULT WINAPI IDirectDrawImpl_SetDisplayMode(
@@ -107,8 +107,8 @@
         ICOM_THIS(IDirectDrawImpl,iface);
 
 	FIXME("(%p)->SetDisplayMode(%ld,%ld,%ld), needs to be implemented for your display adapter!\n",This,width,height,depth);
-	This->d.width	= width;
-	This->d.height	= height;
+	This->d->width	= width;
+	This->d->height	= height;
 	_common_IDirectDrawImpl_SetDisplayMode(This);
 	return DD_OK;
 }
@@ -192,7 +192,7 @@
 	ERR("unhandled palette format\n");
 
     *psize = size;
-    if (This->d.palette_convert == NULL) {
+    if (This->d->palette_convert == NULL) {
 	/* No depth conversion - create 8<->8 identity map */
 	int ent;
 	for (ent=0; ent<256; ent++)
@@ -200,11 +200,11 @@
     }
     if (palent) {
 	/* Now, if we are in depth conversion mode, create the screen palette */
-	if (This->d.palette_convert != NULL)	    
-	    This->d.palette_convert(palent,(*lpddpal)->screen_palents,0,size);
+	if (This->d->palette_convert != NULL)	    
+	    This->d->palette_convert(palent,(*lpddpal)->screen_palents,0,size);
 
 	memcpy((*lpddpal)->palents, palent, size * sizeof(PALETTEENTRY));
-    } else if (This->d.palette_convert != NULL) {
+    } else if (This->d->palette_convert != NULL) {
 	/* In that case, put all 0xFF */
 	memset((*lpddpal)->screen_palents, 0xFF, 256 * sizeof(int));
     }
@@ -253,8 +253,11 @@
     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
 
     if (!--(This->ref)) {
-	if (This->d.window && GetPropA(This->d.window,ddProp))
-	    DestroyWindow(This->d.window);
+	if (!--(This->d->ref)) {
+	    if (This->d->window && GetPropA(This->d->window,ddProp))
+		DestroyWindow(This->d->window);
+	    HeapFree(GetProcessHeap(),0,This->d);
+	}
 	HeapFree(GetProcessHeap(),0,This);
 	return S_OK;
     }
@@ -379,13 +382,13 @@
     ICOM_THIS(IDirectDraw2Impl,iface);
     TRACE("(%p)->GetDisplayMode(%p)\n",This,lpddsfd);
     lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
-    lpddsfd->dwHeight = This->d.height;
-    lpddsfd->dwWidth = This->d.width;
-    lpddsfd->lPitch =lpddsfd->dwWidth*PFGET_BPP(This->d.directdraw_pixelformat);
+    lpddsfd->dwHeight = This->d->height;
+    lpddsfd->dwWidth = This->d->width;
+    lpddsfd->lPitch =lpddsfd->dwWidth*PFGET_BPP(This->d->directdraw_pixelformat);
     lpddsfd->dwBackBufferCount = 2;
     lpddsfd->u.dwRefreshRate = 60;
     lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
-    lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat;
+    lpddsfd->ddpfPixelFormat = This->d->directdraw_pixelformat;
     if (TRACE_ON(ddraw))
 	_dump_surface_desc(lpddsfd);
     return DD_OK;
@@ -444,7 +447,7 @@
     FIXME("(%p)->(%p)\n", This, lpdwScanLine);
 
     if (lpdwScanLine)
-	*lpdwScanLine = 0;
+	*lpdwScanLine = 1;
     return DD_OK;
 }
 
@@ -543,7 +546,7 @@
 	/* This is a standard image */
 	if (!(lpdsf->s.surface_desc.dwFlags & DDSD_PIXELFORMAT)) {
 	    /* No pixel format => use DirectDraw's format */
-	    lpdsf->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat;
+	    lpdsf->s.surface_desc.ddpfPixelFormat = This->d->directdraw_pixelformat;
 	    lpdsf->s.surface_desc.dwFlags |= DDSD_PIXELFORMAT;
 	}
 	bpp = GET_BPP(lpdsf->s.surface_desc);
diff --git a/dlls/ddraw/ddraw/x11.c b/dlls/ddraw/ddraw/x11.c
index 5696668..41f525b 100644
--- a/dlls/ddraw/ddraw/x11.c
+++ b/dlls/ddraw/ddraw/x11.c
@@ -29,7 +29,7 @@
 
 #include "x11_private.h"
 
-#define DDPRIVATE(x) x11_dd_private *ddpriv = ((x11_dd_private*)(x)->private)
+#define DDPRIVATE(x) x11_dd_private *ddpriv = ((x11_dd_private*)(x)->d->private)
 #define DPPRIVATE(x) x11_dp_private *dppriv = ((x11_dp_private*)(x)->private)
 #define DSPRIVATE(x) x11_ds_private *dspriv = ((x11_ds_private*)(x)->private)
 
@@ -46,11 +46,11 @@
   int nvisuals, npixmap, i;
   int match = 0;
   int index = -2;
-  DDPIXELFORMAT *pixelformat = &(This->d.directdraw_pixelformat);
-  DDPIXELFORMAT *screen_pixelformat = &(This->d.screen_pixelformat);
+  DDPIXELFORMAT *pixelformat = &(This->d->directdraw_pixelformat);
+  DDPIXELFORMAT *screen_pixelformat = &(This->d->screen_pixelformat);
 
-  This->d.pixel_convert = NULL;
-  This->d.palette_convert = NULL;
+  This->d->pixel_convert = NULL;
+  This->d->palette_convert = NULL;
 
   vi = TSXGetVisualInfo(display, VisualNoMask, &vt, &nvisuals);
   pf = TSXListPixmapFormats(display, &npixmap);
@@ -76,17 +76,14 @@
 	  pixelformat->dwFourCC = 0;
 	  pixelformat->u.dwRGBBitCount = pf[i].bits_per_pixel;
 	  pixelformat->u4.dwRGBAlphaBitMask= 0;
-
 	  *screen_pixelformat = *pixelformat;
-
-	  This->d.pixmap_depth = vi[j].depth;
-
+	  This->d->pixmap_depth = depth;
 	  match = 1;
 	  index = -1;
 	  goto clean_up_and_exit;
 	}
       }
-      WARN("No visual corresponding to pixmap format !\n");
+      FIXME("No visual corresponding to pixmap format (depth=%ld)!\n",depth);
     }
   }
 
@@ -131,19 +128,19 @@
 		  pixelformat->u3.dwBBitMask = ModeEmulations[c].dest.bmask;
 		}
 		pixelformat->u4.dwRGBAlphaBitMask= 0;    
-		This->d.pixmap_depth = vi[j].depth;
+		This->d->pixmap_depth = vi[j].depth;
 		match = 2;
 		index = c;
-		This->d.pixel_convert  =ModeEmulations[c].funcs.pixel_convert;
-		This->d.palette_convert=ModeEmulations[c].funcs.palette_convert;
+		This->d->pixel_convert  =ModeEmulations[c].funcs.pixel_convert;
+		This->d->palette_convert=ModeEmulations[c].funcs.palette_convert;
 		goto clean_up_and_exit;
 	      }
-	      ERR("No visual corresponding to pixmap format !\n");
 	    }
 	  }
 	}
       }
     }
+    ERR("No emulation found for depth %ld!\n",depth);
   }
 
 clean_up_and_exit:
@@ -173,7 +170,7 @@
 
     img = TSXShmCreateImage(display,
 	DefaultVisualOfScreen(X11DRV_GetXScreen()),
-	This->d.pixmap_depth,
+	This->d->pixmap_depth,
 	ZPixmap,
 	NULL,
 	&(dspriv->shminfo),
@@ -188,6 +185,7 @@
     }
 
     dspriv->shminfo.shmid = shmget( IPC_PRIVATE, img->bytes_per_line * img->height, IPC_CREAT|0777 );
+
     if (dspriv->shminfo.shmid < 0) {
 	FIXME("Couldn't create shared memory segment (due to X11 remote display or failure).\nReverting to standard X images !\n");
 	ddpriv->xshm_active = 0;
@@ -247,8 +245,8 @@
 
     shmctl(dspriv->shminfo.shmid, IPC_RMID, 0);
 
-    if (This->d.pixel_convert != NULL) {
-	int bpp = PFGET_BPP(This->d.directdraw_pixelformat);
+    if (This->d->pixel_convert != NULL) {
+	int bpp = PFGET_BPP(This->d->directdraw_pixelformat);
 	lpdsf->s.surface_desc.u1.lpSurface = VirtualAlloc(
 	    NULL,
 	    lpdsf->s.surface_desc.dwWidth *
@@ -269,8 +267,8 @@
     XImage *img = NULL;
     DDPRIVATE(This);
     void *img_data;
-    int bpp = PFGET_BPP(This->d.directdraw_pixelformat);
-    int screen_bpp = PFGET_BPP(This->d.screen_pixelformat);
+    int bpp = PFGET_BPP(This->d->directdraw_pixelformat);
+    int screen_bpp = PFGET_BPP(This->d->screen_pixelformat);
     
 #ifdef HAVE_LIBXXSHM
     if (ddpriv->xshm_active)
@@ -288,7 +286,7 @@
 	    PAGE_READWRITE
 	);
 
-	if (This->d.pixel_convert != NULL)
+	if (This->d->pixel_convert != NULL)
 	    img_data = VirtualAlloc(
 		NULL,
 		lpdsf->s.surface_desc.dwWidth *
@@ -303,7 +301,7 @@
 	/* In this case, create an XImage */
 	img = TSXCreateImage(display,
 	    DefaultVisualOfScreen(X11DRV_GetXScreen()),
-	    This->d.pixmap_depth,
+	    This->d->pixmap_depth,
 	    ZPixmap,
 	    0,
 	    img_data,
@@ -315,7 +313,7 @@
 #ifdef HAVE_LIBXXSHM
     }
 #endif
-    if (This->d.pixel_convert != NULL)
+    if (This->d->pixel_convert != NULL)
 	lpdsf->s.surface_desc.lPitch = bpp*lpdsf->s.surface_desc.dwWidth;
     else
 	lpdsf->s.surface_desc.lPitch = img->bytes_per_line;
@@ -360,9 +358,9 @@
     dsurf->s.surface_desc = *lpddsd;
 
     if (!(lpddsd->dwFlags & DDSD_WIDTH))
-	dsurf->s.surface_desc.dwWidth  = This->d.width;
+	dsurf->s.surface_desc.dwWidth  = This->d->width;
     if (!(lpddsd->dwFlags & DDSD_HEIGHT))
-	dsurf->s.surface_desc.dwHeight = This->d.height;
+	dsurf->s.surface_desc.dwHeight = This->d->height;
     dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT;
 
     /* Check if this a 'primary surface' or not */
@@ -371,6 +369,13 @@
     ) {
 	XImage *img;
 
+	/* Add flags if there were not present */
+	dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT;
+	dsurf->s.surface_desc.dwWidth = This->d->width;
+	dsurf->s.surface_desc.dwHeight = This->d->height;
+	dsurf->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY;
+	dsurf->s.surface_desc.ddpfPixelFormat = This->d->directdraw_pixelformat;
+
 	TRACE("using standard XImage for a primary surface (%p)\n", dsurf);
 	/* Create the XImage */
 	img = create_ximage(This,(IDirectDrawSurface4Impl*)dsurf);
@@ -378,13 +383,6 @@
 	    return DDERR_OUTOFMEMORY;
 	dspriv->image = img;
 
-	/* Add flags if there were not present */
-	dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT;
-	dsurf->s.surface_desc.dwWidth = This->d.width;
-	dsurf->s.surface_desc.dwHeight = This->d.height;
-	dsurf->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY;
-	dsurf->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat;
-
 	/* Check for backbuffers */
 	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
 	    IDirectDrawSurface4Impl*	back;
@@ -457,7 +455,7 @@
     FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel);
     if (TRACE_ON(ddraw))
 	_dump_cooperativelevel(cooplevel);
-    This->d.mainWindow = hwnd;
+    This->d->mainWindow = hwnd;
 
     /* This will be overwritten in the case of Full Screen mode.
        Windowed games could work with that :-) */
@@ -499,13 +497,13 @@
       DPRINTF("DirectDraw warning: running in depth-conversion mode %d. Should run using a %ld depth for optimal performances.\n", c,depth);
     }
 	
-    This->d.width	= width;
-    This->d.height	= height;
+    This->d->width	= width;
+    This->d->height	= height;
 
     _common_IDirectDrawImpl_SetDisplayMode(This);
 
-    tmpWnd = WIN_FindWndPtr(This->d.window);
-    This->d.paintable = 1;
+    tmpWnd = WIN_FindWndPtr(This->d->window);
+    This->d->paintable = 1;
     ddpriv->drawable  = ((X11DRV_WND_DATA *) tmpWnd->pDriverData)->window;
     WIN_ReleaseWndPtr(tmpWnd);
 
@@ -593,20 +591,6 @@
     return DD_OK;
 }
 
-static ULONG WINAPI Xlib_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) {
-    ICOM_THIS(IDirectDraw2Impl,iface);
-    TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
-
-    if (!--(This->ref)) {
-	if (This->d.window && GetPropA(This->d.window,ddProp))
-	    DestroyWindow(This->d.window);
-	HeapFree(GetProcessHeap(),0,This);
-	return S_OK;
-    }
-    /* FIXME: destroy window ... */
-    return This->ref;
-}
-
 static HRESULT WINAPI Xlib_IDirectDraw2Impl_QueryInterface(
     LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj
 ) {
@@ -622,30 +606,32 @@
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) {
-	ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_ddvt;
+	IDirectDrawImpl	*dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
 	IDirectDraw2_AddRef(iface);
-	*obj = This;
+
+	dd->ref = 1;ICOM_VTBL(dd) = &xlib_ddvt;dd->d = This->d;This->d->ref++;
+	*obj = dd;
 
 	TRACE("  Creating IDirectDraw interface (%p)\n", *obj);
-	
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) {
-	ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd2vt;
+	IDirectDraw2Impl *dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
 	IDirectDraw2_AddRef(iface);
-	*obj = This;
+
+	dd->ref = 1;ICOM_VTBL(dd) = &xlib_dd2vt;dd->d = This->d;This->d->ref++;
+	*obj = dd;
 
 	TRACE("  Creating IDirectDraw2 interface (%p)\n", *obj);
-	
 	return S_OK;
     }
     if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) {
-	ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd4vt;
+	IDirectDraw4Impl *dd = HeapAlloc(GetProcessHeap(),0,sizeof(*dd));
+	dd->ref = 1;ICOM_VTBL(dd) = &xlib_dd4vt;dd->d = This->d;This->d->ref++;
+	*obj = dd;
+
 	IDirectDraw2_AddRef(iface);
-	*obj = This;
-
 	TRACE("  Creating IDirectDraw4 interface (%p)\n", *obj);
-
 	return S_OK;
     }
 #ifdef HAVE_OPENGL
@@ -851,24 +837,6 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetDisplayMode(
-    LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsfd
-) {
-    ICOM_THIS(IDirectDraw2Impl,iface);
-    TRACE("(%p)->GetDisplayMode(%p)\n",This,lpddsfd);
-    lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
-    lpddsfd->dwHeight = This->d.height;
-    lpddsfd->dwWidth = This->d.width;
-    lpddsfd->lPitch = lpddsfd->dwWidth * PFGET_BPP(This->d.directdraw_pixelformat);
-    lpddsfd->dwBackBufferCount = 2;
-    lpddsfd->u.dwRefreshRate = 60;
-    lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
-    lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat;
-    if (TRACE_ON(ddraw))
-	_dump_surface_desc(lpddsfd);
-    return DD_OK;
-}
-
 /* Note: Hack so we can reuse the old functions without compiler warnings */
 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
 # define XCAST(fun)	(typeof(xlib_ddvt.fn##fun))
@@ -880,7 +848,7 @@
     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface,
     XCAST(AddRef)IDirectDraw2Impl_AddRef,
-    XCAST(Release)Xlib_IDirectDraw2Impl_Release,
+    XCAST(Release)IDirectDraw2Impl_Release,
     XCAST(Compact)IDirectDraw2Impl_Compact,
     XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
     XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette,
@@ -890,7 +858,7 @@
     XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
     XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
     XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps,
-    XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode,
+    XCAST(GetDisplayMode)IDirectDraw2Impl_GetDisplayMode,
     XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes,
     XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
     XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
@@ -931,7 +899,7 @@
     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     Xlib_IDirectDraw2Impl_QueryInterface,
     IDirectDraw2Impl_AddRef,
-    Xlib_IDirectDraw2Impl_Release,
+    IDirectDraw2Impl_Release,
     IDirectDraw2Impl_Compact,
     IDirectDraw2Impl_CreateClipper,
     Xlib_IDirectDraw2Impl_CreatePalette,
@@ -941,7 +909,7 @@
     IDirectDraw2Impl_EnumSurfaces,
     IDirectDraw2Impl_FlipToGDISurface,
     Xlib_IDirectDraw2Impl_GetCaps,
-    Xlib_IDirectDraw2Impl_GetDisplayMode,
+    IDirectDraw2Impl_GetDisplayMode,
     IDirectDraw2Impl_GetFourCCCodes,
     IDirectDraw2Impl_GetGDISurface,
     IDirectDraw2Impl_GetMonitorFrequency,
@@ -965,7 +933,7 @@
     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface,
     XCAST(AddRef)IDirectDraw2Impl_AddRef,
-    XCAST(Release)Xlib_IDirectDraw2Impl_Release,
+    XCAST(Release)IDirectDraw2Impl_Release,
     XCAST(Compact)IDirectDraw2Impl_Compact,
     XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
     XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette,
@@ -975,7 +943,7 @@
     XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
     XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
     XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps,
-    XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode,
+    XCAST(GetDisplayMode)IDirectDraw2Impl_GetDisplayMode,
     XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes,
     XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
     XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 57e4b57..e51de50 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -52,6 +52,7 @@
  */
 struct _common_directdrawdata
 {
+    int		  ref;		/* for this structure, only once per obj */
     DDPIXELFORMAT directdraw_pixelformat;
     DDPIXELFORMAT screen_pixelformat;
 
@@ -66,6 +67,7 @@
     HWND          window;
     PAINTSTRUCT   ps;
     int           paintable;
+    LPVOID	  private;
 };
 
 /*****************************************************************************
@@ -79,26 +81,25 @@
     /* IUnknown fields */
     ICOM_VFIELD(IDirectDraw);
     DWORD				ref;
+
     /* IDirectDraw fields */
-    struct _common_directdrawdata	d;
-    LPVOID				private;
+    struct _common_directdrawdata	*d;
 };
-extern HRESULT WINAPI IDirectDrawImpl_SetDisplayMode(
-	LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth
-);
-/*
- * IDirectDraw2 implementation structure
- */
+
 struct IDirectDraw2Impl
 {
     /* IUnknown fields */
     ICOM_VFIELD(IDirectDraw2);
     DWORD				ref;
 
-    /* IDirectDraw2 fields */
-    struct _common_directdrawdata	d;
-    LPVOID				private;
+    /* IDirectDraw fields */
+    struct _common_directdrawdata	*d;
 };
+
+extern HRESULT WINAPI IDirectDrawImpl_SetDisplayMode(
+	LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth
+);
+
 extern HRESULT WINAPI IDirectDraw2Impl_DuplicateSurface(
 	LPDIRECTDRAW2 iface,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst
 );
@@ -175,9 +176,9 @@
     ICOM_VFIELD(IDirectDraw4);
     DWORD				ref;
     /* IDirectDraw4 fields */
-    struct _common_directdrawdata	d;
-    LPVOID				private;
+    struct _common_directdrawdata	*d;
 };
+
 extern HRESULT WINAPI IDirectDraw4Impl_GetSurfaceFromDC(
 	LPDIRECTDRAW4 iface, HDC hdc, LPDIRECTDRAWSURFACE *lpDDS
 );
diff --git a/dlls/ddraw/dga.c b/dlls/ddraw/dga.c
index 6464b4b..d5fbae8 100644
--- a/dlls/ddraw/dga.c
+++ b/dlls/ddraw/dga.c
@@ -123,10 +123,10 @@
     *lplpDD = (LPDIRECTDRAW)ddraw;
     ddraw->ref = 1;
     ICOM_VTBL(ddraw) = &dga_ddvt;
-    
-    ddraw->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(dga_dd_private));
-
-    dgpriv = (dga_dd_private*)ddraw->private;
+    ddraw->d = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*(ddraw->d)));
+    ddraw->d->ref = 1;
+    ddraw->d->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(dga_dd_private));
+    dgpriv = (dga_dd_private*)ddraw->d->private;
 
     TSXF86DGAQueryVersion(display,&major,&minor);
     TRACE("XF86DGA is version %d.%d\n",major,minor);
@@ -147,9 +147,9 @@
      * In that case, it may be better to ignore the -desktop mode and
      * return the real screen size => print a warning
      */
-    ddraw->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
-    ddraw->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
-    if ((ddraw->d.height != height) || (ddraw->d.width  != width))
+    ddraw->d->height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
+    ddraw->d->width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
+    if ((ddraw->d->height != height) || (ddraw->d->width  != width))
       WARN("You seem to be running in -desktop mode. This may prove dangerous in DGA mode...\n");
     dgpriv->fb_addr		= addr;
     dgpriv->fb_memsize	= memsize;
diff --git a/dlls/ddraw/dga2.c b/dlls/ddraw/dga2.c
index ea0f4c7..4964402 100644
--- a/dlls/ddraw/dga2.c
+++ b/dlls/ddraw/dga2.c
@@ -101,10 +101,12 @@
     *lplpDD = (LPDIRECTDRAW)ddraw;
     ddraw->ref = 1;
     ICOM_VTBL(ddraw) = &dga2_ddvt;
-    
-    ddraw->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(dga2_dd_private));
 
-    dgpriv = (dga2_dd_private*)ddraw->private;
+    ddraw->d = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*(ddraw->d)));
+    ddraw->d->ref = 1;
+    ddraw->d->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(dga2_dd_private));
+
+    dgpriv = (dga2_dd_private*)ddraw->d->private;
     
     TSXDGAQueryVersion(display,&major,&minor);
     TRACE("XDGA is version %d.%d\n",major,minor);
@@ -157,7 +159,7 @@
     /* Initialize the frame buffer */
     _DGA2_Initialize_FrameBuffer(ddraw, mode_to_use);
 
-    /* Register frame buffer with the kernel, it is as a potential DIB section */
+    /* Register frame buffer with the kernel, it is a potential DIB section */
     VirtualAlloc(dgpriv->DGA.fb_addr, dgpriv->DGA.fb_memsize, MEM_RESERVE|MEM_SYSTEM, PAGE_READWRITE);
     
     /* Set the input handling for relative mouse movements */
diff --git a/dlls/ddraw/dpalette/dga.c b/dlls/ddraw/dpalette/dga.c
index 698a491..411c800 100644
--- a/dlls/ddraw/dpalette/dga.c
+++ b/dlls/ddraw/dpalette/dga.c
@@ -19,7 +19,7 @@
 DEFAULT_DEBUG_CHANNEL(ddraw);
 
 #define DPPRIVATE(x) dga_dp_private *dppriv = ((dga_dp_private*)(x)->private)
-#define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->private)
+#define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->d->private)
 
 HRESULT WINAPI DGA_IDirectDrawPaletteImpl_SetEntries(
     LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent
diff --git a/dlls/ddraw/dpalette/main.c b/dlls/ddraw/dpalette/main.c
index c7ce5dc..12b2dba 100644
--- a/dlls/ddraw/dpalette/main.c
+++ b/dlls/ddraw/dpalette/main.c
@@ -52,8 +52,8 @@
 
     /* Now, if we are in 'depth conversion mode', update the screen palette */
     /* FIXME: we need to update the image or we won't get palette fading. */
-    if (This->ddraw->d.palette_convert != NULL)
-	This->ddraw->d.palette_convert(palent,This->screen_palents,start,count);
+    if (This->ddraw->d->palette_convert != NULL)
+	This->ddraw->d->palette_convert(palent,This->screen_palents,start,count);
     return DD_OK;
 }
 
diff --git a/dlls/ddraw/dpalette/x11.c b/dlls/ddraw/dpalette/x11.c
index 704518d..bebe698 100644
--- a/dlls/ddraw/dpalette/x11.c
+++ b/dlls/ddraw/dpalette/x11.c
@@ -51,8 +51,8 @@
 
     /* Now, if we are in 'depth conversion mode', update the screen palette */
     /* FIXME: we need to update the image or we won't get palette fading. */
-    if (This->ddraw->d.palette_convert != NULL) {
-	This->ddraw->d.palette_convert(palent,This->screen_palents,start,count);
+    if (This->ddraw->d->palette_convert != NULL) {
+	This->ddraw->d->palette_convert(palent,This->screen_palents,start,count);
     }
     return DD_OK;
 }
diff --git a/dlls/ddraw/dsurface/dga.c b/dlls/ddraw/dsurface/dga.c
index 486db6d..df8a377 100644
--- a/dlls/ddraw/dsurface/dga.c
+++ b/dlls/ddraw/dsurface/dga.c
@@ -19,7 +19,7 @@
 
 DEFAULT_DEBUG_CHANNEL(ddraw);
 
-#define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->private)
+#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)
 #define DSPRIVATE(x) dga_ds_private *dspriv = ((dga_ds_private*)(x)->private)
 
diff --git a/dlls/ddraw/dsurface/dga2.c b/dlls/ddraw/dsurface/dga2.c
index e208035..0e7ae8d 100644
--- a/dlls/ddraw/dsurface/dga2.c
+++ b/dlls/ddraw/dsurface/dga2.c
@@ -17,7 +17,7 @@
 
 DEFAULT_DEBUG_CHANNEL(ddraw);
 
-#define DDPRIVATE(x) dga2_dd_private *ddpriv = ((dga2_dd_private*)(x)->private)
+#define DDPRIVATE(x) dga2_dd_private *ddpriv = ((dga2_dd_private*)(x)->d->private)
 #define DPPRIVATE(x) dga2_dp_private *dppriv = ((dga2_dp_private*)(x)->private)
 #define DSPRIVATE(x) dga2_ds_private *dspriv = ((dga2_ds_private*)(x)->private)
 
diff --git a/dlls/ddraw/dsurface/x11.c b/dlls/ddraw/dsurface/x11.c
index 07a5bdb..7dbdf3d 100644
--- a/dlls/ddraw/dsurface/x11.c
+++ b/dlls/ddraw/dsurface/x11.c
@@ -28,7 +28,7 @@
 
 #define VISIBLE(x) (SDDSCAPS(x) & (DDSCAPS_VISIBLE|DDSCAPS_PRIMARYSURFACE))
 
-#define DDPRIVATE(x) x11_dd_private *ddpriv = ((x11_dd_private*)(x)->private)
+#define DDPRIVATE(x) x11_dd_private *ddpriv = ((x11_dd_private*)(x)->d->private)
 #define DPPRIVATE(x) x11_dp_private *dppriv = ((x11_dp_private*)(x)->private)
 #define DSPRIVATE(x) x11_ds_private *dspriv = ((x11_ds_private*)(x)->private)
 
@@ -93,10 +93,10 @@
     ICOM_THIS(IDirectDrawSurface4Impl,iface);
     DSPRIVATE(This);
     DDPRIVATE(This->s.ddraw);
-    
+
     /* DO NOT AddRef the surface! Lock/Unlock are NOT guaranteed to come in 
      * matched pairs! - Marcus Meissner 20000509 */
-    TRACE("(%p)->Lock(%p,%p,%08lx,%08lx)\n",This,lprect,lpddsd,flags,(DWORD)hnd);
+    TRACE("(%p)->Lock(%p,%p,%08lx,%08lx) ret=%p\n",This,lprect,lpddsd,flags,(DWORD)hnd,__builtin_return_address(0));
     if (flags & ~(DDLOCK_WAIT|DDLOCK_READONLY|DDLOCK_WRITEONLY))
 	WARN("(%p)->Lock(%p,%p,%08lx,%08lx)\n",
 		     This,lprect,lpddsd,flags,(DWORD)hnd);
@@ -159,7 +159,6 @@
 static void Xlib_copy_surface_on_screen(IDirectDrawSurface4Impl* This) {
   DSPRIVATE(This);
   DDPRIVATE(This->s.ddraw);
-
   Drawable drawable = ddpriv->drawable;
   POINT adjust[2] = {{0, 0}, {0, 0}};
   SIZE imgsiz;
@@ -194,8 +193,8 @@
     WIN_ReleaseWndPtr(wndPtr);
   }
   
-  if (This->s.ddraw->d.pixel_convert != NULL)
-    This->s.ddraw->d.pixel_convert(This->s.surface_desc.u1.lpSurface,
+  if (This->s.ddraw->d->pixel_convert != NULL)
+    This->s.ddraw->d->pixel_convert(This->s.surface_desc.u1.lpSurface,
 				   dspriv->image->data,
 				   This->s.surface_desc.dwWidth,
 				   This->s.surface_desc.dwHeight,
@@ -272,7 +271,7 @@
     IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
 
     TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
-    if (!This->s.ddraw->d.paintable)
+    if (!This->s.ddraw->d->paintable)
 	return DD_OK;
 
     iflipto = _common_find_flipto(This,iflipto);
@@ -339,7 +338,7 @@
     dppriv = (x11_dp_private*)ipal->private;
 
     if (!dppriv->cm &&
-	(This->s.ddraw->d.screen_pixelformat.u.dwRGBBitCount<=8)
+	(This->s.ddraw->d->screen_pixelformat.u.dwRGBBitCount<=8)
     ) {
 	dppriv->cm = TSXCreateColormap(
 	    display,
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index ffc878a..251ffd9 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -213,29 +213,29 @@
     if( ddraw ) {
     /* Perform any special direct draw functions */
 	if (msg==WM_PAINT)
-	    ddraw->d.paintable = 1;
+	    ddraw->d->paintable = 1;
 
 	/* Now let the application deal with the rest of this */
-	if( ddraw->d.mainWindow ) {
+	if( ddraw->d->mainWindow ) {
 
 	    /* Don't think that we actually need to call this but... 
 	     * might as well be on the safe side of things...
 	     */
 
-	    /* I changed hwnd to ddraw->d.mainWindow as I did not see why
+	    /* I changed hwnd to ddraw->d->mainWindow as I did not see why
 	     * it should be the procedures of our fake window that gets called
 	     * instead of those of the window provided by the application.
 	     * And with this patch, mouse clicks work with Monkey Island III
 	     * - Lionel
 	     */
-	    ret = DefWindowProcA( ddraw->d.mainWindow, msg, wParam, lParam );
+	    ret = DefWindowProcA( ddraw->d->mainWindow, msg, wParam, lParam );
 
 	    if( !ret ) {
-		WND *tmpWnd =WIN_FindWndPtr(ddraw->d.mainWindow);
+		WND *tmpWnd =WIN_FindWndPtr(ddraw->d->mainWindow);
 		/* We didn't handle the message - give it to the application */
-		if (ddraw && ddraw->d.mainWindow && tmpWnd)
+		if (ddraw && ddraw->d->mainWindow && tmpWnd)
 		    ret = CallWindowProcA(tmpWnd->winproc,
-		ddraw->d.mainWindow, msg, wParam, lParam );
+		ddraw->d->mainWindow, msg, wParam, lParam );
 		WIN_ReleaseWndPtr(tmpWnd);
 	    }
 	    return ret;
@@ -320,7 +320,7 @@
     wc.hbrBackground	= NULL_BRUSH;
     wc.lpszMenuName 	= 0;
     wc.lpszClassName	= "WINE_DirectDraw";
-    (*ilplpDD)->d.winclass = RegisterClassA(&wc);
+    (*ilplpDD)->d->winclass = RegisterClassA(&wc);
     return ret;
 }
 
diff --git a/dlls/ddraw/x11.c b/dlls/ddraw/x11.c
index 117604c..4fd2039 100644
--- a/dlls/ddraw/x11.c
+++ b/dlls/ddraw/x11.c
@@ -61,12 +61,15 @@
     ddraw = (IDirectDrawImpl*)*lplpDD;
     ICOM_VTBL(ddraw)= &xlib_ddvt;
     ddraw->ref	= 1;
-    ddraw->private	= HeapAlloc(
+
+    ddraw->d = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*(ddraw->d)));
+    ddraw->d->ref = 1;
+    ddraw->d->private	= HeapAlloc(
 	GetProcessHeap(),
 	HEAP_ZERO_MEMORY,
 	sizeof(x11_dd_private)
     );
-    x11priv = (x11_dd_private*)ddraw->private;
+    x11priv = (x11_dd_private*)ddraw->d->private;
 
     /* At DirectDraw creation, the depth is the default depth */
     depth = DefaultDepthOfScreen(X11DRV_GetXScreen());
@@ -77,8 +80,8 @@
     case 0: MESSAGE("Conversion needed from %d.\n",depth); break;
     }
 
-    ddraw->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
-    ddraw->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
+    ddraw->d->height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
+    ddraw->d->width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
 #ifdef HAVE_LIBXXSHM
     /* Test if XShm is available. */
     if ((x11priv->xshm_active = DDRAW_XSHM_Available())) {