Partially repair hotspot handling.

diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index b4ed6f0..7aa5c3e 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -21,6 +21,11 @@
  *      ImageList_DrawIndirect. Since ImageList_DrawIndirect is still
  *      partially implemented, the functions mentioned above will be 
  *      limited in functionality too.
+ *
+ *    - Hotspot handling still not correct. The Hotspot passed to BeginDrag
+ *	is the offset of the image position relative to the actual mouse pointer
+ *	position. However the Hotspot passed to SetDragCursorImage is the
+ *	offset of the mouse messages sent to the application...
  */
 
 #include <stdlib.h>
@@ -53,9 +58,10 @@
     BOOL	bShow;
     /* saved background */
     HBITMAP	hbmBg;
+    BOOL	bHSPending;
 } INTERNALDRAG;
 
-static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, FALSE, 0 };
+static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, FALSE, 0, FALSE };
 
 
 
@@ -747,6 +753,7 @@
     DeleteDC (hdcDst);
 
     InternalDrag.himl->cCurImage = 1;
+    InternalDrag.bHSPending = TRUE;
 
     return TRUE;
 }
@@ -1071,10 +1078,16 @@
 BOOL WINAPI
 ImageList_DragLeave (HWND hwndLock)
 {
-    if (hwndLock)
+    /* As we don't save drag info in the window this can lead to problems if
+       an app does not supply the same window as DragEnter */
+    /* if (hwndLock)
 	InternalDrag.hwnd = hwndLock;
     else
-	InternalDrag.hwnd = GetDesktopWindow ();
+	InternalDrag.hwnd = GetDesktopWindow (); */
+    if(!hwndLock)
+	hwndLock = GetDesktopWindow();
+    if(InternalDrag.hwnd != hwndLock)
+	FIXME("DragLeave hWnd != DragEnter hWnd\n");
 
     ImageList_DragShowNolock (FALSE);
 
@@ -1489,6 +1502,7 @@
     InternalDrag.bShow = FALSE;
     DeleteObject(InternalDrag.hbmBg);
     InternalDrag.hbmBg = 0;
+    InternalDrag.bHSPending = FALSE;
 
     return TRUE;
 }
@@ -2600,8 +2614,14 @@
      * dxHotspot, dyHotspot is the offset of THE Hotspot (there is only one
      * hotspot) to the origin of the second image.
      * See M$DN for details */
-    dx = InternalDrag.dxHotspot - dxHotspot;
-    dy = InternalDrag.dyHotspot - dyHotspot;
+    if(InternalDrag.bHSPending) {
+	dx = 0;
+	dy = 0;
+	InternalDrag.bHSPending = FALSE;
+    } else {
+	dx = InternalDrag.dxHotspot - dxHotspot;
+	dy = InternalDrag.dyHotspot - dyHotspot;
+    }
     himlTemp = ImageList_Merge (InternalDrag.himl, 0, himlDrag, iDrag, dx, dy);
 
     if (visible) {
@@ -2620,12 +2640,10 @@
 
     /* update the InternalDragOffset, if the origin of the
      * DragImage was changed by ImageList_Merge. */
-    if (dx > InternalDrag.dxHotspot) {
-	InternalDrag.dxHotspot = dx;
-    }
-    if (dy > InternalDrag.dyHotspot) {
-	InternalDrag.dyHotspot = dy;
-    }
+    if (dx <= 0)
+	InternalDrag.dxHotspot = dxHotspot;
+    if (dy <= 0)
+	InternalDrag.dyHotspot = dyHotspot;
 
     if (visible) {
 	/* show the drag image */