diff --git a/windows/x11drv/clipboard.c b/windows/x11drv/clipboard.c
index 880557e..ba98d17 100644
--- a/windows/x11drv/clipboard.c
+++ b/windows/x11drv/clipboard.c
@@ -64,7 +64,6 @@
 #include "windef.h"
 #include "x11drv.h"
 #include "bitmap.h"
-#include "commctrl.h"
 #include "heap.h"
 #include "options.h"
 #include "debugtools.h"
@@ -90,12 +89,14 @@
 static Atom selectionCacheSrc = XA_PRIMARY;    /* The selection source from which the clipboard cache was filled */
 static HANDLE selectionClearEvent = 0;/* Synchronization object used to block until server is started */
 
-/*
- * Dynamic pointer arrays to manage destruction of Pixmap resources
- */
-static HDPA PropDPA = NULL;
-static HDPA PixmapDPA = NULL;
+typedef struct tagPROPERTY
+{
+    struct tagPROPERTY *next;
+    Atom                atom;
+    Pixmap              pixmap;
+} PROPERTY;
 
+static PROPERTY *prop_head;
 
 
 /**************************************************************************
@@ -833,22 +834,13 @@
     }
 
     /* Get rid of any Pixmap resources we may still have */
-    if (PropDPA)
-        DPA_Destroy( PropDPA );
-    if (PixmapDPA)
+    while (prop_head)
     {
-      int i;
-      Pixmap pixmap;
-      for( i = 0; ; i++ )
-      {
-        if ( (pixmap = ((Pixmap)DPA_GetPtr(PixmapDPA, i))) )
-          XFreePixmap(display, pixmap);
-        else
-          break;
-      }
-      DPA_Destroy( PixmapDPA );
+        PROPERTY *prop = prop_head;
+        prop_head = prop->next;
+        XFreePixmap( display, prop->pixmap );
+        HeapFree( GetProcessHeap(), 0, prop );
     }
-    PixmapDPA = PropDPA = NULL;
 }
 
 /**************************************************************************
@@ -895,12 +887,6 @@
 
         if (selectionAcquired)
         {
-            /* Create dynamic pointer arrays to manage Pixmap resources we may expose */
-            if (!PropDPA)
-                PropDPA = DPA_CreateEx( 2, SystemHeap );
-            if (!PixmapDPA)
-                PixmapDPA = DPA_CreateEx( 2, SystemHeap );
-            
 	    selectionWindow = owner;
 	    TRACE("Grabbed X selection, owner=(%08x)\n", (unsigned) owner);
         }
@@ -1217,13 +1203,13 @@
  */
 BOOL X11DRV_CLIPBOARD_RegisterPixmapResource( Atom property, Pixmap pixmap )
 {
-  if ( -1 == DPA_InsertPtr( PropDPA, 0, (void*)property ) )
-    return FALSE;
-    
-  if ( -1 == DPA_InsertPtr( PixmapDPA, 0, (void*)pixmap ) )
-    return FALSE;
-
-  return TRUE;
+    PROPERTY *prop = HeapAlloc( GetProcessHeap(), 0, sizeof(*prop) );
+    if (!prop) return FALSE;
+    prop->atom = property;
+    prop->pixmap = pixmap;
+    prop->next = prop_head;
+    prop_head = prop;
+    return TRUE;
 }
 
 /**************************************************************************
@@ -1237,28 +1223,18 @@
     /* Do a simple linear search to see if we have a Pixmap resource
      * associated with this property and release it.
      */
-    int i;
-    Pixmap pixmap;
-    Atom cacheProp = 0;
-    for( i = 0; ; i++ )
-    {
-        if ( !(cacheProp = ((Atom)DPA_GetPtr(PropDPA, i))) )
-            break;
-        
-        if ( cacheProp == property )
-        {
-            /* Lookup the associated Pixmap and free it */
-            pixmap = (Pixmap)DPA_GetPtr(PixmapDPA, i);
-  
-            TRACE("Releasing pixmap %ld for Property %s\n",
-                  (long)pixmap, TSXGetAtomName(display, cacheProp));
-            
-            XFreePixmap(display, pixmap);
+    PROPERTY **prop = &prop_head;
 
-            /* Free the entries from the table */
-            DPA_DeletePtr(PropDPA, i);
-            DPA_DeletePtr(PixmapDPA, i);
+    while (*prop)
+    {
+        if ((*prop)->atom == property)
+        {
+            PROPERTY *next = (*prop)->next;
+            XFreePixmap( display, (*prop)->pixmap );
+            HeapFree( GetProcessHeap(), 0, *prop );
+            *prop = next;
         }
+        else prop = &(*prop)->next;
     }
 }
 
