Index: dlls/comctl32/listview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/listview.c,v
retrieving revision 1.430
diff -u -p -r1.430 listview.c
--- dlls/comctl32/listview.c	13 Sep 2005 14:30:53 -0000	1.430
+++ dlls/comctl32/listview.c	14 Sep 2005 13:00:01 -0000
@@ -430,7 +430,7 @@ static INT LISTVIEW_GetTopIndex(LISTVIEW
 static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *, INT, BOOL);
 static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, INT, INT, INT, INT, BOOL);
 static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *, INT, HIMAGELIST);
-static INT LISTVIEW_HitTest(LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL, BOOL);
+static INT LISTVIEW_HitTest(HWND hwnd, LPLVHITTESTINFO, BOOL, BOOL);
 
 /******** Text handling functions *************************************/
 
@@ -751,34 +751,41 @@ static LRESULT notify_forward_header(LIS
                         (WPARAM)lpnmh->hdr.idFrom, (LPARAM)lpnmh);
 }
 
-static LRESULT notify_hdr(LISTVIEW_INFO *infoPtr, INT code, LPNMHDR pnmh)
+static LRESULT notify_hdr(HWND hwnd, INT code, LPNMHDR pnmh)
 {
-    LRESULT result;
+    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0);
+    LRESULT result = 0;
     
     TRACE("(code=%d)\n", code);
 
-    pnmh->hwndFrom = infoPtr->hwndSelf;
-    pnmh->idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
-    pnmh->code = code;
-    result = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
-			  (WPARAM)pnmh->idFrom, (LPARAM)pnmh);
+    if (infoPtr) {
+        pnmh->hwndFrom = hwnd;
+        pnmh->idFrom = GetWindowLongPtrW(hwnd, GWLP_ID);
+        pnmh->code = code;
+        result = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
+                              (WPARAM)pnmh->idFrom, (LPARAM)pnmh);
+    }
 
     TRACE("  <= %ld\n", result);
 
     return result;
 }
 
-static inline LRESULT notify(LISTVIEW_INFO *infoPtr, INT code)
+static inline LRESULT notify(HWND hwnd, INT code)
 {
     NMHDR nmh;
-    return notify_hdr(infoPtr, code, &nmh);
+    return notify_hdr(hwnd, code, &nmh);
 }
 
-static inline void notify_itemactivate(LISTVIEW_INFO *infoPtr, LVHITTESTINFO *htInfo)
+static inline void notify_itemactivate(HWND hwnd, LVHITTESTINFO *htInfo)
 {
+    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0);
     NMITEMACTIVATE nmia;
     LVITEMW item;
 
+    if (!infoPtr)
+        return;
+    
     if (htInfo) {
       nmia.uNewState = 0;
       nmia.uOldState = 0;
@@ -803,21 +810,26 @@ static inline void notify_itemactivate(L
       if (GetKeyState(VK_CONTROL) & 0x8000) nmia.uKeyFlags |= LVKF_CONTROL;
       if (GetKeyState(VK_MENU) & 0x8000) nmia.uKeyFlags |= LVKF_ALT;
     }
-    notify_hdr(infoPtr, LVN_ITEMACTIVATE, (LPNMHDR)&nmia);
+    notify_hdr(hwnd, LVN_ITEMACTIVATE, (LPNMHDR)&nmia);
 }
 
 static inline LRESULT notify_listview(LISTVIEW_INFO *infoPtr, INT code, LPNMLISTVIEW plvnm)
 {
     TRACE("(code=%d, plvnm=%s)\n", code, debugnmlistview(plvnm));
-    return notify_hdr(infoPtr, code, (LPNMHDR)plvnm);
+    return notify_hdr(infoPtr->hwndSelf, code, (LPNMHDR)plvnm);
 }
 
-static LRESULT notify_click(LISTVIEW_INFO *infoPtr,  INT code, LVHITTESTINFO *lvht)
+static LRESULT notify_click(HWND hwnd, INT code, LVHITTESTINFO *lvht)
 {
+    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0);
     NMLISTVIEW nmlv;
     LVITEMW item;
-   
+  
     TRACE("code=%d, lvht=%s\n", code, debuglvhittestinfo(lvht)); 
+    
+    if (!infoPtr)
+        return 0;
+    
     ZeroMemory(&nmlv, sizeof(nmlv));
     nmlv.iItem = lvht->iItem;
     nmlv.iSubItem = lvht->iSubItem;
@@ -915,7 +927,7 @@ static BOOL notify_dispinfoT(LISTVIEW_IN
     else
 	realNotifCode = notificationCode;
     TRACE(" pdi->item=%s\n", debuglvitem_t(&pdi->item, infoPtr->notifyFormat != NFR_ANSI));
-    bResult = notify_hdr(infoPtr, realNotifCode, &pdi->hdr);
+    bResult = notify_hdr(infoPtr->hwndSelf, realNotifCode, &pdi->hdr);
 
     if (convertToUnicode || convertToAnsi)
     {
@@ -958,7 +970,7 @@ static inline DWORD notify_customdraw (L
     if (isForItem) lpnmlvcd->nmcd.dwDrawStage |= CDDS_ITEM; 
     if (lpnmlvcd->iSubItem) lpnmlvcd->nmcd.dwDrawStage |= CDDS_SUBITEM;
     if (isForItem) lpnmlvcd->nmcd.dwItemSpec--;
-    result = notify_hdr(infoPtr, NM_CUSTOMDRAW, &lpnmlvcd->nmcd.hdr);
+    result = notify_hdr(infoPtr->hwndSelf, NM_CUSTOMDRAW, &lpnmlvcd->nmcd.hdr);
     if (isForItem) lpnmlvcd->nmcd.dwItemSpec++;
     return result;
 }
@@ -3045,7 +3057,7 @@ static void LISTVIEW_AddGroupSelection(L
     nmlv.uNewState = 0;
     nmlv.uOldState = item.state;
 
-    notify_hdr(infoPtr, LVN_ODSTATECHANGED, (LPNMHDR)&nmlv);
+    notify_hdr(infoPtr->hwndSelf, LVN_ODSTATECHANGED, (LPNMHDR)&nmlv);
     infoPtr->bDoChangeNotify = bOldChange;
 }
 
@@ -3202,7 +3214,7 @@ static BOOL LISTVIEW_GetItemAtPt(LISTVIE
     lvHitTestInfo.pt.x = pt.x;
     lvHitTestInfo.pt.y = pt.y;
 
-    LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, FALSE);
+    LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, TRUE, FALSE);
 
     lpLVItem->mask = LVIF_PARAM;
     lpLVItem->iItem = lvHitTestInfo.iItem;
@@ -3268,7 +3280,7 @@ static LRESULT LISTVIEW_MouseMove(LISTVI
         NMLISTVIEW nmlv;
 
         lvHitTestInfo.pt = infoPtr->ptClickPos;
-        LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
+        LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, TRUE, TRUE);
 
         ZeroMemory(&nmlv, sizeof(nmlv));
         nmlv.iItem = lvHitTestInfo.iItem;
@@ -4027,7 +4039,7 @@ static void LISTVIEW_Refresh(LISTVIEW_IN
     	ZeroMemory(&nmlv, sizeof(NMLVCACHEHINT));
     	nmlv.iFrom = range.lower;
     	nmlv.iTo   = range.upper - 1;
-    	notify_hdr(infoPtr, LVN_ODCACHEHINT, &nmlv.hdr);
+        notify_hdr(infoPtr->hwndSelf, LVN_ODCACHEHINT, &nmlv.hdr);
     }
 
     if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT))
@@ -6029,17 +6041,21 @@ static INT LISTVIEW_GetStringWidthT(LIST
  *   SUCCESS : item index
  *   FAILURE : -1
  */
-static INT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL subitem, BOOL select)
+static INT LISTVIEW_HitTest(HWND hwnd, LPLVHITTESTINFO lpht, BOOL subitem, BOOL select)
 {
     WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
-    UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
+    UINT uView;
     RECT rcBox, rcBounds, rcState, rcIcon, rcLabel, rcSearch;
     POINT Origin, Position, opt;
     LVITEMW lvItem;
     ITERATOR i;
     INT iItem;
+    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0);
     
     TRACE("(pt=%s, subitem=%d, select=%d)\n", debugpoint(&lpht->pt), subitem, select);
+
+    if (!infoPtr)
+        return -1;
     
     lpht->flags = 0;
     lpht->iItem = -1;
@@ -6076,6 +6092,7 @@ static INT LISTVIEW_HitTest(LISTVIEW_INF
     TRACE("lpht->iItem=%d\n", iItem); 
     if (iItem == -1) return -1;
 
+    uView = infoPtr->dwStyle & LVS_TYPEMASK;
     lvItem.mask = LVIF_STATE | LVIF_TEXT;
     if (uView == LVS_REPORT) lvItem.mask |= LVIF_INDENT;
     lvItem.stateMask = LVIS_STATEIMAGEMASK;
@@ -7973,15 +7990,15 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW
   /* send LVN_KEYDOWN notification */
   nmKeyDown.wVKey = nVirtualKey;
   nmKeyDown.flags = 0;
-  notify_hdr(infoPtr, LVN_KEYDOWN, &nmKeyDown.hdr);
+  notify_hdr(infoPtr->hwndSelf, LVN_KEYDOWN, &nmKeyDown.hdr);
 
   switch (nVirtualKey)
   {
   case VK_RETURN:
     if ((infoPtr->nItemCount > 0) && (infoPtr->nFocusedItem != -1))
     {
-      notify(infoPtr, NM_RETURN);
-      notify(infoPtr, LVN_ITEMACTIVATE);
+      notify(infoPtr->hwndSelf, NM_RETURN);
+      notify(infoPtr->hwndSelf, LVN_ITEMACTIVATE);
     }
     break;
 
@@ -8054,7 +8071,7 @@ static LRESULT LISTVIEW_KillFocus(LISTVI
     if (!infoPtr->bFocus) return 0;
    
     /* send NM_KILLFOCUS notification */
-    notify(infoPtr, NM_KILLFOCUS);
+    notify(infoPtr->hwndSelf, NM_KILLFOCUS);
 
     /* if we have a focus rectagle, get rid of it */
     LISTVIEW_ShowFocusRect(infoPtr, FALSE);
@@ -8083,21 +8100,22 @@ static LRESULT LISTVIEW_KillFocus(LISTVI
 static LRESULT LISTVIEW_LButtonDblClk(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT y)
 {
     LVHITTESTINFO htInfo;
+    HWND hwnd = infoPtr->hwndSelf;
 
     TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, x, y);
 
     /* send NM_RELEASEDCAPTURE notification */
-    notify(infoPtr, NM_RELEASEDCAPTURE);
+    notify(hwnd, NM_RELEASEDCAPTURE);
 
     htInfo.pt.x = x;
     htInfo.pt.y = y;
 
     /* send NM_DBLCLK notification */
-    LISTVIEW_HitTest(infoPtr, &htInfo, TRUE, FALSE);
-    notify_click(infoPtr, NM_DBLCLK, &htInfo);
+    LISTVIEW_HitTest(hwnd, &htInfo, TRUE, FALSE);
+    notify_click(hwnd, NM_DBLCLK, &htInfo);
 
     /* To send the LVN_ITEMACTIVATE, it must be on an Item */
-    if(htInfo.iItem != -1) notify_itemactivate(infoPtr,&htInfo);
+    if(htInfo.iItem != -1) notify_itemactivate(hwnd, &htInfo);
 
     return 0;
 }
@@ -8124,7 +8142,7 @@ static LRESULT LISTVIEW_LButtonDown(LIST
   TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, x, y);
 
   /* send NM_RELEASEDCAPTURE notification */
-  notify(infoPtr, NM_RELEASEDCAPTURE);
+  notify(infoPtr->hwndSelf, NM_RELEASEDCAPTURE);
 
   if (!infoPtr->bFocus) SetFocus(infoPtr->hwndSelf);
 
@@ -8135,7 +8153,7 @@ static LRESULT LISTVIEW_LButtonDown(LIST
   lvHitTestInfo.pt.x = x;
   lvHitTestInfo.pt.y = y;
 
-  nItem = LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
+  nItem = LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, TRUE, TRUE);
   TRACE("at %s, nItem=%d\n", debugpoint(&pt), nItem);
   infoPtr->nEditLabelItem = -1;
   if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
@@ -8241,8 +8259,8 @@ static LRESULT LISTVIEW_LButtonUp(LISTVI
     lvHitTestInfo.pt.y = y;
 
     /* send NM_CLICK notification */
-    LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, FALSE);
-    notify_click(infoPtr, NM_CLICK, &lvHitTestInfo);
+    LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, TRUE, FALSE);
+    notify_click(infoPtr->hwndSelf, NM_CLICK, &lvHitTestInfo);
 
     /* set left button flag */
     infoPtr->bLButtonDown = FALSE;
@@ -8560,13 +8578,13 @@ static LRESULT LISTVIEW_RButtonDblClk(LI
     TRACE("(key=%hu,X=%hu,Y=%hu)\n", wKey, x, y);
 
     /* send NM_RELEASEDCAPTURE notification */
-    notify(infoPtr, NM_RELEASEDCAPTURE);
+    notify(infoPtr->hwndSelf, NM_RELEASEDCAPTURE);
 
     /* send NM_RDBLCLK notification */
     lvHitTestInfo.pt.x = x;
     lvHitTestInfo.pt.y = y;
-    LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, FALSE);
-    notify_click(infoPtr, NM_RDBLCLK, &lvHitTestInfo);
+    LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, TRUE, FALSE);
+    notify_click(infoPtr->hwndSelf, NM_RDBLCLK, &lvHitTestInfo);
 
     return 0;
 }
@@ -8591,7 +8609,7 @@ static LRESULT LISTVIEW_RButtonDown(LIST
     TRACE("(key=%hu,X=%hu,Y=%hu)\n", wKey, x, y);
 
     /* send NM_RELEASEDCAPTURE notification */
-    notify(infoPtr, NM_RELEASEDCAPTURE);
+    notify(infoPtr->hwndSelf, NM_RELEASEDCAPTURE);
 
     /* make sure the listview control window has the focus */
     if (!infoPtr->bFocus) SetFocus(infoPtr->hwndSelf);
@@ -8602,7 +8620,7 @@ static LRESULT LISTVIEW_RButtonDown(LIST
     /* determine the index of the selected item */
     lvHitTestInfo.pt.x = x;
     lvHitTestInfo.pt.y = y;
-    nItem = LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
+    nItem = LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, TRUE, TRUE);
   
     if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
     {
@@ -8646,8 +8664,8 @@ static LRESULT LISTVIEW_RButtonUp(LISTVI
     /* Send NM_RClICK notification */
     lvHitTestInfo.pt.x = x;
     lvHitTestInfo.pt.y = y;
-    LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, FALSE);
-    notify_click(infoPtr, NM_RCLICK, &lvHitTestInfo);
+    LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, TRUE, FALSE);
+    notify_click(infoPtr->hwndSelf, NM_RCLICK, &lvHitTestInfo);
 
     /* Change to screen coordinate for WM_CONTEXTMENU */
     pt = lvHitTestInfo.pt;
@@ -8684,7 +8702,7 @@ static BOOL LISTVIEW_SetCursor(LISTVIEW_
     if(!infoPtr->hHotCursor)  return FALSE;
 
     GetCursorPos(&lvHitTestInfo.pt);
-    if (LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, FALSE, FALSE) < 0) return FALSE;
+    if (LISTVIEW_HitTest(infoPtr->hwndSelf, &lvHitTestInfo, FALSE, FALSE) < 0) return FALSE;
 
     SetCursor(infoPtr->hHotCursor);
 
@@ -8710,7 +8728,7 @@ static LRESULT LISTVIEW_SetFocus(LISTVIE
     if (infoPtr->bFocus) return 0;
    
     /* send NM_SETFOCUS notification */
-    notify(infoPtr, NM_SETFOCUS);
+    notify(infoPtr->hwndSelf, NM_SETFOCUS);
 
     /* set window focus flag */
     infoPtr->bFocus = TRUE;
@@ -9175,7 +9193,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg
   /* case LVM_HASGROUP: */
 
   case LVM_HITTEST:
-    return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, FALSE, FALSE);
+    return LISTVIEW_HitTest(hwnd, (LPLVHITTESTINFO)lParam, FALSE, FALSE);
 
   case LVM_INSERTCOLUMNA:
     return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
@@ -9330,7 +9348,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg
   /* LVM_SORTITEMSEX: */
 
   case LVM_SUBITEMHITTEST:
-    return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, TRUE, FALSE);
+    return LISTVIEW_HitTest(hwnd, (LPLVHITTESTINFO)lParam, TRUE, FALSE);
 
   case LVM_UPDATE:
     return LISTVIEW_Update(infoPtr, (INT)wParam);
