Listview updates

Dimitrie O. Paun dpaun at rogers.com
Sat Sep 7 03:30:51 CDT 2002


ChangeLog:
  -- pass infoPtr around, instead of hwnd
  -- implement hot cursor
  -- update list of unimplemented messages
  -- simplify the code for editing labels
  -- start working towards more type-safe functions
  -- small code cleanups
  -- some docu updates

Index: dlls/comctl32/listview.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/listview.c,v
retrieving revision 1.138
diff -u -r1.138 listview.c
--- dlls/comctl32/listview.c	6 Sep 2002 19:41:17 -0000	1.138
+++ dlls/comctl32/listview.c	7 Sep 2002 08:06:44 -0000
@@ -37,7 +37,6 @@
  *
  * Advanced functionality:
  *   LISTVIEW_GetNumberOfWorkAreas : not implemented
- *   LISTVIEW_GetHotCursor : not implemented
  *   LISTVIEW_GetISearchString : not implemented
  *   LISTVIEW_GetBkImage : not implemented
  *   LISTVIEW_SetBkImage : not implemented
@@ -77,8 +76,6 @@
 WINE_DEFAULT_DEBUG_CHANNEL(listview);
 
 /* Some definitions for inline edit control */
-typedef BOOL (*EditlblCallbackW)(HWND, LPWSTR, DWORD);
-typedef BOOL (*EditlblCallbackA)(HWND, LPWSTR, DWORD);
 
 typedef struct tagLV_INTHIT
 {
@@ -91,8 +88,8 @@
 typedef struct tagEDITLABEL_ITEM
 {
   WNDPROC EditWndProc;
-  DWORD param;
-  EditlblCallbackW EditLblCb;
+  INT nEditItem;
+  BOOL bEditLblCb;
 } EDITLABEL_ITEM;
 
 typedef struct tagLISTVIEW_SUBITEM
@@ -144,6 +141,7 @@
   UINT uCallbackMask;
   HWND hwndHeader;
   HFONT hDefaultFont;
+  HCURSOR hHotCursor;
   HFONT hFont;
   INT ntmHeight;               /*  from GetTextMetrics from above font */
   INT ntmAveCharWidth;         /*  from GetTextMetrics from above font */
@@ -155,7 +153,7 @@
   HWND hwndEdit;
   BOOL Editing;
   INT nEditLabelItem;
-  EDITLABEL_ITEM *pedititem;
+  EDITLABEL_ITEM pedititem;
   DWORD dwHoverTime;
   INT nColumnCount;            /* the number of columns in this control */
 
@@ -226,70 +224,66 @@
 #define GETITEMCOUNT(infoPtr) ((infoPtr)->hdpaItems->nItemCount)
 #define HDM_INSERTITEMT(isW) ( (isW) ? HDM_INSERTITEMW : HDM_INSERTITEMA )
 
-HWND CreateEditLabelT(LPCWSTR text, DWORD style, INT x, INT y,
-	INT width, INT height, HWND parent, HINSTANCE hinst,
-	EditlblCallbackW EditLblCb, DWORD param, BOOL isW);
 
 /*
  * forward declarations
  */
-static LRESULT LISTVIEW_GetItemT(HWND hwnd, LPLVITEMW lpLVItem, BOOL internal, BOOL isW);
-static INT LISTVIEW_SuperHitTestItem(HWND, LPLV_INTHIT, BOOL);
-static INT LISTVIEW_HitTestItem(HWND, LPLVHITTESTINFO, BOOL);
-static INT LISTVIEW_GetCountPerRow(HWND);
-static INT LISTVIEW_GetCountPerColumn(HWND);
-static VOID LISTVIEW_AlignLeft(HWND);
-static VOID LISTVIEW_AlignTop(HWND);
-static VOID LISTVIEW_AddGroupSelection(HWND, INT);
-static VOID LISTVIEW_AddSelection(HWND, INT);
-static BOOL LISTVIEW_AddSubItemT(HWND, LPLVITEMW, BOOL);
+static LRESULT LISTVIEW_GetItemT(LISTVIEW_INFO *, LPLVITEMW, BOOL, BOOL);
+static INT LISTVIEW_SuperHitTestItem(LISTVIEW_INFO *, LPLV_INTHIT, BOOL);
+static INT LISTVIEW_HitTestItem(LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL);
+static INT LISTVIEW_GetCountPerRow(LISTVIEW_INFO *);
+static INT LISTVIEW_GetCountPerColumn(LISTVIEW_INFO *);
+static VOID LISTVIEW_AlignLeft(LISTVIEW_INFO *);
+static VOID LISTVIEW_AlignTop(LISTVIEW_INFO *);
+static VOID LISTVIEW_AddGroupSelection(LISTVIEW_INFO *, INT);
+static VOID LISTVIEW_AddSelection(LISTVIEW_INFO *, INT);
+static BOOL LISTVIEW_AddSubItemT(LISTVIEW_INFO *, LPLVITEMW, BOOL);
 static INT LISTVIEW_FindInsertPosition(HDPA, INT);
-static INT LISTVIEW_GetItemHeight(HWND);
-static BOOL LISTVIEW_GetItemBoundBox(HWND, INT, LPRECT);
-static BOOL LISTVIEW_GetItemPosition(HWND, INT, LPPOINT);
-static LRESULT LISTVIEW_GetItemRect(HWND, INT, LPRECT);
-static LRESULT LISTVIEW_GetSubItemRect(HWND, INT, INT, INT, LPRECT);
-static INT LISTVIEW_GetItemWidth(HWND);
-static INT LISTVIEW_GetLabelWidth(HWND, INT);
-static LRESULT LISTVIEW_GetOrigin(HWND, LPPOINT);
-static INT LISTVIEW_CalculateWidth(HWND hwnd, INT nItem);
+static INT LISTVIEW_GetItemHeight(LISTVIEW_INFO *);
+static BOOL LISTVIEW_GetItemBoundBox(LISTVIEW_INFO *, INT, LPRECT);
+static BOOL LISTVIEW_GetItemPosition(LISTVIEW_INFO *, INT, LPPOINT);
+static LRESULT LISTVIEW_GetItemRect(LISTVIEW_INFO *, INT, LPRECT);
+static LRESULT LISTVIEW_GetSubItemRect(LISTVIEW_INFO *, INT, INT, INT, LPRECT);
+static INT LISTVIEW_GetItemWidth(LISTVIEW_INFO *);
+static INT LISTVIEW_GetLabelWidth(LISTVIEW_INFO *, INT);
+static LRESULT LISTVIEW_GetOrigin(LISTVIEW_INFO *, LPPOINT);
+static INT LISTVIEW_CalculateWidth(LISTVIEW_INFO *, INT);
 static LISTVIEW_SUBITEM* LISTVIEW_GetSubItem(HDPA, INT);
-static LRESULT LISTVIEW_GetViewRect(HWND, LPRECT);
-static BOOL LISTVIEW_InitItemT(HWND, LISTVIEW_ITEM *, LPLVITEMW, BOOL);
-static BOOL LISTVIEW_InitSubItemT(HWND, LISTVIEW_SUBITEM *, LPLVITEMW, BOOL);
-static LRESULT LISTVIEW_MouseSelection(HWND, POINT);
+static LRESULT LISTVIEW_GetViewRect(LISTVIEW_INFO *, LPRECT);
+static BOOL LISTVIEW_InitItemT(LISTVIEW_INFO *, LISTVIEW_ITEM *, LPLVITEMW, BOOL);
+static BOOL LISTVIEW_InitSubItemT(LISTVIEW_INFO *, LISTVIEW_SUBITEM *, LPLVITEMW, BOOL);
+static INT LISTVIEW_MouseSelection(LISTVIEW_INFO *, POINT);
 static BOOL LISTVIEW_RemoveColumn(HDPA, INT);
 static BOOL LISTVIEW_RemoveSubItem(HDPA, INT);
-static VOID LISTVIEW_SetGroupSelection(HWND, INT);
-static BOOL LISTVIEW_SetItemT(HWND, LPLVITEMW, BOOL);
-static BOOL LISTVIEW_SetItemFocus(HWND, INT);
-static BOOL LISTVIEW_SetItemPosition(HWND, INT, LONG, LONG);
-static VOID LISTVIEW_UpdateScroll(HWND);
-static VOID LISTVIEW_SetSelection(HWND, INT);
-static BOOL LISTVIEW_UpdateSize(HWND);
-static BOOL LISTVIEW_SetSubItemT(HWND, LPLVITEMW, BOOL);
-static LRESULT LISTVIEW_SetViewRect(HWND, LPRECT);
-static BOOL LISTVIEW_ToggleSelection(HWND, INT);
-static VOID LISTVIEW_UnsupportedStyles(LONG lStyle);
-static HWND LISTVIEW_EditLabelT(HWND hwnd, INT nItem, BOOL isW);
-static BOOL LISTVIEW_EndEditLabelW(HWND hwnd, LPWSTR pszText, DWORD nItem);
-static BOOL LISTVIEW_EndEditLabelA(HWND hwnd, LPSTR pszText, DWORD nItem);
-static LRESULT LISTVIEW_Command(HWND hwnd, WPARAM wParam, LPARAM lParam);
-static LRESULT LISTVIEW_SortItems(HWND hwnd, PFNLVCOMPARE pfnCompare, LPARAM lParamSort);
-static LRESULT LISTVIEW_GetStringWidthT(HWND hwnd, LPCWSTR lpszText, BOOL isW);
-static INT LISTVIEW_ProcessLetterKeys( HWND hwnd, WPARAM charCode, LPARAM keyData );
-static BOOL LISTVIEW_KeySelection(HWND hwnd, INT nItem);
-static LRESULT LISTVIEW_GetItemState(HWND hwnd, INT nItem, UINT uMask);
-static LRESULT LISTVIEW_SetItemState(HWND hwnd, INT nItem, LPLVITEMW lpLVItem);
-static BOOL LISTVIEW_IsSelected(HWND hwnd, INT nItem);
-static VOID LISTVIEW_RemoveSelectionRange(HWND hwnd, INT lItem, INT uItem);
-static void LISTVIEW_FillBackground(HWND hwnd, HDC hdc, LPRECT rc);
-static void ListView_UpdateLargeItemLabelRect (HWND hwnd, const LISTVIEW_INFO* infoPtr, int nItem, RECT *rect);
-static LRESULT LISTVIEW_GetColumnT(HWND, INT, LPLVCOLUMNW, BOOL);
-static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, HWND hScrollWnd);
-static LRESULT LISTVIEW_HScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos, HWND hScrollWnd);
-static INT LISTVIEW_GetTopIndex(HWND hwnd);
-static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial);
+static VOID LISTVIEW_SetGroupSelection(LISTVIEW_INFO *, INT);
+static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *, LPLVITEMW, BOOL);
+static BOOL LISTVIEW_SetItemFocus(LISTVIEW_INFO *, INT);
+static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *, INT, LONG, LONG);
+static VOID LISTVIEW_UpdateScroll(LISTVIEW_INFO *);
+static VOID LISTVIEW_SetSelection(LISTVIEW_INFO *, INT);
+static BOOL LISTVIEW_UpdateSize(LISTVIEW_INFO *);
+static BOOL LISTVIEW_SetSubItemT(LISTVIEW_INFO *, LPLVITEMW, BOOL);
+static LRESULT LISTVIEW_SetViewRect(LISTVIEW_INFO *, LPRECT);
+static BOOL LISTVIEW_ToggleSelection(LISTVIEW_INFO *, INT);
+static VOID LISTVIEW_UnsupportedStyles(LONG);
+static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *, INT, BOOL);
+static LRESULT LISTVIEW_Command(LISTVIEW_INFO *, WPARAM, LPARAM);
+static LRESULT LISTVIEW_SortItems(LISTVIEW_INFO *, PFNLVCOMPARE, LPARAM);
+static LRESULT LISTVIEW_GetStringWidthT(LISTVIEW_INFO *, LPCWSTR, BOOL);
+static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *, WPARAM, LPARAM);
+static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *, INT);
+static LRESULT LISTVIEW_GetItemState(LISTVIEW_INFO *, INT, UINT);
+static LRESULT LISTVIEW_SetItemState(LISTVIEW_INFO *, INT, LPLVITEMW);
+static BOOL LISTVIEW_IsSelected(LISTVIEW_INFO *, INT);
+static VOID LISTVIEW_RemoveSelectionRange(LISTVIEW_INFO *, INT, INT);
+static void LISTVIEW_FillBackground(LISTVIEW_INFO *, HDC, LPRECT);
+static void LISTVIEW_UpdateLargeItemLabelRect (LISTVIEW_INFO *, int, RECT*);
+static LRESULT LISTVIEW_GetColumnT(LISTVIEW_INFO *, INT, LPLVCOLUMNW, BOOL);
+static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, SHORT, HWND);
+static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, SHORT, HWND);
+static INT LISTVIEW_GetTopIndex(LISTVIEW_INFO *);
+static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *, INT, BOOL);
+static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, INT, INT, INT, INT, INT, BOOL);
 
 /******** Defines that LISTVIEW_ProcessLetterKeys uses ****************/
 #define KEY_DELAY       450
@@ -381,24 +375,24 @@
     return CallWindowProcA(proc, hwnd, uMsg, wParam, lParam);
 }
 
-static inline BOOL notify(HWND self, INT code, LPNMHDR pnmh)
+static inline BOOL notify(LISTVIEW_INFO *infoPtr, INT code, LPNMHDR pnmh)
 {
-  pnmh->hwndFrom = self;
-  pnmh->idFrom = GetWindowLongW(self, GWL_ID);
+  pnmh->hwndFrom = infoPtr->hwndSelf;
+  pnmh->idFrom = GetWindowLongW(infoPtr->hwndSelf, GWL_ID);
   pnmh->code = code;
-  return (BOOL)SendMessageW(GetParent(self), WM_NOTIFY,
+  return (BOOL)SendMessageW(GetParent(infoPtr->hwndSelf), WM_NOTIFY,
 		            (WPARAM)pnmh->idFrom, (LPARAM)pnmh);
 }
 
-static inline BOOL hdr_notify(HWND self, INT code)
+static inline BOOL hdr_notify(LISTVIEW_INFO *infoPtr, INT code)
 {
   NMHDR nmh;
-  return notify(self, code, &nmh);
+  return notify(infoPtr, code, &nmh);
 }
 
-static inline BOOL listview_notify(HWND self, INT code, LPNMLISTVIEW plvnm)
+static inline BOOL listview_notify(LISTVIEW_INFO *infoPtr, INT code, LPNMLISTVIEW plvnm)
 {
-  return notify(self, code, (LPNMHDR)plvnm);
+  return notify(infoPtr, code, (LPNMHDR)plvnm);
 }
 
 static int tabNotification[] = {
@@ -423,21 +417,20 @@
 /*
   Send notification. depends on dispinfoW having same
   structure as dispinfoA.
-  self : listview handle
+  infoPtr : listview struct
   notificationCode : *Unicode* notification code
   pdi : dispinfo structure (can be unicode or ansi)
   isW : TRUE if dispinfo is Unicode
 */
-static BOOL dispinfo_notifyT(HWND self, INT notificationCode, LPNMLVDISPINFOW pdi, BOOL isW)
+static BOOL dispinfo_notifyT(LISTVIEW_INFO *infoPtr, INT notificationCode, LPNMLVDISPINFOW pdi, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(self, 0);
   BOOL bResult = FALSE;
   BOOL convertToAnsi = FALSE, convertToUnicode = FALSE;
   INT realNotifCode;
   INT cchTempBufMax = 0, savCchTextMax = 0;
   LPWSTR pszTempBuf = NULL, savPszText = NULL;
 
-  TRACE("(self=%x, code=%x, pdi=%p, isW=%d)\n", self, notificationCode, pdi, isW);
+  TRACE("(code=%x, pdi=%p, isW=%d)\n", notificationCode, pdi, isW);
   TRACE("   notifyFormat=%s\n",
 	infoPtr->notifyFormat == NFR_UNICODE ? "NFR_UNICODE" :
 	infoPtr->notifyFormat == NFR_ANSI ? "NFR_ANSI" : "(not set)");
@@ -482,7 +475,7 @@
     pdi->item.cchTextMax = cchTempBufMax;
   }
 
-  bResult = notify(self, realNotifCode, (LPNMHDR)pdi);
+  bResult = notify(infoPtr, realNotifCode, (LPNMHDR)pdi);
 
   if (convertToUnicode || convertToAnsi)
   { /* convert back result */
@@ -500,9 +493,9 @@
   return bResult;
 }
 
-static inline LRESULT LISTVIEW_GetItemW(HWND hwnd, LPLVITEMW lpLVItem, BOOL internal)
+static inline LRESULT LISTVIEW_GetItemW(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL internal)
 {
-  return LISTVIEW_GetItemT(hwnd, lpLVItem, internal, TRUE);
+  return LISTVIEW_GetItemT(infoPtr, lpLVItem, internal, TRUE);
 }
 
 static inline int lstrncmpiW(LPCWSTR s1, LPCWSTR s2, int n)
@@ -561,18 +554,17 @@
 }
 
 static BOOL
-LISTVIEW_SendCustomDrawNotify (HWND hwnd, DWORD dwDrawStage, HDC hdc,
+LISTVIEW_SendCustomDrawNotify (LISTVIEW_INFO *infoPtr, DWORD dwDrawStage, HDC hdc,
                                RECT rc)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   NMLVCUSTOMDRAW nmcdhdr;
   LPNMCUSTOMDRAW nmcd;
 
-  TRACE("(hwnd=%x, dwDrawStage=%lx, hdc=%x, rc=?)\n", hwnd, dwDrawStage, hdc);
+  TRACE("(dwDrawStage=%lx, hdc=%x, rc=?)\n", dwDrawStage, hdc);
 
   nmcd= & nmcdhdr.nmcd;
-  nmcd->hdr.hwndFrom = hwnd;
-  nmcd->hdr.idFrom =  GetWindowLongW( hwnd, GWL_ID);
+  nmcd->hdr.hwndFrom = infoPtr->hwndSelf;
+  nmcd->hdr.idFrom =  GetWindowLongW( infoPtr->hwndSelf, GWL_ID);
   nmcd->hdr.code   = NM_CUSTOMDRAW;
   nmcd->dwDrawStage= dwDrawStage;
   nmcd->hdc        = hdc;
@@ -586,16 +578,15 @@
   nmcdhdr.clrText  = infoPtr->clrText;
   nmcdhdr.clrTextBk= infoPtr->clrBk;
 
-  return (BOOL)SendMessageW (GetParent (hwnd), WM_NOTIFY,
-              (WPARAM) GetWindowLongW( hwnd, GWL_ID), (LPARAM)&nmcdhdr);
+  return (BOOL)SendMessageW (GetParent (infoPtr->hwndSelf), WM_NOTIFY,
+              (WPARAM) nmcd->hdr.idFrom, (LPARAM)&nmcdhdr);
 }
 
 static BOOL
-LISTVIEW_SendCustomDrawItemNotify (HWND hwnd, HDC hdc,
+LISTVIEW_SendCustomDrawItemNotify (LISTVIEW_INFO *infoPtr, HDC hdc,
                                    UINT iItem, UINT iSubItem,
                                    UINT uItemDrawState)
 {
- LISTVIEW_INFO *infoPtr;
  NMLVCUSTOMDRAW nmcdhdr;
  LPNMCUSTOMDRAW nmcd;
  DWORD dwDrawStage,dwItemSpec;
@@ -604,27 +595,25 @@
  RECT itemRect;
  LVITEMW item;
 
- infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
  ZeroMemory(&item,sizeof(item));
  item.iItem = iItem;
  item.mask = LVIF_PARAM;
- ListView_GetItemW(hwnd,&item);
+ ListView_GetItemW(infoPtr->hwndSelf,&item);
 
  dwDrawStage=CDDS_ITEM | uItemDrawState;
  dwItemSpec=iItem;
  uItemState=0;
 
- if (LISTVIEW_IsSelected(hwnd,iItem)) uItemState|=CDIS_SELECTED;
+ if (LISTVIEW_IsSelected(infoPtr,iItem)) uItemState|=CDIS_SELECTED;
  if (iItem==infoPtr->nFocusedItem)   uItemState|=CDIS_FOCUS;
  if (iItem==infoPtr->nHotItem)       uItemState|=CDIS_HOT;
 
  itemRect.left = LVIR_BOUNDS;
- LISTVIEW_GetItemRect(hwnd, iItem, &itemRect);
+ LISTVIEW_GetItemRect(infoPtr, iItem, &itemRect);
 
  nmcd= & nmcdhdr.nmcd;
- nmcd->hdr.hwndFrom = hwnd;
- nmcd->hdr.idFrom =  GetWindowLongW( hwnd, GWL_ID);
+ nmcd->hdr.hwndFrom = infoPtr->hwndSelf;
+ nmcd->hdr.idFrom =  GetWindowLongW( infoPtr->hwndSelf, GWL_ID);
  nmcd->hdr.code   = NM_CUSTOMDRAW;
  nmcd->dwDrawStage= dwDrawStage;
  nmcd->hdc        = hdc;
@@ -643,8 +632,8 @@
        nmcd->dwDrawStage, nmcd->hdc, nmcd->dwItemSpec,
        nmcd->uItemState, nmcd->lItemlParam);
 
- retval=SendMessageW (GetParent (hwnd), WM_NOTIFY,
-                 (WPARAM) GetWindowLongW( hwnd, GWL_ID), (LPARAM)&nmcdhdr);
+ retval=SendMessageW (GetParent (infoPtr->hwndSelf), WM_NOTIFY,
+                 (WPARAM)nmcd->hdr.idFrom, (LPARAM)&nmcdhdr);
 
  infoPtr->clrText=nmcdhdr.clrText;
  infoPtr->clrBk  =nmcdhdr.clrTextBk;
@@ -671,6 +660,11 @@
  *    we must also search for the corresponding string ('aaaaa'), and
  *    go to that string if there is a match.
  *
+ * PARAMETERS
+ *   [I] hwnd : handle to the window
+ *   [I] charCode : the character code, the actual character
+ *   [I] keyData : key data
+ *
  * RETURNS
  *
  *  Zero.
@@ -688,13 +682,8 @@
  *
  *  TREEVIEW_ProcessLetterKeys
  */
-static INT LISTVIEW_ProcessLetterKeys(
-    HWND hwnd, /* handle to the window */
-    WPARAM charCode, /* the character code, the actual character */
-    LPARAM keyData /* key data */
-    )
+static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, LPARAM keyData)
 {
-    LISTVIEW_INFO *infoPtr;
     INT nItem;
     INT nSize;
     INT endidx,idx;
@@ -703,10 +692,9 @@
     DWORD timestamp,elapsed;
 
     /* simple parameter checking */
-    if (!hwnd || !charCode || !keyData)
+    if (!charCode || !keyData)
         return 0;
 
-    infoPtr=(LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
     if (!infoPtr)
         return 0;
 
@@ -781,7 +769,7 @@
         item.iSubItem = 0;
         item.pszText = buffer;
         item.cchTextMax = COUNTOF(buffer);
-        ListView_GetItemW( hwnd, &item );
+        ListView_GetItemW(infoPtr->hwndSelf, &item);
 
         /* check for a match */
         if (lstrncmpiW(item.pszText,infoPtr->szSearchParam,infoPtr->nSearchParamLength) == 0) {
@@ -796,10 +784,10 @@
     } while (idx != endidx);
 
     if (nItem != -1) {
-        if (LISTVIEW_KeySelection(hwnd, nItem) != FALSE) {
+        if (LISTVIEW_KeySelection(infoPtr, nItem) != FALSE) {
             /* refresh client area */
-            InvalidateRect(hwnd, NULL, TRUE);
-            UpdateWindow(hwnd);
+            InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+            UpdateWindow(infoPtr->hwndSelf);
         }
     }
 
@@ -820,9 +808,8 @@
  *
  * NOTES
  */
-static VOID LISTVIEW_UpdateHeaderSize(HWND hwnd, INT nNewScrollPos)
+static VOID LISTVIEW_UpdateHeaderSize(LISTVIEW_INFO *infoPtr, INT nNewScrollPos)
 {
-    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
     RECT winRect;
     POINT point[2];
 
@@ -832,7 +819,7 @@
     point[1].x = winRect.right;
     point[1].y = winRect.bottom;
 
-    MapWindowPoints(HWND_DESKTOP, hwnd, point, 2);
+    MapWindowPoints(HWND_DESKTOP, infoPtr->hwndSelf, point, 2);
     point[0].x = -nNewScrollPos;
     point[1].x += nNewScrollPos;
 
@@ -852,10 +839,9 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_UpdateScroll(HWND hwnd)
+static VOID LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView =  lStyle & LVS_TYPEMASK;
   INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
   INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
@@ -870,8 +856,8 @@
   {
     /* update horizontal scrollbar */
 
-    INT nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
-    INT nCountPerRow = LISTVIEW_GetCountPerRow(hwnd);
+    INT nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
+    INT nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
     INT nNumOfItems = GETITEMCOUNT(infoPtr);
 
     scrollInfo.nMax = nNumOfItems / nCountPerColumn;
@@ -881,12 +867,12 @@
     {
         scrollInfo.nMax--;
     }
-    scrollInfo.nPos = ListView_GetTopIndex(hwnd) / nCountPerColumn;
+    scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf) / nCountPerColumn;
     scrollInfo.nPage = nCountPerRow;
     scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
     TRACE("LVS_LIST\n");
-    SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
-    ShowScrollBar(hwnd, SB_VERT, FALSE);
+    SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
+    ShowScrollBar(infoPtr->hwndSelf, SB_VERT, FALSE);
   }
   else if (uView == LVS_REPORT)
   {
@@ -895,18 +881,18 @@
     /* update vertical scrollbar */
     scrollInfo.nMin = 0;
     scrollInfo.nMax = GETITEMCOUNT(infoPtr) - 1;
-    scrollInfo.nPos = ListView_GetTopIndex(hwnd);
-    scrollInfo.nPage = LISTVIEW_GetCountPerColumn(hwnd);
+    scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf);
+    scrollInfo.nPage = LISTVIEW_GetCountPerColumn(infoPtr);
     scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
     test = (scrollInfo.nMin >= scrollInfo.nMax - max((INT)scrollInfo.nPage - 1, 0));
     TRACE("LVS_REPORT Vert. nMax=%d, nPage=%d, test=%d\n",
 	  scrollInfo.nMax, scrollInfo.nPage, test);
-    SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
-    ShowScrollBar(hwnd, SB_VERT, (test) ? FALSE : TRUE);
+    SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
+    ShowScrollBar(infoPtr->hwndSelf, SB_VERT, (test) ? FALSE : TRUE);
 
     /* update horizontal scrollbar */
     nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
-    if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) == FALSE
+    if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo) == FALSE
        || GETITEMCOUNT(infoPtr) == 0)
     {
       scrollInfo.nPos = 0;
@@ -918,27 +904,27 @@
     test = (scrollInfo.nMin >= scrollInfo.nMax - max((INT)scrollInfo.nPage - 1, 0));
     TRACE("LVS_REPORT Horz. nMax=%d, nPage=%d, test=%d\n",
 	  scrollInfo.nMax, scrollInfo.nPage, test);
-    SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
-    ShowScrollBar(hwnd, SB_HORZ, (test) ? FALSE : TRUE);
+    SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
+    ShowScrollBar(infoPtr->hwndSelf, SB_HORZ, (test) ? FALSE : TRUE);
 
     /* Update the Header Control */
     scrollInfo.fMask = SIF_POS;
-    GetScrollInfo(hwnd, SB_HORZ, &scrollInfo);
-    LISTVIEW_UpdateHeaderSize(hwnd, scrollInfo.nPos);
+    GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo);
+    LISTVIEW_UpdateHeaderSize(infoPtr, scrollInfo.nPos);
 
   }
   else
   {
     RECT rcView;
 
-    if (LISTVIEW_GetViewRect(hwnd, &rcView) != FALSE)
+    if (LISTVIEW_GetViewRect(infoPtr, &rcView) != FALSE)
     {
       INT nViewWidth = rcView.right - rcView.left;
       INT nViewHeight = rcView.bottom - rcView.top;
 
       /* Update Horizontal Scrollbar */
       scrollInfo.fMask = SIF_POS;
-      if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) == FALSE
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo) == FALSE
         || GETITEMCOUNT(infoPtr) == 0)
       {
         scrollInfo.nPos = 0;
@@ -948,12 +934,12 @@
       scrollInfo.nPage = nListWidth;
       scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
       TRACE("LVS_ICON/SMALLICON Horz.\n");
-      SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
+      SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
 
       /* Update Vertical Scrollbar */
       nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
       scrollInfo.fMask = SIF_POS;
-      if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) == FALSE
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo) == FALSE
         || GETITEMCOUNT(infoPtr) == 0)
       {
         scrollInfo.nPos = 0;
@@ -963,7 +949,7 @@
       scrollInfo.nPage = nListHeight;
       scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
       TRACE("LVS_ICON/SMALLICON Vert.\n");
-      SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
+      SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
     }
   }
 }
@@ -1007,10 +993,9 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_AlignTop(HWND hwnd)
+static VOID LISTVIEW_AlignTop(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
   POINT ptItem;
   RECT rcView;
@@ -1042,7 +1027,7 @@
           ptItem.y += infoPtr->nItemHeight;
         }
 
-        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
+        LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
         ptItem.x += infoPtr->nItemWidth;
         rcView.right = max(rcView.right, ptItem.x);
       }
@@ -1054,7 +1039,7 @@
     {
       for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
       {
-        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
+        LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
         ptItem.y += infoPtr->nItemHeight;
       }
 
@@ -1062,7 +1047,7 @@
       rcView.bottom = ptItem.y-off_y;
     }
 
-    LISTVIEW_SetViewRect(hwnd, &rcView);
+    LISTVIEW_SetViewRect(infoPtr, &rcView);
   }
 }
 
@@ -1076,10 +1061,9 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_AlignLeft(HWND hwnd)
+static VOID LISTVIEW_AlignLeft(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
   POINT ptItem;
   RECT rcView;
@@ -1109,7 +1093,7 @@
           ptItem.x += infoPtr->nItemWidth;
         }
 
-        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
+        LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
         ptItem.y += infoPtr->nItemHeight;
         rcView.bottom = max(rcView.bottom, ptItem.y);
       }
@@ -1120,7 +1104,7 @@
     {
       for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
       {
-        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
+        LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
         ptItem.x += infoPtr->nItemWidth;
       }
 
@@ -1128,7 +1112,7 @@
       rcView.right = ptItem.x;
     }
 
-    LISTVIEW_SetViewRect(hwnd, &rcView);
+    LISTVIEW_SetViewRect(infoPtr, &rcView);
   }
 }
 
@@ -1144,12 +1128,11 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetViewRect(HWND hwnd, LPRECT lprcView)
+static LRESULT LISTVIEW_SetViewRect(LISTVIEW_INFO *infoPtr, LPRECT lprcView)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
   BOOL bResult = FALSE;
 
-  TRACE("(hwnd=%x, left=%d, top=%d, right=%d, bottom=%d)\n", hwnd,
+  TRACE("(left=%d, top=%d, right=%d, bottom=%d)\n",
         lprcView->left, lprcView->top, lprcView->right, lprcView->bottom);
 
   if (lprcView != NULL)
@@ -1176,17 +1159,16 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_GetViewRect(HWND hwnd, LPRECT lprcView)
+static LRESULT LISTVIEW_GetViewRect(LISTVIEW_INFO *infoPtr, LPRECT lprcView)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
   BOOL bResult = FALSE;
   POINT ptOrigin;
 
-  TRACE("(hwnd=%x, lprcView=%p)\n", hwnd, lprcView);
+  TRACE("(lprcView=%p)\n", lprcView);
 
   if (lprcView != NULL)
   {
-    bResult = LISTVIEW_GetOrigin(hwnd, &ptOrigin);
+    bResult = LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
     if (bResult != FALSE)
     {
       lprcView->left = infoPtr->rcView.left + ptOrigin.x;
@@ -1246,10 +1228,9 @@
  * RETURN:
  * Returns item width.
  */
-static INT LISTVIEW_GetItemWidth(HWND hwnd)
+static INT LISTVIEW_GetItemWidth(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG style = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG style = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = style & LVS_TYPEMASK;
   INT nHeaderItemCount;
   RECT rcHeaderItem;
@@ -1257,7 +1238,7 @@
   INT nLabelWidth;
   INT i;
 
-  TRACE("(hwnd=%x)\n", hwnd);
+  TRACE("()\n");
 
   if (uView == LVS_ICON)
   {
@@ -1279,7 +1260,7 @@
   {
     for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
     {
-      nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, i);
+      nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, i);
       nItemWidth = max(nItemWidth, nLabelWidth);
     }
 
@@ -1331,16 +1312,15 @@
  * RETURN:
  * Returns the width of an item width a specified string.
  */
-static INT LISTVIEW_CalculateWidth(HWND hwnd, INT nItem)
+static INT LISTVIEW_CalculateWidth(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nHeaderItemCount;
   RECT rcHeaderItem;
   INT nItemWidth = 0;
   INT i;
 
-  TRACE("(hwnd=%x)\n", hwnd);
+  TRACE("()\n");
 
   if (uView == LVS_ICON)
   {
@@ -1361,7 +1341,7 @@
   else
   {
     /* get width of string */
-    nItemWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+    nItemWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
 
     /* default label size */
     if (GETITEMCOUNT(infoPtr) == 0)
@@ -1404,11 +1384,10 @@
  * [I] HWND : window handle
  *
  */
-static VOID LISTVIEW_SaveTextMetrics(HWND hwnd)
+static VOID LISTVIEW_SaveTextMetrics(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   TEXTMETRICW tm;
-  HDC hdc = GetDC(hwnd);
+  HDC hdc = GetDC(infoPtr->hwndSelf);
   HFONT hOldFont = SelectObject(hdc, infoPtr->hFont);
   INT oldHeight, oldACW;
 
@@ -1420,7 +1399,7 @@
   infoPtr->ntmAveCharWidth = tm.tmAveCharWidth;
 
   SelectObject(hdc, hOldFont);
-  ReleaseDC(hwnd, hdc);
+  ReleaseDC(infoPtr->hwndSelf, hdc);
   TRACE("tmHeight old=%d,new=%d; tmAveCharWidth old=%d,new=%d\n",
         oldHeight, infoPtr->ntmHeight, oldACW, infoPtr->ntmAveCharWidth);
 }
@@ -1436,10 +1415,9 @@
  * RETURN:
  * Returns item height.
  */
-static INT LISTVIEW_GetItemHeight(HWND hwnd)
+static INT LISTVIEW_GetItemHeight(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nItemHeight = 0;
 
   if (uView == LVS_ICON)
@@ -1458,9 +1436,8 @@
 }
 
 
-static void LISTVIEW_PrintSelectionRanges(HWND hwnd)
+static void LISTVIEW_PrintSelectionRanges(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LISTVIEW_SELECTION *selection;
   INT topSelection = infoPtr->hdpaSelectionRanges->nItemCount;
   INT i;
@@ -1517,9 +1494,8 @@
 * RETURN:
 * None
 */
-static VOID LISTVIEW_AddSelectionRange(HWND hwnd, INT lItem, INT uItem)
+static VOID LISTVIEW_AddSelectionRange(LISTVIEW_INFO *infoPtr, INT lItem, INT uItem)
 {
- LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
  LISTVIEW_SELECTION *selection;
  INT topSelection = infoPtr->hdpaSelectionRanges->nItemCount;
  BOOL lowerzero=FALSE;
@@ -1665,7 +1641,7 @@
   * Incase of error
   */
  DPA_Sort(infoPtr->hdpaSelectionRanges,LISTVIEW_CompareSelectionRanges,0);
- LISTVIEW_PrintSelectionRanges(hwnd);
+ LISTVIEW_PrintSelectionRanges(infoPtr);
 }
 
 /**
@@ -1679,9 +1655,8 @@
 * RETURN:
 * None
 */
-static BOOL LISTVIEW_IsSelected(HWND hwnd, INT nItem)
+static BOOL LISTVIEW_IsSelected(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LISTVIEW_SELECTION selection;
   INT index;
 
@@ -1708,14 +1683,13 @@
 *   SUCCESS : TRUE
 *   FAILURE : TRUE
 */
-static LRESULT LISTVIEW_RemoveAllSelections(HWND hwnd)
+static LRESULT LISTVIEW_RemoveAllSelections(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LISTVIEW_SELECTION *selection;
   INT i;
   LVITEMW item;
 
-  TRACE("(0x%x)\n",hwnd);
+  TRACE("()\n");
 
   ZeroMemory(&item,sizeof(item));
   item.stateMask = LVIS_SELECTED;
@@ -1727,8 +1701,8 @@
     {
       TRACE("Removing %lu to %lu\n",selection->lower, selection->upper);
       for (i = selection->lower; i<=selection->upper; i++)
-        LISTVIEW_SetItemState(hwnd,i,&item);
-      LISTVIEW_RemoveSelectionRange(hwnd,selection->lower,selection->upper);
+        LISTVIEW_SetItemState(infoPtr,i,&item);
+      LISTVIEW_RemoveSelectionRange(infoPtr,selection->lower,selection->upper);
     }
   }
   while (infoPtr->hdpaSelectionRanges->nItemCount>0);
@@ -1749,9 +1723,8 @@
 * RETURN:
 * None
 */
-static VOID LISTVIEW_RemoveSelectionRange(HWND hwnd, INT lItem, INT uItem)
+static VOID LISTVIEW_RemoveSelectionRange(LISTVIEW_INFO *infoPtr, INT lItem, INT uItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LISTVIEW_SELECTION removeselection,*checkselection;
   INT index;
 
@@ -1759,7 +1732,7 @@
   removeselection.upper = uItem;
 
   TRACE("Remove range %lu - %lu\n",removeselection.lower,removeselection.upper);
-  LISTVIEW_PrintSelectionRanges(hwnd);
+  LISTVIEW_PrintSelectionRanges(infoPtr);
 
   index = DPA_Search(infoPtr->hdpaSelectionRanges, &removeselection, 0,
                      LISTVIEW_CompareSelectionRanges,
@@ -1794,7 +1767,7 @@
     DPA_DeletePtr(infoPtr->hdpaSelectionRanges,index);
     /* do it again because others may also get caught */
     TRACE("Case 2\n");
-    LISTVIEW_RemoveSelectionRange(hwnd,lItem,uItem);
+    LISTVIEW_RemoveSelectionRange(infoPtr,lItem,uItem);
   }
   /* case 3: overlap upper */
   else if ((checkselection->upper < removeselection.upper) &&
@@ -1802,7 +1775,7 @@
   {
     checkselection->upper = removeselection.lower - 1;
     TRACE("Case 3\n");
-    LISTVIEW_RemoveSelectionRange(hwnd,lItem,uItem);
+    LISTVIEW_RemoveSelectionRange(infoPtr,lItem,uItem);
   }
   /* case 4: overlap lower */
   else if ((checkselection->upper > removeselection.upper) &&
@@ -1810,7 +1783,7 @@
   {
     checkselection->lower = removeselection.upper + 1;
     TRACE("Case 4\n");
-    LISTVIEW_RemoveSelectionRange(hwnd,lItem,uItem);
+    LISTVIEW_RemoveSelectionRange(infoPtr,lItem,uItem);
   }
   /* case 5: fully internal */
   else if (checkselection->upper == removeselection.upper)
@@ -1831,7 +1804,7 @@
     TRACE("Case 5\n");
     DPA_Sort(infoPtr->hdpaSelectionRanges,LISTVIEW_CompareSelectionRanges,0);
   }
-  LISTVIEW_PrintSelectionRanges(hwnd);
+  LISTVIEW_PrintSelectionRanges(infoPtr);
 }
 
 /**
@@ -1846,9 +1819,8 @@
 * RETURN:
 * None
 */
-static VOID LISTVIEW_ShiftIndices(HWND hwnd, INT nItem, INT direction)
+static VOID LISTVIEW_ShiftIndices(LISTVIEW_INFO *infoPtr, INT nItem, INT direction)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LISTVIEW_SELECTION selection,*checkselection;
   INT index;
 
@@ -1895,7 +1867,7 @@
       if (infoPtr->nFocusedItem >= GETITEMCOUNT(infoPtr))
         infoPtr->nFocusedItem = GETITEMCOUNT(infoPtr) - 1;
       if (infoPtr->nFocusedItem >= 0)
-        LISTVIEW_SetItemFocus(hwnd, infoPtr->nFocusedItem);
+        LISTVIEW_SetItemFocus(infoPtr, infoPtr->nFocusedItem);
     }
   }
   /* But we are not supposed to modify nHotItem! */
@@ -1913,9 +1885,8 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_AddGroupSelection(HWND hwnd, INT nItem)
+static VOID LISTVIEW_AddGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT nFirst = min(infoPtr->nSelectionMark, nItem);
   INT nLast = max(infoPtr->nSelectionMark, nItem);
   INT i;
@@ -1929,9 +1900,9 @@
   item.state = LVIS_SELECTED;
 
   for (i = nFirst; i <= nLast; i++)
-    LISTVIEW_SetItemState(hwnd,i,&item);
+    LISTVIEW_SetItemState(infoPtr,i,&item);
 
-  LISTVIEW_SetItemFocus(hwnd, nItem);
+  LISTVIEW_SetItemFocus(infoPtr, nItem);
   infoPtr->nSelectionMark = nItem;
 }
 
@@ -1947,18 +1918,17 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_AddSelection(HWND hwnd, INT nItem)
+static VOID LISTVIEW_AddSelection(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LVITEMW item;
 
   ZeroMemory(&item,sizeof(item));
   item.state = LVIS_SELECTED;
   item.stateMask = LVIS_SELECTED;
 
-  LISTVIEW_SetItemState(hwnd,nItem,&item);
+  LISTVIEW_SetItemState(infoPtr,nItem,&item);
 
-  LISTVIEW_SetItemFocus(hwnd, nItem);
+  LISTVIEW_SetItemFocus(infoPtr, nItem);
   infoPtr->nSelectionMark = nItem;
 }
 
@@ -1974,28 +1944,27 @@
  *   SELECT: TRUE
  *   UNSELECT : FALSE
  */
-static BOOL LISTVIEW_ToggleSelection(HWND hwnd, INT nItem)
+static BOOL LISTVIEW_ToggleSelection(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult;
   LVITEMW item;
 
   ZeroMemory(&item,sizeof(item));
   item.stateMask = LVIS_SELECTED;
 
-  if (LISTVIEW_IsSelected(hwnd,nItem))
+  if (LISTVIEW_IsSelected(infoPtr,nItem))
   {
-    LISTVIEW_SetItemState(hwnd,nItem,&item);
+    LISTVIEW_SetItemState(infoPtr,nItem,&item);
     bResult = FALSE;
   }
   else
   {
     item.state = LVIS_SELECTED;
-    LISTVIEW_SetItemState(hwnd,nItem,&item);
+    LISTVIEW_SetItemState(infoPtr,nItem,&item);
     bResult = TRUE;
   }
 
-  LISTVIEW_SetItemFocus(hwnd, nItem);
+  LISTVIEW_SetItemFocus(infoPtr, nItem);
   infoPtr->nSelectionMark = nItem;
 
   return bResult;
@@ -2012,9 +1981,8 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_SetSelectionRect(HWND hwnd, RECT rcSelRect)
+static VOID LISTVIEW_SetSelectionRect(LISTVIEW_INFO *infoPtr, RECT rcSelRect)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   POINT ptItem;
   INT i;
   LVITEMW item;
@@ -2024,13 +1992,13 @@
 
   for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
   {
-    LISTVIEW_GetItemPosition(hwnd, i, &ptItem);
+    LISTVIEW_GetItemPosition(infoPtr, i, &ptItem);
 
     if (PtInRect(&rcSelRect, ptItem) != FALSE)
       item.state = LVIS_SELECTED;
     else
       item.state = 0;
-    LISTVIEW_SetItemState(hwnd,i,&item);
+    LISTVIEW_SetItemState(infoPtr,i,&item);
   }
 }
 
@@ -2045,10 +2013,9 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_SetGroupSelection(HWND hwnd, INT nItem)
+static VOID LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   LVITEMW item;
 
   ZeroMemory(&item,sizeof(item));
@@ -2075,7 +2042,7 @@
         item.state = 0;
       else
         item.state = LVIS_SELECTED;
-      LISTVIEW_SetItemState(hwnd,i,&item);
+      LISTVIEW_SetItemState(infoPtr,i,&item);
     }
   }
   else
@@ -2083,13 +2050,13 @@
     RECT rcItem;
     RECT rcSelMark;
     RECT rcSel;
-    LISTVIEW_GetItemBoundBox(hwnd, nItem, &rcItem);
-    LISTVIEW_GetItemBoundBox(hwnd, infoPtr->nSelectionMark, &rcSelMark);
+    LISTVIEW_GetItemBoundBox(infoPtr, nItem, &rcItem);
+    LISTVIEW_GetItemBoundBox(infoPtr, infoPtr->nSelectionMark, &rcSelMark);
     rcSel.left = min(rcSelMark.left, rcItem.left);
     rcSel.top = min(rcSelMark.top, rcItem.top);
     rcSel.right = max(rcSelMark.right, rcItem.right);
     rcSel.bottom = max(rcSelMark.bottom, rcItem.bottom);
-    LISTVIEW_SetSelectionRect(hwnd, rcSel);
+    LISTVIEW_SetSelectionRect(infoPtr, rcSel);
     TRACE("item %d (%d,%d)-(%d,%d), mark %d (%d,%d)-(%d,%d), sel (%d,%d)-(%d,%d)\n",
           nItem, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom,
           infoPtr->nSelectionMark,
@@ -2098,7 +2065,7 @@
 
   }
 
-  LISTVIEW_SetItemFocus(hwnd, nItem);
+  LISTVIEW_SetItemFocus(infoPtr, nItem);
 }
 
 /***
@@ -2113,9 +2080,8 @@
  *   TRUE : focused item changed
  *   FALSE : focused item has NOT changed
  */
-static BOOL LISTVIEW_SetItemFocus(HWND hwnd, INT nItem)
+static BOOL LISTVIEW_SetItemFocus(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult = FALSE;
   LVITEMW lvItem;
 
@@ -2128,16 +2094,16 @@
       infoPtr->nFocusedItem = -1;
       ZeroMemory(&lvItem, sizeof(lvItem));
       lvItem.stateMask = LVIS_FOCUSED;
-      LISTVIEW_SetItemState(hwnd, oldFocus, &lvItem);
+      LISTVIEW_SetItemState(infoPtr, oldFocus, &lvItem);
 
     }
 
     lvItem.state =  LVIS_FOCUSED;
     lvItem.stateMask = LVIS_FOCUSED;
-    LISTVIEW_SetItemState(hwnd, nItem, &lvItem);
+    LISTVIEW_SetItemState(infoPtr, nItem, &lvItem);
 
     infoPtr->nFocusedItem = nItem;
-    LISTVIEW_EnsureVisible(hwnd, nItem, FALSE);
+    LISTVIEW_EnsureVisible(infoPtr, nItem, FALSE);
   }
 
   return bResult;
@@ -2154,20 +2120,19 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_SetSelection(HWND hwnd, INT nItem)
+static VOID LISTVIEW_SetSelection(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LVITEMW lvItem;
 
   ZeroMemory(&lvItem, sizeof(lvItem));
   lvItem.stateMask = LVIS_FOCUSED;
-  LISTVIEW_SetItemState(hwnd, infoPtr->nFocusedItem, &lvItem);
+  LISTVIEW_SetItemState(infoPtr, infoPtr->nFocusedItem, &lvItem);
 
-  LISTVIEW_RemoveAllSelections(hwnd);
+  LISTVIEW_RemoveAllSelections(infoPtr);
 
   lvItem.state =   LVIS_FOCUSED|LVIS_SELECTED;
   lvItem.stateMask = LVIS_FOCUSED|LVIS_SELECTED;
-  LISTVIEW_SetItemState(hwnd, nItem, &lvItem);
+  LISTVIEW_SetItemState(infoPtr, nItem, &lvItem);
 
   infoPtr->nFocusedItem = nItem;
   infoPtr->nSelectionMark = nItem;
@@ -2185,10 +2150,9 @@
  *   SUCCESS : TRUE (needs to be repainted)
  *   FAILURE : FALSE (nothing has changed)
  */
-static BOOL LISTVIEW_KeySelection(HWND hwnd, INT nItem)
+static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   WORD wShift = HIWORD(GetKeyState(VK_SHIFT));
   WORD wCtrl = HIWORD(GetKeyState(VK_CONTROL));
   BOOL bResult = FALSE;
@@ -2198,25 +2162,25 @@
     if (lStyle & LVS_SINGLESEL)
     {
       bResult = TRUE;
-      LISTVIEW_SetSelection(hwnd, nItem);
-      ListView_EnsureVisible(hwnd, nItem, FALSE);
+      LISTVIEW_SetSelection(infoPtr, nItem);
+      ListView_EnsureVisible(infoPtr->hwndSelf, nItem, FALSE);
     }
     else
     {
       if (wShift)
       {
         bResult = TRUE;
-        LISTVIEW_SetGroupSelection(hwnd, nItem);
+        LISTVIEW_SetGroupSelection(infoPtr, nItem);
       }
       else if (wCtrl)
       {
-        bResult = LISTVIEW_SetItemFocus(hwnd, nItem);
+        bResult = LISTVIEW_SetItemFocus(infoPtr, nItem);
       }
       else
       {
         bResult = TRUE;
-        LISTVIEW_SetSelection(hwnd, nItem);
-        ListView_EnsureVisible(hwnd, nItem, FALSE);
+        LISTVIEW_SetSelection(infoPtr, nItem);
+        ListView_EnsureVisible(infoPtr->hwndSelf, nItem, FALSE);
       }
     }
   }
@@ -2230,9 +2194,9 @@
  * amount of time
  *
  * PARAMETER(S):
- * [I] HWND : window handle
- * [I] wParam : key indicator
- * [I] lParam : mouse position
+ * [I] infoPtr : pointer to listview strucure (not NULL)
+ * [I] fwKeys : key indicator
+ * [I] pts : mouse position
  *
  * RETURN:
  *   0 if the message was processed, non-zero if there was an error
@@ -2242,17 +2206,13 @@
  * over the item for a certain period of time.
  *
  */
-static LRESULT LISTVIEW_MouseHover(HWND hwnd, WPARAM wParam, LPARAM lParam)
+static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKyes, POINTS pts)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  POINT pt;
-
-  pt.x = (INT)LOWORD(lParam);
-  pt.y = (INT)HIWORD(lParam);
-
+  POINT pt = { pts.x, pts.y };
+  
   if(infoPtr->dwExStyle & LVS_EX_TRACKSELECT) {
-    /* select the item under the cursor */
-    LISTVIEW_MouseSelection(hwnd, pt);
+    /* FIXME: select the item under the cursor */
+    LISTVIEW_MouseSelection(infoPtr, pt);
   }
 
   return 0;
@@ -2263,16 +2223,15 @@
  * Called whenever WM_MOUSEMOVE is received.
  *
  * PARAMETER(S):
- * [I] HWND : window handle
- * [I] wParam : key indicators
- * [I] lParam : cursor position
+ * [I] infoPtr : pointer to listview strucure (not NULL)
+ * [I] fwKeys : key indicator
+ * [I] pts : mouse position
  *
  * RETURN:
  *   0 if the message is processed, non-zero if there was an error
  */
-static LRESULT LISTVIEW_MouseMove(HWND hwnd, WPARAM wParam, LPARAM lParam)
+static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, POINTS pts)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   TRACKMOUSEEVENT trackinfo;
 
   /* see if we are supposed to be tracking mouse hovering */
@@ -2280,7 +2239,7 @@
      /* fill in the trackinfo struct */
      trackinfo.cbSize = sizeof(TRACKMOUSEEVENT);
      trackinfo.dwFlags = TME_QUERY;
-     trackinfo.hwndTrack = hwnd;
+     trackinfo.hwndTrack = infoPtr->hwndSelf;
      trackinfo.dwHoverTime = infoPtr->dwHoverTime;
 
      /* see if we are already tracking this hwnd */
@@ -2302,41 +2261,33 @@
  * Selects an item based on coordinates.
  *
  * PARAMETER(S):
- * [I] HWND : window handle
- * [I] POINT : mouse click ccordinates
+ * [I] infoPtr : pointer to listview strucure (not NULL)
+ * [I] pt : mouse click ccordinates
  *
  * RETURN:
  *   SUCCESS : item index
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_MouseSelection(HWND hwnd, POINT pt)
+static INT LISTVIEW_MouseSelection(LISTVIEW_INFO *infoPtr, POINT pt)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
+  INT i, topindex, bottomindex;
   RECT rcItem;
-  INT i,topindex,bottomindex;
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
-  UINT uView = lStyle & LVS_TYPEMASK;
 
-  topindex = LISTVIEW_GetTopIndex(hwnd);
-  if (uView == LVS_REPORT)
-  {
-    bottomindex = topindex + LISTVIEW_GetCountPerColumn(hwnd) + 1;
-    bottomindex = min(bottomindex,GETITEMCOUNT(infoPtr));
-  }
-  else
-  {
+  topindex = LISTVIEW_GetTopIndex(infoPtr);
+  if ((lStyle & LVS_TYPEMASK) == LVS_REPORT) {
+    bottomindex = topindex + LISTVIEW_GetCountPerColumn(infoPtr) + 1;
+    bottomindex = min(bottomindex, GETITEMCOUNT(infoPtr));
+  } else {
     bottomindex = GETITEMCOUNT(infoPtr);
   }
 
   for (i = topindex; i < bottomindex; i++)
   {
     rcItem.left = LVIR_SELECTBOUNDS;
-    if (LISTVIEW_GetItemRect(hwnd, i, &rcItem) == TRUE)
+    if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
     {
-      if (PtInRect(&rcItem, pt) != FALSE)
-      {
-        return i;
-      }
+      if (PtInRect(&rcItem, pt)) return i;
     }
   }
 
@@ -2518,10 +2469,10 @@
  *   SUCCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_InitItemT(HWND hwnd, LISTVIEW_ITEM *lpItem,
+static BOOL LISTVIEW_InitItemT(LISTVIEW_INFO *infoPtr, LISTVIEW_ITEM *lpItem,
                               LPLVITEMW lpLVItem, BOOL isW)
 {
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   BOOL bResult = FALSE;
 
   if ((lpItem != NULL) && (lpLVItem != NULL))
@@ -2580,14 +2531,13 @@
  *   SUCCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_InitSubItemT(HWND hwnd, LISTVIEW_SUBITEM *lpSubItem,
+static BOOL LISTVIEW_InitSubItemT(LISTVIEW_INFO *infoPtr, LISTVIEW_SUBITEM *lpSubItem,
                                   LPLVITEMW lpLVItem, BOOL isW)
 {
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   BOOL bResult = FALSE;
 
-  TRACE("(hwnd=%x, lpSubItem=%p, lpLVItem=%s, isW=%d)\n",
-	hwnd, lpSubItem, debuglvitem_t(lpLVItem, isW), isW);
+  TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
 
   if ((lpSubItem != NULL) && (lpLVItem != NULL))
   {
@@ -2634,16 +2584,15 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_AddSubItemT(HWND hwnd, LPLVITEMW lpLVItem, BOOL isW)
+static BOOL LISTVIEW_AddSubItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LISTVIEW_SUBITEM *lpSubItem = NULL;
   BOOL bResult = FALSE;
   HDPA hdpaSubItems;
   INT nPosition, nItem;
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
 
-  TRACE("(hwnd=%x, lpLVItem=%s, isW=%d)\n", hwnd, debuglvitem_t(lpLVItem, isW), isW);
+  TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
 
   if (lStyle & LVS_OWNERDATA)
     return FALSE;
@@ -2657,7 +2606,7 @@
       if (lpSubItem != NULL)
       {
 	ZeroMemory(lpSubItem, sizeof(LISTVIEW_SUBITEM));
-        if (LISTVIEW_InitSubItemT(hwnd, lpSubItem, lpLVItem, isW))
+        if (LISTVIEW_InitSubItemT(infoPtr, lpSubItem, lpLVItem, isW))
         {
           nPosition = LISTVIEW_FindInsertPosition(hdpaSubItems,
                                                   lpSubItem->iSubItem);
@@ -2746,20 +2695,19 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_SetMainItemT(HWND hwnd, LPLVITEMW lpLVItem, BOOL isW)
+static BOOL LISTVIEW_SetMainItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult = FALSE;
   HDPA hdpaSubItems;
   LISTVIEW_ITEM *lpItem;
   NMLISTVIEW nmlv;
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uChanged;
   UINT uView = lStyle & LVS_TYPEMASK;
   INT item_width;
   RECT rcItem;
 
-  TRACE("(hwnd=%x, lpLVItem=%s, isW=%d)\n", hwnd, debuglvitem_t(lpLVItem, isW), isW);
+  TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
 
   if (lStyle & LVS_OWNERDATA)
   {
@@ -2772,7 +2720,7 @@
       itm.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
       itm.iItem = lpLVItem->iItem;
       itm.iSubItem = 0;
-      ListView_GetItemW(hwnd, &itm);
+      ListView_GetItemW(infoPtr->hwndSelf, &itm);
 
 
       ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
@@ -2800,20 +2748,20 @@
           {
             if (lpLVItem->state & LVIS_SELECTED)
             {
-              if (lStyle & LVS_SINGLESEL) LISTVIEW_RemoveAllSelections(hwnd);
-              LISTVIEW_AddSelectionRange(hwnd,lpLVItem->iItem,lpLVItem->iItem);
+              if (lStyle & LVS_SINGLESEL) LISTVIEW_RemoveAllSelections(infoPtr);
+              LISTVIEW_AddSelectionRange(infoPtr,lpLVItem->iItem,lpLVItem->iItem);
             }
             else
-              LISTVIEW_RemoveSelectionRange(hwnd,lpLVItem->iItem,
+              LISTVIEW_RemoveSelectionRange(infoPtr,lpLVItem->iItem,
                                             lpLVItem->iItem);
           }
 
-	  listview_notify(hwnd, LVN_ITEMCHANGED, &nmlv);
+	  listview_notify(infoPtr, LVN_ITEMCHANGED, &nmlv);
 
 	  rcItem.left = LVIR_BOUNDS;
-	  LISTVIEW_GetItemRect(hwnd, lpLVItem->iItem, &rcItem);
+	  LISTVIEW_GetItemRect(infoPtr, lpLVItem->iItem, &rcItem);
       if (!infoPtr->bIsDrawing)
-	  InvalidateRect(hwnd, &rcItem, TRUE);
+	  InvalidateRect(infoPtr->hwndSelf, &rcItem, TRUE);
         }
       return TRUE;
     }
@@ -2849,14 +2797,14 @@
                  * to set the selection.
                  */
                 if (lStyle & LVS_SINGLESEL)
-                  LISTVIEW_RemoveAllSelections(hwnd);
+                  LISTVIEW_RemoveAllSelections(infoPtr);
 
-	        LISTVIEW_AddSelectionRange(hwnd,lpLVItem->iItem,
+	        LISTVIEW_AddSelectionRange(infoPtr,lpLVItem->iItem,
                                              lpLVItem->iItem);
               }
               else if (lpLVItem->stateMask & LVIS_SELECTED)
               {
-                LISTVIEW_RemoveSelectionRange(hwnd,lpLVItem->iItem,
+                LISTVIEW_RemoveSelectionRange(infoPtr,lpLVItem->iItem,
                                               lpLVItem->iItem);
               }
 	      if (nmlv.uNewState & LVIS_FOCUSED)
@@ -2868,7 +2816,7 @@
                  * SetItemFocus call.
                  */
                 if (infoPtr->nFocusedItem >= 0)
-                  LISTVIEW_SetItemFocus(hwnd, lpLVItem->iItem);
+                  LISTVIEW_SetItemFocus(infoPtr, lpLVItem->iItem);
               }
             }
 
@@ -2876,23 +2824,23 @@
             nmlv.iItem = lpLVItem->iItem;
             nmlv.lParam = lpItem->lParam;
             /* send LVN_ITEMCHANGING notification */
-	    listview_notify(hwnd, LVN_ITEMCHANGING, &nmlv);
+	    listview_notify(infoPtr, LVN_ITEMCHANGING, &nmlv);
 
             /* copy information */
-            bResult = LISTVIEW_InitItemT(hwnd, lpItem, lpLVItem, isW);
+            bResult = LISTVIEW_InitItemT(infoPtr, lpItem, lpLVItem, isW);
 
             /* if LVS_LIST or LVS_SMALLICON, update the width of the items
                based on the width of the items text */
             if((uView == LVS_LIST) || (uView == LVS_SMALLICON))
             {
-              item_width = LISTVIEW_GetStringWidthT(hwnd, lpItem->pszText, TRUE);
+              item_width = LISTVIEW_GetStringWidthT(infoPtr, lpItem->pszText, TRUE);
 
               if(item_width > infoPtr->nItemWidth)
                   infoPtr->nItemWidth = item_width;
             }
 
             /* send LVN_ITEMCHANGED notification */
-	    listview_notify(hwnd, LVN_ITEMCHANGED, &nmlv);
+	    listview_notify(infoPtr, LVN_ITEMCHANGED, &nmlv);
           }
           else
           {
@@ -2902,9 +2850,9 @@
           if (uChanged)
           {
             rcItem.left = LVIR_BOUNDS;
-	    LISTVIEW_GetItemRect(hwnd, lpLVItem->iItem, &rcItem);
+	    LISTVIEW_GetItemRect(infoPtr, lpLVItem->iItem, &rcItem);
            if (!infoPtr->bIsDrawing)
-            InvalidateRect(hwnd, &rcItem, TRUE);
+            InvalidateRect(infoPtr->hwndSelf, &rcItem, TRUE);
           }
         }
       }
@@ -2927,16 +2875,15 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_SetSubItemT(HWND hwnd, LPLVITEMW lpLVItem, BOOL isW)
+static BOOL LISTVIEW_SetSubItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   BOOL bResult = FALSE;
   HDPA hdpaSubItems;
   LISTVIEW_SUBITEM *lpSubItem;
   RECT rcItem;
 
-  TRACE("(hwnd=%x, lpLVItem=%s, isW=%d)\n", hwnd, debuglvitem_t(lpLVItem, isW), isW);
+  TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
 
   if (lStyle & LVS_OWNERDATA)
     return FALSE;
@@ -2953,13 +2900,13 @@
         {
           lpSubItem = LISTVIEW_GetSubItem(hdpaSubItems, lpLVItem->iSubItem);
           if (lpSubItem != NULL)
-            bResult = LISTVIEW_InitSubItemT(hwnd, lpSubItem, lpLVItem, isW);
+            bResult = LISTVIEW_InitSubItemT(infoPtr, lpSubItem, lpLVItem, isW);
           else
-            bResult = LISTVIEW_AddSubItemT(hwnd, lpLVItem, isW);
+            bResult = LISTVIEW_AddSubItemT(infoPtr, lpLVItem, isW);
 
           rcItem.left = LVIR_BOUNDS;
-	  LISTVIEW_GetItemRect(hwnd, lpLVItem->iItem, &rcItem);
-	  InvalidateRect(hwnd, &rcItem, FALSE);
+	  LISTVIEW_GetItemRect(infoPtr, lpLVItem->iItem, &rcItem);
+	  InvalidateRect(infoPtr->hwndSelf, &rcItem, FALSE);
         }
       }
     }
@@ -2981,17 +2928,16 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_SetItemT(HWND hwnd, LPLVITEMW lpLVItem, BOOL isW)
+static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
 
   if (!lpLVItem || lpLVItem->iItem < 0 ||
       lpLVItem->iItem>=GETITEMCOUNT(infoPtr))
     return FALSE;
   if (lpLVItem->iSubItem == 0)
-    return LISTVIEW_SetMainItemT(hwnd, lpLVItem, isW);
+    return LISTVIEW_SetMainItemT(infoPtr, lpLVItem, isW);
   else
-    return LISTVIEW_SetSubItemT(hwnd, lpLVItem, isW);
+    return LISTVIEW_SetSubItemT(infoPtr, lpLVItem, isW);
 }
 
 /***
@@ -3004,9 +2950,9 @@
  * RETURN:
  * item index
  */
-static INT LISTVIEW_GetTopIndex(HWND hwnd)
+static INT LISTVIEW_GetTopIndex(LISTVIEW_INFO *infoPtr)
 {
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   INT nItem = 0;
   SCROLLINFO scrollInfo;
@@ -3017,12 +2963,12 @@
 
   if (uView == LVS_LIST)
   {
-    if ((lStyle & WS_HSCROLL) && GetScrollInfo(hwnd, SB_HORZ, &scrollInfo))
-      nItem = scrollInfo.nPos * LISTVIEW_GetCountPerColumn(hwnd);
+    if ((lStyle & WS_HSCROLL) && GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo))
+      nItem = scrollInfo.nPos * LISTVIEW_GetCountPerColumn(infoPtr);
   }
   else if (uView == LVS_REPORT)
   {
-    if ((lStyle & WS_VSCROLL) && GetScrollInfo(hwnd, SB_VERT, &scrollInfo))
+    if ((lStyle & WS_VSCROLL) && GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo))
       nItem = scrollInfo.nPos;
   }
 
@@ -3043,10 +2989,9 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_DrawSubItem(HWND hwnd, HDC hdc, INT nItem, INT nSubItem,
+static VOID LISTVIEW_DrawSubItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nSubItem,
                                  RECT rcItem, BOOL Selected)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   WCHAR szDispText[DISP_TEXT_SIZE];
   LVITEMW lvItem;
   LVCOLUMNW lvColumn;
@@ -3055,7 +3000,7 @@
   INT textLeft;
   INT nLabelWidth = 0;
 
-  TRACE("(hwnd=%x, hdc=%x, nItem=%d, nSubItem=%d)\n", hwnd, hdc,
+  TRACE("(hdc=%x, nItem=%d, nSubItem=%d)\n", hdc,
         nItem, nSubItem);
 
   /* get information needed for drawing the item */
@@ -3066,17 +3011,17 @@
   lvItem.cchTextMax = DISP_TEXT_SIZE;
   lvItem.pszText = szDispText;
   *lvItem.pszText = '\0';
-  LISTVIEW_GetItemW(hwnd, &lvItem, TRUE);
+  LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE);
   TRACE("   lvItem=%s\n", debuglvitem_t(&lvItem, TRUE));
 
   ZeroMemory(&lvColumn, sizeof(lvColumn));
   lvColumn.mask = LVCF_FMT;
-  LISTVIEW_GetColumnT(hwnd, nSubItem, &lvColumn, TRUE);
+  LISTVIEW_GetColumnT(infoPtr, nSubItem, &lvColumn, TRUE);
   textLeft = rcItem.left;
   TRACE("lvColumn.fmt=%d\n", lvColumn.fmt);
   if (lvColumn.fmt != LVCFMT_LEFT)
   {
-    if ((nLabelWidth = LISTVIEW_GetStringWidthT(hwnd, lvItem.pszText, TRUE)))
+    if ((nLabelWidth = LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE)))
     {
       if (lvColumn.fmt == LVCFMT_RIGHT)
         textLeft = rcItem.right - nLabelWidth;
@@ -3093,10 +3038,10 @@
   else
     rcTemp.right += WIDTH_PADDING;
 
-  LISTVIEW_FillBackground(hwnd, hdc, &rcTemp);
+  LISTVIEW_FillBackground(infoPtr, hdc, &rcTemp);
 
   /* set item colors */
-  if (ListView_GetItemState(hwnd,nItem,LVIS_SELECTED) && Selected)
+  if (ListView_GetItemState(infoPtr->hwndSelf,nItem,LVIS_SELECTED) && Selected)
   {
     if (infoPtr->bFocus)
     {
@@ -3165,9 +3110,8 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_DrawItem(HWND hwnd, HDC hdc, INT nItem, RECT rcItem, BOOL FullSelect, RECT* SuggestedFocus)
+static VOID LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, RECT rcItem, BOOL FullSelect, RECT* SuggestedFocus)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   WCHAR szDispText[DISP_TEXT_SIZE];
   INT nLabelWidth;
   LVITEMW lvItem;
@@ -3179,7 +3123,7 @@
   UINT  textoutOptions = ETO_OPAQUE | ETO_CLIPPED;
   RECT rcTemp;
 
-  TRACE("(hwnd=%x, hdc=%x, nItem=%d)\n", hwnd, hdc, nItem);
+  TRACE("(hdc=%x, nItem=%d)\n", hdc, nItem);
 
 
   /* get information needed for drawing the item */
@@ -3191,7 +3135,7 @@
   lvItem.cchTextMax = DISP_TEXT_SIZE;
   lvItem.pszText = szDispText;
   *lvItem.pszText = '\0';
-  LISTVIEW_GetItemW(hwnd, &lvItem, TRUE);
+  LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE);
   TRACE("   lvItem=%s\n", debuglvitem_t(&lvItem, TRUE));
 
   /* redraw the background of the item */
@@ -3201,7 +3145,7 @@
   else
     rcTemp.right+=WIDTH_PADDING;
 
-  LISTVIEW_FillBackground(hwnd, hdc, &rcTemp);
+  LISTVIEW_FillBackground(infoPtr, hdc, &rcTemp);
 
   /* do indent */
   if (lvItem.iIndent>0 && infoPtr->iconSize.cx > 0)
@@ -3264,7 +3208,7 @@
     /* set raster mode */
     nMixMode = SetROP2(hdc, R2_XORPEN);
   }
-  else if ((GetWindowLongW(hwnd, GWL_STYLE) & LVS_SHOWSELALWAYS) &&
+  else if ((GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_SHOWSELALWAYS) &&
            (lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus == FALSE))
   {
     dwBkColor = SetBkColor(hdc, comctl32_color.clr3dFace);
@@ -3292,7 +3236,7 @@
     nMixMode = SetROP2(hdc, R2_COPYPEN);
   }
 
-  nLabelWidth = LISTVIEW_GetStringWidthT(hwnd, lvItem.pszText, TRUE);
+  nLabelWidth = LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
   if (rcItem.left + nLabelWidth < rcItem.right)
   {
     if (!FullSelect)
@@ -3307,8 +3251,8 @@
     dwTextX += IMAGE_PADDING;
 
   if (lvItem.pszText) {
-    TRACE("drawing text  hwnd=%x, rect=(%d,%d)-(%d,%d)\n",
-	  hwnd, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom);
+    TRACE("drawing text  rect=(%d,%d)-(%d,%d)\n",
+	  rcItem.left, rcItem.top, rcItem.right, rcItem.bottom);
     ExtTextOutW(hdc, dwTextX, rcItem.top, textoutOptions,
                 &rcItem, lvItem.pszText, lstrlenW(lvItem.pszText), NULL);
   }
@@ -3351,10 +3295,9 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_DrawLargeItem(HWND hwnd, HDC hdc, INT nItem, RECT rcItem,
+static VOID LISTVIEW_DrawLargeItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, RECT rcItem,
                                    RECT *SuggestedFocus)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
   LVITEMW lvItem;
   UINT uFormat = DT_TOP | DT_CENTER | DT_WORDBREAK | DT_NOPREFIX |
@@ -3362,8 +3305,8 @@
   /* Maintain this format in line with the one in LISTVIEW_UpdateLargeItemLabelRect*/
   RECT rcTemp;
 
-  TRACE("(hwnd=%x, hdc=%x, nItem=%d, left=%d, top=%d, right=%d, bottom=%d)\n",
-        hwnd, hdc, nItem, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom);
+  TRACE("(hdc=%x, nItem=%d, left=%d, top=%d, right=%d, bottom=%d)\n",
+        hdc, nItem, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom);
 
   /* get information needed for drawing the item */
   ZeroMemory(&lvItem, sizeof(lvItem));
@@ -3374,7 +3317,7 @@
   lvItem.cchTextMax = DISP_TEXT_SIZE;
   lvItem.pszText = szDispText;
   *lvItem.pszText = '\0';
-  LISTVIEW_GetItemW(hwnd, &lvItem, FALSE);
+  LISTVIEW_GetItemW(infoPtr, &lvItem, FALSE);
   TRACE("   lvItem=%s\n", debuglvitem_t(&lvItem, TRUE));
 
   /* redraw the background of the item */
@@ -3388,7 +3331,7 @@
   TRACE("background rect (%d,%d)-(%d,%d)\n",
         rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom);
 
-  LISTVIEW_FillBackground(hwnd, hdc, &rcTemp);
+  LISTVIEW_FillBackground(infoPtr, hdc, &rcTemp);
 
 
   /* Figure out text colours etc. depending on state
@@ -3540,9 +3483,8 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_RefreshReport(HWND hwnd, HDC hdc, DWORD cdmode)
+static VOID LISTVIEW_RefreshReport(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd,0);
   SCROLLINFO scrollInfo;
   INT nDrawPosY = infoPtr->rcList.top;
   INT nColumnCount;
@@ -3552,7 +3494,7 @@
   INT nLast;
   BOOL FullSelected;
   DWORD cditemmode = CDRF_DODEFAULT;
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   INT scrollOffset;
 
   TRACE("\n");
@@ -3560,24 +3502,24 @@
   scrollInfo.cbSize = sizeof(SCROLLINFO);
   scrollInfo.fMask = SIF_POS;
 
-  nItem = ListView_GetTopIndex(hwnd);
+  nItem = ListView_GetTopIndex(infoPtr->hwndSelf);
 
   /* add 1 for displaying a partial item at the bottom */
-  nLast = nItem + LISTVIEW_GetCountPerColumn(hwnd) + 1;
+  nLast = nItem + LISTVIEW_GetCountPerColumn(infoPtr) + 1;
   nLast = min(nLast, GETITEMCOUNT(infoPtr));
 
   /* send cache hint notification */
-  if (GetWindowLongW(hwnd,GWL_STYLE) & LVS_OWNERDATA)
+  if (lStyle & LVS_OWNERDATA)
   {
     NMLVCACHEHINT nmlv;
 
-    nmlv.hdr.hwndFrom = hwnd;
-    nmlv.hdr.idFrom = GetWindowLongW(hwnd,GWL_ID);
+    nmlv.hdr.hwndFrom = infoPtr->hwndSelf;
+    nmlv.hdr.idFrom = GetWindowLongW(infoPtr->hwndSelf,GWL_ID);
     nmlv.hdr.code = LVN_ODCACHEHINT;
     nmlv.iFrom = nItem;
     nmlv.iTo   = nLast;
 
-    SendMessageW(GetParent(hwnd), WM_NOTIFY, (WPARAM)nmlv.hdr.idFrom,
+    SendMessageW(GetParent(infoPtr->hwndSelf), WM_NOTIFY, (WPARAM)nmlv.hdr.idFrom,
                  (LPARAM)&nmlv);
   }
 
@@ -3587,14 +3529,14 @@
 
   /* clear the background of any part of the control that doesn't contain items */
   SubtractRect(&rcTemp, &infoPtr->rcList, &infoPtr->rcView);
-  LISTVIEW_FillBackground(hwnd, hdc, &rcTemp);
+  LISTVIEW_FillBackground(infoPtr, hdc, &rcTemp);
 
   /* nothing to draw */
   if(GETITEMCOUNT(infoPtr) == 0)
     return;
 
   /* Get scroll bar info once before loop */
-  GetScrollInfo(hwnd, SB_HORZ, &scrollInfo);
+  GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo);
   scrollOffset = scrollInfo.nPos;
 
   for (; nItem < nLast; nItem++)
@@ -3604,7 +3546,7 @@
     /* Do Owner Draw */
     if (lStyle & LVS_OWNERDRAWFIXED)
     {
-        UINT uID = GetWindowLongW( hwnd, GWL_ID);
+        UINT uID = GetWindowLongW(infoPtr->hwndSelf, GWL_ID);
         DRAWITEMSTRUCT dis;
         LVITEMW item;
         RECT br;
@@ -3616,10 +3558,10 @@
         dis.itemAction = ODA_DRAWENTIRE;
         dis.itemState = 0;
 
-        if (LISTVIEW_IsSelected(hwnd,nItem)) dis.itemState|=ODS_SELECTED;
+        if (LISTVIEW_IsSelected(infoPtr,nItem)) dis.itemState|=ODS_SELECTED;
         if (nItem==infoPtr->nFocusedItem)   dis.itemState|=ODS_FOCUS;
 
-        dis.hwndItem = hwnd;
+        dis.hwndItem = infoPtr->hwndSelf;
         dis.hDC = hdc;
 
         Header_GetItemRect(infoPtr->hwndHeader, nColumnCount-1, &br);
@@ -3632,11 +3574,11 @@
         ZeroMemory(&item,sizeof(item));
         item.iItem = nItem;
         item.mask = LVIF_PARAM;
-        ListView_GetItemW(hwnd, &item);
+        ListView_GetItemW(infoPtr->hwndSelf, &item);
 
         dis.itemData = item.lParam;
 
-        if (SendMessageW(GetParent(hwnd),WM_DRAWITEM,(WPARAM)uID,(LPARAM)&dis))
+        if (SendMessageW(GetParent(infoPtr->hwndSelf),WM_DRAWITEM,(WPARAM)uID,(LPARAM)&dis))
         {
           nDrawPosY += infoPtr->nItemHeight;
           continue;
@@ -3661,7 +3603,7 @@
     for (j = 0; j < nColumnCount; j++)
     {
       if (cdmode & CDRF_NOTIFYITEMDRAW)
-        cditemmode = LISTVIEW_SendCustomDrawItemNotify (hwnd, hdc, nItem, j,
+        cditemmode = LISTVIEW_SendCustomDrawItemNotify (infoPtr, hdc, nItem, j,
                                                       CDDS_ITEMPREPAINT);
       if (cditemmode & CDRF_SKIPDEFAULT)
         continue;
@@ -3679,25 +3621,25 @@
 
       if (j == 0)
       {
-        LISTVIEW_DrawItem(hwnd, hdc, nItem, rcItem, FullSelected,
+        LISTVIEW_DrawItem(infoPtr, hdc, nItem, rcItem, FullSelected,
                           &SuggestedFocusRect);
       }
       else
       {
-        LISTVIEW_DrawSubItem(hwnd, hdc, nItem, j, rcItem, FullSelected);
+        LISTVIEW_DrawSubItem(infoPtr, hdc, nItem, j, rcItem, FullSelected);
       }
 
       if (cditemmode & CDRF_NOTIFYPOSTPAINT)
-        LISTVIEW_SendCustomDrawItemNotify(hwnd, hdc, nItem, 0,
+        LISTVIEW_SendCustomDrawItemNotify(infoPtr, hdc, nItem, 0,
 				      CDDS_ITEMPOSTPAINT);
     }
     /*
      * Draw Focus Rect
      */
-    if (LISTVIEW_GetItemState(hwnd,nItem,LVIS_FOCUSED) && infoPtr->bFocus)
+    if (LISTVIEW_GetItemState(infoPtr,nItem,LVIS_FOCUSED) && infoPtr->bFocus)
     {
       BOOL rop=FALSE;
-      if (FullSelected && LISTVIEW_GetItemState(hwnd,nItem,LVIS_SELECTED))
+      if (FullSelected && LISTVIEW_GetItemState(infoPtr,nItem,LVIS_SELECTED))
         rop = SetROP2(hdc, R2_XORPEN);
 
       Rectangle(hdc, SuggestedFocusRect.left, SuggestedFocusRect.top,
@@ -3720,10 +3662,9 @@
  * RETURN:
  * Number of items per row.
  */
-static INT LISTVIEW_GetCountPerRow(HWND hwnd)
+static INT LISTVIEW_GetCountPerRow(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd,0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
   INT nCountPerRow = 1;
 
@@ -3750,9 +3691,8 @@
  * RETURN:
  * Number of items per column.
  */
-static INT LISTVIEW_GetCountPerColumn(HWND hwnd)
+static INT LISTVIEW_GetCountPerColumn(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd,0);
   INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
   INT nCountPerColumn = 1;
 
@@ -3781,10 +3721,9 @@
  * RETURN:
  * Number of columns.
  */
-static INT LISTVIEW_GetColumnCount(HWND hwnd)
+static INT LISTVIEW_GetColumnCount(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   INT nColumnCount = 0;
 
   if ((lStyle & LVS_TYPEMASK) == LVS_LIST)
@@ -3808,9 +3747,8 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_RefreshList(HWND hwnd, HDC hdc, DWORD cdmode)
+static VOID LISTVIEW_RefreshList(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   RECT rcItem, FocusRect, rcTemp;
   INT i, j;
   INT nItem;
@@ -3821,16 +3759,16 @@
   DWORD cditemmode = CDRF_DODEFAULT;
 
   /* get number of fully visible columns */
-  nColumnCount = LISTVIEW_GetColumnCount(hwnd);
+  nColumnCount = LISTVIEW_GetColumnCount(infoPtr);
   infoPtr->nColumnCount = nColumnCount;
-  nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
-  nItem = ListView_GetTopIndex(hwnd);
+  nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
+  nItem = ListView_GetTopIndex(infoPtr->hwndSelf);
   TRACE("nColumnCount=%d, nCountPerColumn=%d, start item=%d\n",
 	nColumnCount, nCountPerColumn, nItem);
 
   /* paint the background of the control that doesn't contain any items */
   SubtractRect(&rcTemp, &infoPtr->rcList, &infoPtr->rcView);
-  LISTVIEW_FillBackground(hwnd, hdc, &rcTemp);
+  LISTVIEW_FillBackground(infoPtr, hdc, &rcTemp);
 
   /* nothing to draw, return here */
   if(GETITEMCOUNT(infoPtr) == 0)
@@ -3844,7 +3782,7 @@
         return;
 
       if (cdmode & CDRF_NOTIFYITEMDRAW)
-        cditemmode = LISTVIEW_SendCustomDrawItemNotify (hwnd, hdc, nItem, 0,
+        cditemmode = LISTVIEW_SendCustomDrawItemNotify (infoPtr, hdc, nItem, 0,
                                                       CDDS_ITEMPREPAINT);
       if (cditemmode & CDRF_SKIPDEFAULT)
         continue;
@@ -3853,16 +3791,16 @@
       rcItem.left = i * nItemWidth;
       rcItem.bottom = rcItem.top + nItemHeight;
       rcItem.right = rcItem.left + nItemWidth;
-      LISTVIEW_DrawItem(hwnd, hdc, nItem, rcItem, FALSE, &FocusRect);
+      LISTVIEW_DrawItem(infoPtr, hdc, nItem, rcItem, FALSE, &FocusRect);
       /*
        * Draw Focus Rect
        */
-      if (LISTVIEW_GetItemState(hwnd,nItem,LVIS_FOCUSED) && infoPtr->bFocus)
+      if (LISTVIEW_GetItemState(infoPtr,nItem,LVIS_FOCUSED) && infoPtr->bFocus)
       Rectangle(hdc, FocusRect.left, FocusRect.top,
                 FocusRect.right,FocusRect.bottom);
 
       if (cditemmode & CDRF_NOTIFYPOSTPAINT)
-        LISTVIEW_SendCustomDrawItemNotify(hwnd, hdc, nItem, 0,
+        LISTVIEW_SendCustomDrawItemNotify(infoPtr, hdc, nItem, 0,
                                           CDDS_ITEMPOSTPAINT);
 
     }
@@ -3880,9 +3818,8 @@
  * RETURN:
  * None
  */
-static VOID LISTVIEW_RefreshIcon(HWND hwnd, HDC hdc, BOOL bSmall, DWORD cdmode)
+static VOID LISTVIEW_RefreshIcon(LISTVIEW_INFO *infoPtr, HDC hdc, BOOL bSmall, DWORD cdmode)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   POINT ptPosition;
   POINT ptOrigin;
   RECT rcItem, SuggestedFocus, rcTemp;
@@ -3895,22 +3832,22 @@
 
   /* paint the background of the control that doesn't contain any items */
   SubtractRect(&rcTemp, &infoPtr->rcList, &infoPtr->rcView);
-  LISTVIEW_FillBackground(hwnd, hdc, &rcTemp);
+  LISTVIEW_FillBackground(infoPtr, hdc, &rcTemp);
 
   /* nothing to draw, return here */
   if(GETITEMCOUNT(infoPtr) == 0)
     return;
 
-  LISTVIEW_GetOrigin(hwnd, &ptOrigin);
+  LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
   for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
   {
     if (cdmode & CDRF_NOTIFYITEMDRAW)
-      cditemmode = LISTVIEW_SendCustomDrawItemNotify (hwnd, hdc, i, 0,
+      cditemmode = LISTVIEW_SendCustomDrawItemNotify (infoPtr, hdc, i, 0,
                                                       CDDS_ITEMPREPAINT);
     if (cditemmode & CDRF_SKIPDEFAULT)
         continue;
 
-    LISTVIEW_GetItemPosition(hwnd, i, &ptPosition);
+    LISTVIEW_GetItemPosition(infoPtr, i, &ptPosition);
     ptPosition.x += ptOrigin.x;
     ptPosition.y += ptOrigin.y;
 
@@ -3927,13 +3864,13 @@
             rcItem.bottom = rcItem.top + infoPtr->nItemHeight;
             rcItem.right = rcItem.left + infoPtr->nItemWidth;
             if (bSmall)
-              LISTVIEW_DrawItem(hwnd, hdc, i, rcItem, FALSE, &SuggestedFocus);
+              LISTVIEW_DrawItem(infoPtr, hdc, i, rcItem, FALSE, &SuggestedFocus);
             else
-              LISTVIEW_DrawLargeItem(hwnd, hdc, i, rcItem, &SuggestedFocus);
+              LISTVIEW_DrawLargeItem(infoPtr, hdc, i, rcItem, &SuggestedFocus);
             /*
              * Draw Focus Rect
              */
-            if (LISTVIEW_GetItemState(hwnd,i,LVIS_FOCUSED) &&
+            if (LISTVIEW_GetItemState(infoPtr,i,LVIS_FOCUSED) &&
                 infoPtr->bFocus && !IsRectEmpty(&SuggestedFocus))
               Rectangle(hdc, SuggestedFocus.left, SuggestedFocus.top,
 	                SuggestedFocus.right,SuggestedFocus.bottom);
@@ -3942,7 +3879,7 @@
       }
     }
     if (cditemmode & CDRF_NOTIFYPOSTPAINT)
-        LISTVIEW_SendCustomDrawItemNotify(hwnd, hdc, i, 0,
+        LISTVIEW_SendCustomDrawItemNotify(infoPtr, hdc, i, 0,
                                           CDDS_ITEMPOSTPAINT);
   }
 }
@@ -3958,10 +3895,9 @@
  * RETURN:
  * NoneX
  */
-static VOID LISTVIEW_Refresh(HWND hwnd, HDC hdc)
+static VOID LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   HFONT hOldFont;
   HPEN hPen, hOldPen;
   DWORD cdmode;
@@ -3970,8 +3906,8 @@
   infoPtr->bIsDrawing = TRUE;
   LISTVIEW_DumpListview (infoPtr, __LINE__);
 
-  GetClientRect(hwnd, &rect);
-  cdmode = LISTVIEW_SendCustomDrawNotify(hwnd,CDDS_PREPAINT,hdc,rect);
+  GetClientRect(infoPtr->hwndSelf, &rect);
+  cdmode = LISTVIEW_SendCustomDrawNotify(infoPtr,CDDS_PREPAINT,hdc,rect);
 
   if (cdmode == CDRF_SKIPDEFAULT) return;
 
@@ -3987,13 +3923,13 @@
 
   TRACE("\n");
   if (uView == LVS_LIST)
-    LISTVIEW_RefreshList(hwnd, hdc, cdmode);
+    LISTVIEW_RefreshList(infoPtr, hdc, cdmode);
   else if (uView == LVS_REPORT)
-    LISTVIEW_RefreshReport(hwnd, hdc, cdmode);
+    LISTVIEW_RefreshReport(infoPtr, hdc, cdmode);
   else if (uView == LVS_SMALLICON)
-    LISTVIEW_RefreshIcon(hwnd, hdc, TRUE, cdmode);
+    LISTVIEW_RefreshIcon(infoPtr, hdc, TRUE, cdmode);
   else if (uView == LVS_ICON)
-    LISTVIEW_RefreshIcon(hwnd, hdc, FALSE, cdmode);
+    LISTVIEW_RefreshIcon(infoPtr, hdc, FALSE, cdmode);
 
   /* unselect objects */
   SelectObject(hdc, hOldFont);
@@ -4003,7 +3939,7 @@
   DeleteObject(hPen);
 
   if (cdmode & CDRF_NOTIFYPOSTPAINT)
-      LISTVIEW_SendCustomDrawNotify(hwnd, CDDS_POSTPAINT, hdc, rect);
+      LISTVIEW_SendCustomDrawNotify(infoPtr, CDDS_POSTPAINT, hdc, rect);
 
   infoPtr->bIsDrawing = FALSE;
 }
@@ -4022,11 +3958,10 @@
  * RETURN:
  * Returns a DWORD. The width in the low word and the height in high word.
  */
-static LRESULT LISTVIEW_ApproximateViewRect(HWND hwnd, INT nItemCount,
+static LRESULT LISTVIEW_ApproximateViewRect(LISTVIEW_INFO *infoPtr, INT nItemCount,
                                             WORD wWidth, WORD wHeight)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nItemCountPerColumn = 1;
   INT nColumnCount = 0;
   DWORD dwViewRect = 0;
@@ -4088,9 +4023,9 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_Arrange(HWND hwnd, INT nAlignCode)
+static LRESULT LISTVIEW_Arrange(LISTVIEW_INFO *infoPtr, INT nAlignCode)
 {
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   BOOL bResult = FALSE;
 
   if ((uView == LVS_ICON) || (uView == LVS_SMALLICON))
@@ -4129,10 +4064,9 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_DeleteAllItems(HWND hwnd)
+static LRESULT LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   LISTVIEW_ITEM *lpItem;
   LISTVIEW_SUBITEM *lpSubItem;
@@ -4141,9 +4075,9 @@
   BOOL bResult = FALSE;
   HDPA hdpaSubItems;
 
-  TRACE("(hwnd=%x,)\n", hwnd);
+  TRACE("()\n");
 
-  LISTVIEW_RemoveAllSelections(hwnd);
+  LISTVIEW_RemoveAllSelections(infoPtr);
   infoPtr->nSelectionMark=-1;
   infoPtr->nFocusedItem=-1;
   /* But we are supposed to leave nHotItem as is! */
@@ -4151,7 +4085,7 @@
   if (lStyle & LVS_OWNERDATA)
   {
     infoPtr->hdpaItems->nItemCount = 0;
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
     return TRUE;
   }
 
@@ -4164,7 +4098,7 @@
        suppressed */
     ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
     nmlv.iItem = -1;
-    bSuppress = listview_notify(hwnd, LVN_DELETEALLITEMS, &nmlv);
+    bSuppress = listview_notify(infoPtr, LVN_DELETEALLITEMS, &nmlv);
 
     for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
     {
@@ -4193,7 +4127,7 @@
             /* send LVN_DELETEITEM notification */
             nmlv.iItem = i;
             nmlv.lParam = lpItem->lParam;
-            listview_notify(hwnd, LVN_DELETEITEM, &nmlv);
+            listview_notify(infoPtr, LVN_DELETEITEM, &nmlv);
           }
 
           /* free item string */
@@ -4216,18 +4150,18 @@
     {
       if (lStyle & LVS_ALIGNLEFT)
       {
-        LISTVIEW_AlignLeft(hwnd);
+        LISTVIEW_AlignLeft(infoPtr);
       }
       else
       {
-        LISTVIEW_AlignTop(hwnd);
+        LISTVIEW_AlignTop(infoPtr);
       }
     }
 
-    LISTVIEW_UpdateScroll(hwnd);
+    LISTVIEW_UpdateScroll(infoPtr);
 
     /* invalidate client area (optimization needed) */
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
   }
 
   return bResult;
@@ -4245,11 +4179,10 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_DeleteColumn(HWND hwnd, INT nColumn)
+static LRESULT LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
-  UINT uOwnerData = GetWindowLongW(hwnd, GWL_STYLE) & LVS_OWNERDATA;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uOwnerData = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_OWNERDATA;
   BOOL bResult = FALSE;
 
   if (Header_DeleteItem(infoPtr->hwndHeader, nColumn) != FALSE)
@@ -4257,16 +4190,16 @@
     bResult = uOwnerData ? TRUE : LISTVIEW_RemoveColumn(infoPtr->hdpaItems, nColumn);
 
     /* Need to reset the item width when deleting a column */
-    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
+    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
 
     /* reset scroll parameters */
     if (uView == LVS_REPORT)
     {
       /* update scrollbar(s) */
-      LISTVIEW_UpdateScroll(hwnd);
+      LISTVIEW_UpdateScroll(infoPtr);
 
       /* refresh client area */
-      InvalidateRect(hwnd, NULL, FALSE);
+      InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
     }
   }
 
@@ -4285,12 +4218,11 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_DeleteItem(HWND hwnd, INT nItem)
+static LRESULT LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
-  LONG lCtrlId = GetWindowLongW(hwnd, GWL_ID);
+  LONG lCtrlId = GetWindowLongW(infoPtr->hwndSelf, GWL_ID);
   NMLISTVIEW nmlv;
   BOOL bResult = FALSE;
   HDPA hdpaSubItems;
@@ -4299,28 +4231,28 @@
   INT i;
   LVITEMW item;
 
-  TRACE("(hwnd=%x, nItem=%d)\n", hwnd, nItem);
+  TRACE("(nItem=%d)\n", nItem);
 
 
   /* First, send LVN_DELETEITEM notification. */
   memset(&nmlv, 0, sizeof (NMLISTVIEW));
-  nmlv.hdr.hwndFrom = hwnd;
+  nmlv.hdr.hwndFrom = infoPtr->hwndSelf;
   nmlv.hdr.idFrom = lCtrlId;
   nmlv.hdr.code = LVN_DELETEITEM;
   nmlv.iItem = nItem;
-  SendMessageW(GetParent(hwnd), WM_NOTIFY, (WPARAM)lCtrlId,
+  SendMessageW(GetParent(infoPtr->hwndSelf), WM_NOTIFY, (WPARAM)lCtrlId,
                (LPARAM)&nmlv);
 
 
   /* remove it from the selection range */
   ZeroMemory(&item,sizeof(item));
   item.stateMask = LVIS_SELECTED;
-  LISTVIEW_SetItemState(hwnd,nItem,&item);
+  LISTVIEW_SetItemState(infoPtr,nItem,&item);
 
   if (lStyle & LVS_OWNERDATA)
   {
     infoPtr->hdpaItems->nItemCount --;
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
     return TRUE;
   }
 
@@ -4360,21 +4292,21 @@
       bResult = DPA_Destroy(hdpaSubItems);
     }
 
-    LISTVIEW_ShiftIndices(hwnd,nItem,-1);
+    LISTVIEW_ShiftIndices(infoPtr,nItem,-1);
 
     /* align items (set position of each item) */
     if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
     {
       if (lStyle & LVS_ALIGNLEFT)
-        LISTVIEW_AlignLeft(hwnd);
+        LISTVIEW_AlignLeft(infoPtr);
       else
-        LISTVIEW_AlignTop(hwnd);
+        LISTVIEW_AlignTop(infoPtr);
     }
 
-    LISTVIEW_UpdateScroll(hwnd);
+    LISTVIEW_UpdateScroll(infoPtr);
 
     /* refresh client area */
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
   }
 
   return bResult;
@@ -4392,9 +4324,8 @@
  *   SUCCESS : HWND
  *   FAILURE : 0
  */
-static LRESULT LISTVIEW_GetEditControl(HWND hwnd)
+static LRESULT LISTVIEW_GetEditControl(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   return (LRESULT)infoPtr->hwndEdit;
 }
 
@@ -4413,10 +4344,9 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_EndEditLabelT(HWND hwnd, LPWSTR pszText, DWORD nItem, BOOL isW)
+static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, LPWSTR pszText, INT nItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   NMLVDISPINFOW dispInfo;
   LISTVIEW_ITEM *lpItem;
   HDPA hdpaSubItems;
@@ -4424,7 +4354,7 @@
   LVITEMW item;
   BOOL bResult = TRUE;
 
-  TRACE("(hwnd=%x, pszText=%s, nItem=%ld, isW=%d)\n", hwnd, debugstr_t(pszText, isW), nItem, isW);
+  TRACE("(pszText=%s, nItem=%d, isW=%d)\n", debugstr_t(pszText, isW), nItem, isW);
 
   if (!(lStyle & LVS_OWNERDATA))
   {
@@ -4441,7 +4371,7 @@
     item.iItem = nItem;
     item.iSubItem = 0;
     item.mask = LVIF_PARAM | LVIF_STATE;
-    ListView_GetItemW(hwnd, &item);
+    ListView_GetItemW(infoPtr->hwndSelf, &item);
     lvItemRef.state = item.state;
     lvItemRef.iImage = item.iImage;
     lvItemRef.lParam = item.lParam;
@@ -4460,7 +4390,7 @@
   infoPtr->Editing = FALSE;
 
   /* Do we need to update the Item Text */
-  if(dispinfo_notifyT(hwnd, LVN_ENDLABELEDITW, &dispInfo, isW))
+  if(dispinfo_notifyT(infoPtr, LVN_ENDLABELEDITW, &dispInfo, isW))
     if (lpItem->pszText != LPSTR_TEXTCALLBACKW && !(lStyle & LVS_OWNERDATA))
       bResult = textsetptrT(&lpItem->pszText, pszText, isW);
 
@@ -4469,42 +4399,6 @@
 
 /***
  * DESCRIPTION:
- * Callback implementation for editlabel control
- *
- * PARAMETER(S):
- * [I] HWND : window handle
- * [I] LPSTR : modified text
- * [I] DWORD : item index
- *
- * RETURN:
- *   SUCCESS : TRUE
- *   FAILURE : FALSE
- */
-static BOOL LISTVIEW_EndEditLabelW(HWND hwnd, LPWSTR pszText, DWORD nItem)
-{
-    return LISTVIEW_EndEditLabelT(hwnd, pszText, nItem, TRUE);
-}
-
-/***
- * DESCRIPTION:
- * Callback implementation for editlabel control
- *
- * PARAMETER(S):
- * [I] HWND : window handle
- * [I] LPSTR : modified text
- * [I] DWORD : item index
- *
- * RETURN:
- *   SUCCESS : TRUE
- *   FAILURE : FALSE
- */
-static BOOL LISTVIEW_EndEditLabelA(HWND hwnd, LPSTR pszText, DWORD nItem)
-{
-    return LISTVIEW_EndEditLabelT(hwnd, (LPWSTR)pszText, nItem, FALSE);
-}
-
-/***
- * DESCRIPTION:
  * Begin in place editing of specified list view item
  *
  * PARAMETER(S):
@@ -4516,32 +4410,32 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static HWND LISTVIEW_EditLabelT(HWND hwnd, INT nItem, BOOL isW)
+static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
 {
   NMLVDISPINFOW dispInfo;
   RECT rect;
   LISTVIEW_ITEM *lpItem;
   HWND hedit;
-  HINSTANCE hinst = GetWindowLongW(hwnd, GWL_HINSTANCE);
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   HDPA hdpaSubItems;
   WCHAR szDispText[DISP_TEXT_SIZE];
   LVITEMW lvItem;
   LISTVIEW_ITEM lvItemRef;
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
 
-  if (~GetWindowLongW(hwnd, GWL_STYLE) & LVS_EDITLABELS)
+  if (~GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_EDITLABELS)
       return FALSE;
 
+  TRACE("(nItem=%d, isW=%d)\n", nItem, isW);
+
   /* Is the EditBox still there, if so remove it */
   if(infoPtr->hwndEdit != 0)
   {
-      SetFocus(hwnd);
+      SetFocus(infoPtr->hwndSelf);
       infoPtr->hwndEdit = 0;
   }
 
-  LISTVIEW_SetSelection(hwnd, nItem);
-  LISTVIEW_SetItemFocus(hwnd, nItem);
+  LISTVIEW_SetSelection(infoPtr, nItem);
+  LISTVIEW_SetItemFocus(infoPtr, nItem);
 
   if (!(lStyle & LVS_OWNERDATA))
   {
@@ -4559,7 +4453,7 @@
     item.iItem = nItem;
     item.iSubItem = 0;
     item.mask = LVIF_PARAM | LVIF_STATE;
-    ListView_GetItemW(hwnd, &item);
+    ListView_GetItemW(infoPtr->hwndSelf, &item);
     lvItemRef.iImage = item.iImage;
     lvItemRef.state = item.state;
     lvItemRef.lParam = item.lParam;
@@ -4574,7 +4468,7 @@
   lvItem.cchTextMax = DISP_TEXT_SIZE;
   lvItem.pszText = szDispText;
   *lvItem.pszText = '\0';
-  LISTVIEW_GetItemT(hwnd, &lvItem, FALSE, isW);
+  LISTVIEW_GetItemT(infoPtr, &lvItem, FALSE, isW);
 
   ZeroMemory(&dispInfo, sizeof(dispInfo));
   dispInfo.item.mask = 0;
@@ -4586,16 +4480,15 @@
   dispInfo.item.iImage = lpItem->iImage;
   dispInfo.item.lParam = lpItem->lParam;
 
-  if (dispinfo_notifyT(hwnd, LVN_BEGINLABELEDITW, &dispInfo, isW))
+  if (dispinfo_notifyT(infoPtr, LVN_BEGINLABELEDITW, &dispInfo, isW))
 	  return 0;
 
   rect.left = LVIR_LABEL;
-  if (!LISTVIEW_GetItemRect(hwnd, nItem, &rect))
+  if (!LISTVIEW_GetItemRect(infoPtr, nItem, &rect))
 	  return 0;
 
-  if (!(hedit = CreateEditLabelT(szDispText , WS_VISIBLE,
-		 rect.left-2, rect.top-1, 0, rect.bottom - rect.top+2, hwnd, hinst,
-		 isW ? LISTVIEW_EndEditLabelW : (EditlblCallbackW)LISTVIEW_EndEditLabelA,
+  if (!(hedit = CreateEditLabelT(infoPtr, szDispText, WS_VISIBLE,
+		 rect.left-2, rect.top-1, 0, rect.bottom - rect.top+2,
 		 nItem, isW)))
 	 return 0;
 
@@ -4622,10 +4515,9 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
+static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *infoPtr, INT nItem, BOOL bPartial)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nScrollPosHeight = 0;
   INT nScrollPosWidth = 0;
   SCROLLINFO scrollInfo;
@@ -4639,11 +4531,11 @@
   /* ALWAYS bPartial == FALSE, FOR NOW! */
 
   rcItem.left = LVIR_BOUNDS;
-  if (LISTVIEW_GetItemRect(hwnd, nItem, &rcItem) != FALSE)
+  if (LISTVIEW_GetItemRect(infoPtr, nItem, &rcItem) != FALSE)
   {
     if (rcItem.left < infoPtr->rcList.left)
     {
-      if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo) != FALSE)
       {
         /* scroll left */
         bRedraw = TRUE;
@@ -4667,13 +4559,13 @@
 	  else
 	    scrollInfo.nPos += rcItem.left / nScrollPosWidth - 1;
 
-	  SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
+	  SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
 	}
       }
     }
     else if (rcItem.right > infoPtr->rcList.right)
     {
-      if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo) != FALSE)
       {
         /* scroll right */
 	bRedraw = TRUE;
@@ -4697,7 +4589,7 @@
 	  else
 	    scrollInfo.nPos += rcItem.right / nScrollPosWidth + 1;
 
-	  SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
+	  SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
 	}
       }
     }
@@ -4706,7 +4598,7 @@
     {
       /* scroll up */
       bRedraw = TRUE;
-      if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo) != FALSE)
       {
         if (uView == LVS_REPORT)
         {
@@ -4724,14 +4616,14 @@
         else
           scrollInfo.nPos += rcItem.top / nScrollPosHeight - 1;
 
-        SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
+        SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
       }
     }
     else if (rcItem.bottom > infoPtr->rcList.bottom)
     {
       /* scroll down */
       bRedraw = TRUE;
-      if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo) != FALSE)
       {
         if (uView == LVS_REPORT)
         {
@@ -4749,13 +4641,13 @@
         else
           scrollInfo.nPos += rcItem.bottom / nScrollPosHeight + 1;
 
-        SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
+        SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
       }
     }
   }
 
   if(bRedraw)
-    InvalidateRect(hwnd,NULL,TRUE);
+    InvalidateRect(infoPtr->hwndSelf,NULL,TRUE);
   return TRUE;
 }
 
@@ -4771,9 +4663,8 @@
  * RETURN:
  * Item index if successdful, -1 otherwise.
  */
-static INT LISTVIEW_GetNearestItem(HWND hwnd, POINT pt, UINT vkDirection)
+static INT LISTVIEW_GetNearestItem(LISTVIEW_INFO *infoPtr, POINT pt, UINT vkDirection)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LV_INTHIT lvIntHit;
   INT nItem = -1;
   RECT rcView;
@@ -4783,10 +4674,10 @@
         ((vkDirection == VK_UP) ? "VK_UP" :
         ((vkDirection == VK_LEFT) ? "VK_LEFT" : "VK_RIGHT")));
 
-  if (LISTVIEW_GetViewRect(hwnd, &rcView) != FALSE)
+  if (LISTVIEW_GetViewRect(infoPtr, &rcView) != FALSE)
   {
     ZeroMemory(&lvIntHit, sizeof(lvIntHit));
-    LISTVIEW_GetOrigin(hwnd, &lvIntHit.ht.pt);
+    LISTVIEW_GetOrigin(infoPtr, &lvIntHit.ht.pt);
     lvIntHit.ht.pt.x += pt.x;
     lvIntHit.ht.pt.y += pt.y;
 
@@ -4803,7 +4694,7 @@
       return -1;
     else
     {
-      nItem = LISTVIEW_SuperHitTestItem(hwnd, &lvIntHit, TRUE);
+      nItem = LISTVIEW_SuperHitTestItem(infoPtr, &lvIntHit, TRUE);
       return nItem == -1 ? lvIntHit.iDistItem : nItem;
     }
   }
@@ -4824,10 +4715,9 @@
  *   SUCCESS : index of item
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_FindItemW(HWND hwnd, INT nStart,
+static LRESULT LISTVIEW_FindItemW(LISTVIEW_INFO *infoPtr, INT nStart,
                                   LPLVFINDINFOW lpFindInfo)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   POINT ptItem;
   WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
   LVITEMW lvItem;
@@ -4866,12 +4756,12 @@
       {
         if (lpFindInfo->flags & LVFI_NEARESTXY)
         {
-          nItem = LISTVIEW_GetNearestItem(hwnd, ptItem,
+          nItem = LISTVIEW_GetNearestItem(infoPtr, ptItem,
                                           lpFindInfo->vkDirection);
           if (nItem != -1)
           {
             /* get position of the new item index */
-            if (ListView_GetItemPosition(hwnd, nItem, &ptItem) == FALSE)
+            if (ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &ptItem) == FALSE)
               return -1;
           }
           else
@@ -4884,7 +4774,7 @@
 
         lvItem.iItem = nItem;
         lvItem.iSubItem = 0;
-        if (LISTVIEW_GetItemW(hwnd, &lvItem, TRUE))
+        if (LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE))
         {
           if (lvItem.mask & LVIF_TEXT)
           {
@@ -4939,7 +4829,7 @@
  *   SUCCESS : index of item
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_FindItemA(HWND hwnd, INT nStart,
+static LRESULT LISTVIEW_FindItemA(LISTVIEW_INFO *infoPtr, INT nStart,
                                   LPLVFINDINFOA lpFindInfo)
 {
   BOOL hasText = lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL);
@@ -4948,7 +4838,7 @@
 
   memcpy(&fiw, lpFindInfo, sizeof(fiw));
   if (hasText) fiw.psz = textdupTtoW((LPCWSTR)lpFindInfo->psz, FALSE);
-  res = LISTVIEW_FindItemW(hwnd, nStart, &fiw);
+  res = LISTVIEW_FindItemW(infoPtr, nStart, &fiw);
   if (hasText) textfreeT((LPWSTR)fiw.psz, FALSE);
   return res;
 }
@@ -4963,10 +4853,8 @@
  * RETURN:
  * COLORREF associated with the background.
  */
-static LRESULT LISTVIEW_GetBkColor(HWND hwnd)
+static LRESULT LISTVIEW_GetBkColor(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   return infoPtr->clrBk;
 }
 
@@ -4982,7 +4870,7 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-/* static LRESULT LISTVIEW_GetBkImage(HWND hwnd, LPLVBKIMAGE lpBkImage)   */
+/* static LRESULT LISTVIEW_GetBkImage(LISTVIEW_INFO *infoPtr, LPLVBKIMAGE lpBkImage)   */
 /* {   */
 /*   FIXME (listview, "empty stub!\n"); */
 /*   return FALSE;   */
@@ -4998,10 +4886,8 @@
  * RETURN:
  *  Value of mask
  */
-static UINT LISTVIEW_GetCallbackMask(HWND hwnd)
+static UINT LISTVIEW_GetCallbackMask(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   return infoPtr->uCallbackMask;
 }
 
@@ -5020,9 +4906,8 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_GetColumnT(HWND hwnd, INT nItem, LPLVCOLUMNW lpColumn, BOOL isW)
+static LRESULT LISTVIEW_GetColumnT(LISTVIEW_INFO *infoPtr, INT nItem, LPLVCOLUMNW lpColumn, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   HDITEMW hdi;
   BOOL bResult = FALSE;
 
@@ -5085,8 +4970,8 @@
       if (lpColumn->mask & LVCF_ORDER)
         lpColumn->iOrder = hdi.iOrder;
 
-      TRACE("(hwnd=%x, col=%d, lpColumn=%s, isW=%d)\n",
-	    hwnd, nItem, debuglvcolumn_t(lpColumn, isW), isW);
+      TRACE("(col=%d, lpColumn=%s, isW=%d)\n",
+	    nItem, debuglvcolumn_t(lpColumn, isW), isW);
 
     }
   }
@@ -5095,15 +4980,14 @@
 }
 
 
-static LRESULT LISTVIEW_GetColumnOrderArray(HWND hwnd, INT iCount, LPINT lpiArray)
+static LRESULT LISTVIEW_GetColumnOrderArray(LISTVIEW_INFO *infoPtr, INT iCount, LPINT lpiArray)
 {
-/*  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0); */
     INT i;
 
     if (!lpiArray)
 	return FALSE;
 
-    /* little hack */
+    /* FIXME: little hack */
     for (i = 0; i < iCount; i++)
 	lpiArray[i] = i;
 
@@ -5122,10 +5006,9 @@
  *   SUCCESS : column width
  *   FAILURE : zero
  */
-static LRESULT LISTVIEW_GetColumnWidth(HWND hwnd, INT nColumn)
+static LRESULT LISTVIEW_GetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nColumnWidth = 0;
   HDITEMW hdi;
 
@@ -5157,23 +5040,22 @@
  * RETURN:
  * Number of fully visible items.
  */
-static LRESULT LISTVIEW_GetCountPerPage(HWND hwnd)
+static LRESULT LISTVIEW_GetCountPerPage(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nItemCount = 0;
 
   if (uView == LVS_LIST)
   {
     if (infoPtr->rcList.right > infoPtr->nItemWidth)
     {
-      nItemCount = LISTVIEW_GetCountPerRow(hwnd) *
-                   LISTVIEW_GetCountPerColumn(hwnd);
+      nItemCount = LISTVIEW_GetCountPerRow(infoPtr) *
+                   LISTVIEW_GetCountPerColumn(infoPtr);
     }
   }
   else if (uView == LVS_REPORT)
   {
-    nItemCount = LISTVIEW_GetCountPerColumn(hwnd);
+    nItemCount = LISTVIEW_GetCountPerColumn(infoPtr);
   }
   else
   {
@@ -5196,15 +5078,9 @@
  *   SUCCESS : previous style
  *   FAILURE : 0
  */
-static LRESULT LISTVIEW_GetExtendedListViewStyle(HWND hwnd)
+static LRESULT LISTVIEW_GetExtendedListViewStyle(LISTVIEW_INFO *infoPtr)
 {
-    LISTVIEW_INFO *infoPtr;
-
-    /* make sure we can get the listview info */
-    if (!(infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0)))
-	return (0);
-
-    return (infoPtr->dwExStyle);
+    return infoPtr->dwExStyle;
 }
 
 /***
@@ -5217,15 +5093,11 @@
  * RETURN:
  * Header handle.
  */
-static LRESULT LISTVIEW_GetHeader(HWND hwnd)
+static LRESULT LISTVIEW_GetHeader(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   return (LRESULT)infoPtr->hwndHeader;
 }
 
-/* LISTVIEW_GetHotCursor */
-
 /***
  * DESCRIPTION:
  * Returns the time that the mouse cursor must hover over an item
@@ -5238,10 +5110,8 @@
  *   Returns the previously set hover time or (DWORD)-1 to indicate that the
  *   hover time is set to the default hover time.
  */
-static LRESULT LISTVIEW_GetHoverTime(HWND hwnd)
+static LRESULT LISTVIEW_GetHoverTime(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   return infoPtr->dwHoverTime;
 }
 
@@ -5257,9 +5127,8 @@
  *   SUCCESS : image list handle
  *   FAILURE : NULL
  */
-static LRESULT LISTVIEW_GetImageList(HWND hwnd, INT nImageList)
+static LRESULT LISTVIEW_GetImageList(LISTVIEW_INFO *infoPtr, INT nImageList)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   HIMAGELIST himl = NULL;
 
   switch (nImageList)
@@ -5296,10 +5165,9 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_GetItemT(HWND hwnd, LPLVITEMW lpLVItem, BOOL internal, BOOL isW)
+static LRESULT LISTVIEW_GetItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL internal, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   NMLVDISPINFOW dispInfo;
   LISTVIEW_SUBITEM *lpSubItem;
   LISTVIEW_ITEM *lpItem;
@@ -5322,8 +5190,8 @@
    *     information from the application
    */
 
-  TRACE("(hwnd=%x, lpLVItem=%s, internal=%d, isW=%d)\n",
-        hwnd, debuglvitem_t(lpLVItem, isW), internal, isW);
+  TRACE("(lpLVItem=%s, internal=%d, isW=%d)\n",
+        debuglvitem_t(lpLVItem, isW), internal, isW);
 
   if ((lpLVItem == NULL) || (lpLVItem->iItem < 0) ||
       (lpLVItem->iItem >= GETITEMCOUNT(infoPtr)))
@@ -5336,7 +5204,7 @@
     if (lpLVItem->mask & ~LVIF_STATE)
     {
       memcpy(&dispInfo.item, lpLVItem, sizeof(LVITEMW));
-      dispinfo_notifyT(hwnd, LVN_GETDISPINFOW, &dispInfo, isW);
+      dispinfo_notifyT(infoPtr, LVN_GETDISPINFOW, &dispInfo, isW);
       memcpy(lpLVItem, &dispInfo.item, sizeof(LVITEMW));
       TRACE("   getdispinfo(1):lpLVItem=%s\n", debuglvitem_t(lpLVItem, isW));
     }
@@ -5346,7 +5214,7 @@
       lpLVItem->state = 0;
       if (infoPtr->nFocusedItem == lpLVItem->iItem)
         lpLVItem->state |= LVIS_FOCUSED;
-      if (LISTVIEW_IsSelected(hwnd,lpLVItem->iItem))
+      if (LISTVIEW_IsSelected(infoPtr,lpLVItem->iItem))
         lpLVItem->state |= LVIS_SELECTED;
     }
 
@@ -5403,7 +5271,7 @@
     dispInfo.item.iItem = lpLVItem->iItem;
     dispInfo.item.iSubItem = lpLVItem->iSubItem;
     dispInfo.item.lParam = lpItem->lParam;
-    dispinfo_notifyT(hwnd, LVN_GETDISPINFOW, &dispInfo, isW);
+    dispinfo_notifyT(infoPtr, LVN_GETDISPINFOW, &dispInfo, isW);
     TRACE("   getdispinfo(2):lpLVItem=%s\n", debuglvitem_t(&dispInfo.item, isW));
   }
 
@@ -5454,7 +5322,7 @@
 
       lpLVItem->state &= ~LVIS_SELECTED;
       if ((dispInfo.item.stateMask & LVIS_SELECTED) &&
-          LISTVIEW_IsSelected(hwnd,dispInfo.item.iItem))
+          LISTVIEW_IsSelected(infoPtr,dispInfo.item.iItem))
         lpLVItem->state |= LVIS_SELECTED;
     }
     else if (lpLVItem->mask & LVIF_STATE)
@@ -5463,7 +5331,7 @@
 
       lpLVItem->state &= ~LVIS_SELECTED;
       if ((lpLVItem->stateMask & LVIS_SELECTED) &&
-          LISTVIEW_IsSelected(hwnd,lpLVItem->iItem))
+          LISTVIEW_IsSelected(infoPtr,lpLVItem->iItem))
          lpLVItem->state |= LVIS_SELECTED;
     }
 
@@ -5477,8 +5345,6 @@
   return TRUE;
 }
 
-/* LISTVIEW_GetHotCursor */
-
 /***
  * DESCRIPTION:
  * Retrieves the index of the hot item.
@@ -5490,10 +5356,8 @@
  *   SUCCESS : hot item index
  *   FAILURE : -1 (no hot item)
  */
-static LRESULT LISTVIEW_GetHotItem(HWND hwnd)
+static LRESULT LISTVIEW_GetHotItem(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   return infoPtr->nHotItem;
 }
 
@@ -5509,10 +5373,8 @@
  * RETURN:
  * Number of items.
  */
-static LRESULT LISTVIEW_GetItemCount(HWND hwnd)
+static LRESULT LISTVIEW_GetItemCount(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   return GETITEMCOUNT(infoPtr);
 }
 
@@ -5529,10 +5391,9 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_GetItemBoundBox(HWND hwnd, INT nItem, LPRECT lpRect)
+static BOOL LISTVIEW_GetItemBoundBox(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lpRect)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   BOOL bResult = FALSE;
   HDPA hdpaSubItems;
@@ -5540,7 +5401,7 @@
   INT nCountPerColumn;
   INT nRow;
 
-  TRACE("(hwnd=%x,nItem=%d,lpRect=%p)\n", hwnd, nItem, lpRect);
+  TRACE("(nItem=%d,lpRect=%p)\n", nItem, lpRect);
 
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)) &&
       (lpRect != NULL))
@@ -5548,8 +5409,8 @@
     if (uView == LVS_LIST)
     {
       bResult = TRUE;
-      nItem = nItem - ListView_GetTopIndex(hwnd);
-      nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
+      nItem = nItem - ListView_GetTopIndex(infoPtr->hwndSelf);
+      nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
       if (nItem < 0)
       {
         nRow = nItem % nCountPerColumn;
@@ -5574,7 +5435,7 @@
     {
       bResult = TRUE;
       lpRect->left = REPORT_MARGINX;
-      lpRect->top = ((nItem - ListView_GetTopIndex(hwnd)) *
+      lpRect->top = ((nItem - ListView_GetTopIndex(infoPtr->hwndSelf)) *
                          infoPtr->nItemHeight) + infoPtr->rcList.top;
 
       if (!(lStyle & LVS_NOSCROLL))
@@ -5584,7 +5445,7 @@
         ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
         scrollInfo.cbSize = sizeof(SCROLLINFO);
         scrollInfo.fMask = SIF_POS;
-        GetScrollInfo(hwnd, SB_HORZ, &scrollInfo);
+        GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo);
         lpRect->left -= scrollInfo.nPos;
       }
     }
@@ -5623,19 +5484,18 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_GetItemPosition(HWND hwnd, INT nItem, LPPOINT lpptPosition)
+static BOOL LISTVIEW_GetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lpptPosition)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(hwnd, 0);
-  UINT uView = GetWindowLongA(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   BOOL bResult = FALSE;
   RECT rcBounding;
 
-  TRACE("(hwnd=%x, nItem=%d, lpptPosition=%p)\n", hwnd, nItem, lpptPosition);
+  TRACE("(nItem=%d, lpptPosition=%p)\n", nItem, lpptPosition);
 
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)) &&
       (lpptPosition != NULL))
   {
-    bResult = LISTVIEW_GetItemBoundBox(hwnd, nItem, &rcBounding);
+    bResult = LISTVIEW_GetItemBoundBox(infoPtr, nItem, &rcBounding);
     lpptPosition->x = rcBounding.left;
     lpptPosition->y = rcBounding.top;
     if (uView == LVS_ICON)
@@ -5656,16 +5516,16 @@
  * On return the bottom will also be set and the width may have been
  * modified.
  *
+ * PARAMETER
+ * [I] infoPtr : pointer to the listview structure
+ * [I] nItem : the item for which we are calculating this
+ * [I] rect : the rectangle to be updated
+ *
  * This appears to be weird, even in the Microsoft implementation.
  */
-
-static void ListView_UpdateLargeItemLabelRect (
-        HWND hwnd,                    /* The window of the listview */
-        const LISTVIEW_INFO *infoPtr, /* The listview itself */
-        int nItem, /* The item for which we are calculating this */
-        RECT *rect) /* The rectangle to be updated */
+static void LISTVIEW_UpdateLargeItemLabelRect (LISTVIEW_INFO *infoPtr, int nItem, RECT *rect)
 {
-    HDC hdc = GetDC (hwnd);
+    HDC hdc = GetDC (infoPtr->hwndSelf);
     HFONT hOldFont = SelectObject (hdc, infoPtr->hFont);
 
     if (infoPtr->bFocus && infoPtr->nFocusedItem == nItem)
@@ -5688,7 +5548,7 @@
          * pointer to the text, rather than specifying a buffer to which
          * to copy it.
          */
-        LISTVIEW_GetItemW (hwnd, &lvItem, TRUE);
+        LISTVIEW_GetItemW (infoPtr, &lvItem, TRUE);
         DrawTextW (hdc, lvItem.pszText, -1, rect, DT_CALCRECT |
                         DT_NOCLIP | DT_EDITCONTROL | DT_TOP | DT_CENTER |
                         DT_WORDBREAK | DT_NOPREFIX);
@@ -5709,7 +5569,7 @@
     }
 
     SelectObject (hdc, hOldFont);
-    ReleaseDC (hwnd, hdc);
+    ReleaseDC (infoPtr->hwndSelf, hdc);
 }
 
 /***
@@ -5740,10 +5600,9 @@
  *   is the one with the focus.  Ensure that the control's record of which
  *   item has the focus agrees with the items' records.
  */
-static LRESULT LISTVIEW_GetItemRect(HWND hwnd, INT nItem, LPRECT lprc)
+static LRESULT LISTVIEW_GetItemRect(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprc)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   BOOL bResult = FALSE;
   POINT ptOrigin;
   POINT ptItem;
@@ -5753,7 +5612,7 @@
   LVITEMW lvItem;
   RECT rcInternal;
 
-  TRACE("(hwnd=%x, nItem=%d, lprc=%p)\n", hwnd, nItem, lprc);
+  TRACE("(nItem=%d, lprc=%p)\n", nItem, lprc);
 
   if (uView & LVS_REPORT)
   {
@@ -5761,7 +5620,7 @@
     lvItem.mask = LVIF_INDENT;
     lvItem.iItem = nItem;
     lvItem.iSubItem = 0;
-    LISTVIEW_GetItemW(hwnd, &lvItem, TRUE);
+    LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE);
 
     /* do indent */
     if (lvItem.iIndent>0 && infoPtr->iconSize.cx > 0)
@@ -5777,12 +5636,12 @@
       switch(lprc->left)
       {
       case LVIR_ICON:
-	if (!LISTVIEW_GetItemPosition(hwnd, nItem, &ptItem)) break;
+	if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &ptItem)) break;
         if (uView == LVS_ICON)
         {
           if (infoPtr->himlNormal != NULL)
           {
-            if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+            if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
             {
               bResult = TRUE;
               lprc->left = ptItem.x + ptOrigin.x;
@@ -5795,7 +5654,7 @@
         }
         else if (uView == LVS_SMALLICON)
         {
-          if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+          if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
           {
             bResult = TRUE;
             lprc->left = ptItem.x + ptOrigin.x;
@@ -5831,18 +5690,18 @@
         break;
 
       case LVIR_LABEL:
-	if (!LISTVIEW_GetItemPosition(hwnd, nItem, &ptItem)) break;
+	if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &ptItem)) break;
         if (uView == LVS_ICON)
         {
           if (infoPtr->himlNormal != NULL)
           {
-            if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+            if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
             {
               bResult = TRUE;
               lprc->left = ptItem.x + ptOrigin.x;
               lprc->top = (ptItem.y + ptOrigin.y + infoPtr->iconSize.cy +
                            ICON_BOTTOM_PADDING);
-              nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+              nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
               if (infoPtr->iconSpacing.cx - nLabelWidth > 1)
               {
                 lprc->left += (infoPtr->iconSpacing.cx - nLabelWidth) / 2;
@@ -5852,7 +5711,7 @@
               {
                 lprc->left += 1;
                 lprc->right = lprc->left + infoPtr->iconSpacing.cx - 1;
-                ListView_UpdateLargeItemLabelRect (hwnd, infoPtr, nItem, lprc);
+                LISTVIEW_UpdateLargeItemLabelRect (infoPtr, nItem, lprc);
               }
               lprc->bottom = lprc->top + infoPtr->ntmHeight + HEIGHT_PADDING;
             }
@@ -5860,7 +5719,7 @@
         }
         else if (uView == LVS_SMALLICON)
         {
-          if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+          if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
           {
             bResult = TRUE;
             nLeftPos = lprc->left = ptItem.x + ptOrigin.x;
@@ -5873,7 +5732,7 @@
             if (infoPtr->himlSmall != NULL)
               lprc->left += infoPtr->iconSize.cx;
 
-            nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+            nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
             nLabelWidth += TRAILING_PADDING;
             if (lprc->left + nLabelWidth < nLeftPos + infoPtr->nItemWidth)
               lprc->right = lprc->left + nLabelWidth;
@@ -5899,13 +5758,13 @@
 
           if (uView != LVS_REPORT)
           {
-	    nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+	    nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
             nLabelWidth += TRAILING_PADDING;
             if (infoPtr->himlSmall)
               nLabelWidth += IMAGE_PADDING;
           }
           else
-            nLabelWidth = LISTVIEW_GetColumnWidth(hwnd, 0)-lprc->left;
+            nLabelWidth = LISTVIEW_GetColumnWidth(infoPtr, 0)-lprc->left;
 	  if (lprc->left + nLabelWidth < nLeftPos + infoPtr->nItemWidth)
 	    lprc->right = lprc->left + nLabelWidth;
 	  else
@@ -5914,14 +5773,14 @@
         break;
 
       case LVIR_BOUNDS:
-	if (!LISTVIEW_GetItemBoundBox(hwnd, nItem, &rcInternal)) break;
+	if (!LISTVIEW_GetItemBoundBox(infoPtr, nItem, &rcInternal)) break;
 	ptItem.x = rcInternal.left;
 	ptItem.y = rcInternal.top;
         if (uView == LVS_ICON)
         {
           if (infoPtr->himlNormal != NULL)
           {
-            if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+            if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
             {
               RECT label_rect;
               INT text_left, text_right, icon_left, text_pos_x;
@@ -5939,7 +5798,7 @@
               ptItem.y += ICON_TOP_PADDING;
 
               /* Compute the label left and right */
-               nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+               nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
                text_pos_x = infoPtr->iconSpacing.cx - 2*CAPTION_BORDER - nLabelWidth;
                if (text_pos_x > 1)
                {
@@ -5963,14 +5822,14 @@
 
                CopyRect (&label_rect, lprc);
                label_rect.top = lprc->bottom;
-               ListView_UpdateLargeItemLabelRect (hwnd, infoPtr, nItem, &label_rect);
+               LISTVIEW_UpdateLargeItemLabelRect (infoPtr, nItem, &label_rect);
                UnionRect (lprc, lprc, &label_rect);
             }
           }
         }
         else if (uView == LVS_SMALLICON)
         {
-          if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+          if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
           {
             bResult = TRUE;
             lprc->left = ptItem.x + ptOrigin.x;
@@ -5982,7 +5841,7 @@
             if (infoPtr->himlSmall != NULL)
               lprc->right += infoPtr->iconSize.cx;
 
-	    nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+	    nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
             nLabelWidth += TRAILING_PADDING;
             if (infoPtr->himlSmall)
               nLabelWidth += IMAGE_PADDING;
@@ -6018,7 +5877,7 @@
             if (infoPtr->himlSmall != NULL)
               lprc->right += infoPtr->iconSize.cx;
 
-	    nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+	    nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
             nLabelWidth += TRAILING_PADDING;
 	    if (lprc->right + nLabelWidth < lprc->left + infoPtr->nItemWidth)
 	      lprc->right += nLabelWidth;
@@ -6029,12 +5888,12 @@
         break;
 
       case LVIR_SELECTBOUNDS:
-        if (!LISTVIEW_GetItemPosition(hwnd, nItem, &ptItem)) break;
+        if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &ptItem)) break;
         if (uView == LVS_ICON)
         {
           if (infoPtr->himlNormal != NULL)
           {
-            if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+            if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
             {
               bResult = TRUE;
               lprc->left = ptItem.x + ptOrigin.x;
@@ -6046,7 +5905,7 @@
         }
         else if (uView == LVS_SMALLICON)
         {
-          if (LISTVIEW_GetOrigin(hwnd, &ptOrigin) != FALSE)
+          if (LISTVIEW_GetOrigin(infoPtr, &ptOrigin) != FALSE)
           {
             bResult = TRUE;
             nLeftPos= lprc->left = ptItem.x + ptOrigin.x;
@@ -6061,7 +5920,7 @@
             if (infoPtr->himlSmall != NULL)
               lprc->right += infoPtr->iconSize.cx;
 
-	    nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+	    nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
             nLabelWidth += TRAILING_PADDING;
 	    if (lprc->right + nLabelWidth < nLeftPos + infoPtr->nItemWidth)
 	      lprc->right += nLabelWidth;
@@ -6097,7 +5956,7 @@
             if (infoPtr->himlSmall != NULL)
               lprc->right += infoPtr->iconSize.cx;
 
-	    nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, nItem);
+	    nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, nItem);
             nLabelWidth += TRAILING_PADDING;
             if (infoPtr->himlSmall)
               nLabelWidth += IMAGE_PADDING;
@@ -6121,13 +5980,13 @@
 }
 
 
-static LRESULT LISTVIEW_GetSubItemRect(HWND hwnd, INT nItem, INT nSubItem, INT
+static LRESULT LISTVIEW_GetSubItemRect(LISTVIEW_INFO *infoPtr, INT nItem, INT nSubItem, INT
 flags, LPRECT lprc)
 {
-    UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+    UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
     INT  count;
 
-    TRACE("(hwnd=%x, nItem=%d, nSubItem=%d lprc=%p)\n", hwnd, nItem, nSubItem,
+    TRACE("(nItem=%d, nSubItem=%d lprc=%p)\n", nItem, nSubItem,
             lprc);
 
     if (!(uView & LVS_REPORT))
@@ -6140,14 +5999,13 @@
     }
     else
     {
-        int top = min(((LISTVIEW_INFO *)GetWindowLongW(hwnd, 0))->nColumnCount,
-                      nSubItem - 1);
+        int top = min(infoPtr->nColumnCount, nSubItem - 1);
 
-        LISTVIEW_GetItemRect(hwnd,nItem,lprc);
+        LISTVIEW_GetItemRect(infoPtr,nItem,lprc);
         for (count = 0; count < top; count++)
-            lprc->left += LISTVIEW_GetColumnWidth(hwnd,count);
+            lprc->left += LISTVIEW_GetColumnWidth(infoPtr,count);
 
-        lprc->right = LISTVIEW_GetColumnWidth(hwnd,(nSubItem-1)) +
+        lprc->right = LISTVIEW_GetColumnWidth(infoPtr,(nSubItem-1)) +
                             lprc->left;
     }
     return TRUE;
@@ -6165,21 +6023,21 @@
  *   SUCCESS : string width (in pixels)
  *   FAILURE : zero
  */
-static INT LISTVIEW_GetLabelWidth(HWND hwnd, INT nItem)
+static INT LISTVIEW_GetLabelWidth(LISTVIEW_INFO *infoPtr, INT nItem)
 {
   WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
   INT nLabelWidth = 0;
   LVITEMW lvItem;
 
-  TRACE("(hwnd=%x, nItem=%d)\n", hwnd, nItem);
+  TRACE("(nItem=%d)\n", nItem);
 
   ZeroMemory(&lvItem, sizeof(lvItem));
   lvItem.mask = LVIF_TEXT;
   lvItem.iItem = nItem;
   lvItem.cchTextMax = DISP_TEXT_SIZE;
   lvItem.pszText = szDispText;
-  if (LISTVIEW_GetItemW(hwnd, &lvItem, TRUE))
-    nLabelWidth = LISTVIEW_GetStringWidthT(hwnd, lvItem.pszText, TRUE);
+  if (LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE))
+    nLabelWidth = LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
 
   return nLabelWidth;
 }
@@ -6195,9 +6053,8 @@
  * RETURN:
  * Horizontal + vertical spacing
  */
-static LRESULT LISTVIEW_GetItemSpacing(HWND hwnd, BOOL bSmall)
+static LRESULT LISTVIEW_GetItemSpacing(LISTVIEW_INFO *infoPtr, BOOL bSmall)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LONG lResult;
 
   if (bSmall == FALSE)
@@ -6206,7 +6063,7 @@
   }
   else
   {
-    LONG style = GetWindowLongW(hwnd, GWL_STYLE);
+    LONG style = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
     if ((style & LVS_TYPEMASK) == LVS_ICON)
       lResult = MAKELONG(DEFAULT_COLUMN_WIDTH, GetSystemMetrics(SM_CXSMICON)+HEIGHT_PADDING);
     else
@@ -6227,9 +6084,8 @@
  * RETURN:
  * State specified by the mask.
  */
-static LRESULT LISTVIEW_GetItemState(HWND hwnd, INT nItem, UINT uMask)
+static LRESULT LISTVIEW_GetItemState(LISTVIEW_INFO *infoPtr, INT nItem, UINT uMask)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   LVITEMW lvItem;
   UINT uState = 0;
 
@@ -6239,7 +6095,7 @@
     lvItem.iItem = nItem;
     lvItem.stateMask = uMask;
     lvItem.mask = LVIF_STATE;
-    if (LISTVIEW_GetItemW(hwnd, &lvItem, TRUE))
+    if (LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE))
       uState = lvItem.state;
   }
 
@@ -6260,9 +6116,8 @@
  *   SUCCESS : string length
  *   FAILURE : 0
  */
-static LRESULT LISTVIEW_GetItemTextT(HWND hwnd, INT nItem, LPLVITEMW lpLVItem, BOOL isW)
+static LRESULT LISTVIEW_GetItemTextT(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEMW lpLVItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT nLength = 0;
 
   if (lpLVItem != NULL)
@@ -6271,7 +6126,7 @@
     {
       lpLVItem->mask = LVIF_TEXT;
       lpLVItem->iItem = nItem;
-      if (LISTVIEW_GetItemT(hwnd, lpLVItem, FALSE, isW))
+      if (LISTVIEW_GetItemT(infoPtr, lpLVItem, FALSE, isW))
         nLength = textlenT(lpLVItem->pszText, isW);
     }
   }
@@ -6292,10 +6147,9 @@
  *   SUCCESS : item index
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_GetNextItem(HWND hwnd, INT nItem, UINT uFlags)
+static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFlags)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   UINT uMask = 0;
   LVFINDINFOW lvFindInfo;
   INT nCountPerColumn;
@@ -6324,7 +6178,7 @@
         while (nItem >= 0)
         {
           nItem--;
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6332,10 +6186,10 @@
       {
         lvFindInfo.flags = LVFI_NEARESTXY;
         lvFindInfo.vkDirection = VK_UP;
-        ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
-        while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
+        ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
+        while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
         {
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6347,7 +6201,7 @@
         while (nItem < GETITEMCOUNT(infoPtr))
         {
           nItem++;
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6355,10 +6209,10 @@
       {
         lvFindInfo.flags = LVFI_NEARESTXY;
         lvFindInfo.vkDirection = VK_DOWN;
-        ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
-        while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
+        ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
+        while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
         {
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6367,11 +6221,11 @@
     {
       if (uView == LVS_LIST)
       {
-        nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
+        nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
         while (nItem - nCountPerColumn >= 0)
         {
           nItem -= nCountPerColumn;
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6379,10 +6233,10 @@
       {
         lvFindInfo.flags = LVFI_NEARESTXY;
         lvFindInfo.vkDirection = VK_LEFT;
-        ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
-        while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
+        ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
+        while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
         {
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6391,11 +6245,11 @@
     {
       if (uView == LVS_LIST)
       {
-        nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
+        nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
         while (nItem + nCountPerColumn < GETITEMCOUNT(infoPtr))
         {
           nItem += nCountPerColumn;
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6403,10 +6257,10 @@
       {
         lvFindInfo.flags = LVFI_NEARESTXY;
         lvFindInfo.vkDirection = VK_RIGHT;
-        ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
-        while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
+        ListView_GetItemPosition(infoPtr->hwndSelf, nItem, &lvFindInfo.pt);
+        while ((nItem = ListView_FindItemW(infoPtr->hwndSelf, nItem, &lvFindInfo)) != -1)
         {
-          if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
+          if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
             return nItem;
         }
       }
@@ -6418,7 +6272,7 @@
       /* search by index */
       for (i = nItem; i < GETITEMCOUNT(infoPtr); i++)
       {
-        if ((ListView_GetItemState(hwnd, i, uMask) & uMask) == uMask)
+        if ((ListView_GetItemState(infoPtr->hwndSelf, i, uMask) & uMask) == uMask)
           return i;
       }
     }
@@ -6441,13 +6295,13 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_GetOrigin(HWND hwnd, LPPOINT lpptOrigin)
+static LRESULT LISTVIEW_GetOrigin(LISTVIEW_INFO *infoPtr, LPPOINT lpptOrigin)
 {
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   BOOL bResult = FALSE;
 
-  TRACE("(hwnd=%x, lpptOrigin=%p)\n", hwnd, lpptOrigin);
+  TRACE("(lpptOrigin=%p)\n", lpptOrigin);
 
   if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
   {
@@ -6459,20 +6313,20 @@
     if (lStyle & WS_HSCROLL)
     {
       scrollInfo.fMask = SIF_POS;
-      if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo) != FALSE)
         lpptOrigin->x = -scrollInfo.nPos;
     }
 
     if (lStyle & WS_VSCROLL)
     {
       scrollInfo.fMask = SIF_POS;
-      if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
+      if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo) != FALSE)
         lpptOrigin->y = -scrollInfo.nPos;
     }
 
     bResult = TRUE;
 
-    TRACE("(hwnd=%x, pt=(%ld,%ld))\n", hwnd, lpptOrigin->x, lpptOrigin->y);
+    TRACE("(pt=(%ld,%ld))\n", lpptOrigin->x, lpptOrigin->y);
 
   }
 
@@ -6489,16 +6343,15 @@
  * RETURN:
  * Number of items selected.
  */
-static LRESULT LISTVIEW_GetSelectedCount(HWND hwnd)
+static LRESULT LISTVIEW_GetSelectedCount(LISTVIEW_INFO *infoPtr)
 {
 /* REDO THIS */
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT nSelectedCount = 0;
   INT i;
 
   for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
   {
-    if (ListView_GetItemState(hwnd, i, LVIS_SELECTED) & LVIS_SELECTED)
+    if (ListView_GetItemState(infoPtr->hwndSelf, i, LVIS_SELECTED) & LVIS_SELECTED)
       nSelectedCount++;
   }
 
@@ -6515,10 +6368,8 @@
  * RETURN:
  * Index number or -1 if there is no selection mark.
  */
-static LRESULT LISTVIEW_GetSelectionMark(HWND hwnd)
+static LRESULT LISTVIEW_GetSelectionMark(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   return infoPtr->nSelectionMark;
 }
 
@@ -6536,13 +6387,12 @@
  *   SUCCESS : string width (in pixels)
  *   FAILURE : zero
  */
-static LRESULT LISTVIEW_GetStringWidthT(HWND hwnd, LPCWSTR lpszText, BOOL isW)
+static LRESULT LISTVIEW_GetStringWidthT(LISTVIEW_INFO *infoPtr, LPCWSTR lpszText, BOOL isW)
 {
   if (is_textT(lpszText, isW))
   {
-    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
     HFONT hFont = infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont;
-    HDC hdc = GetDC(hwnd);
+    HDC hdc = GetDC(infoPtr->hwndSelf);
     HFONT hOldFont = SelectObject(hdc, hFont);
     SIZE stringSize;
     ZeroMemory(&stringSize, sizeof(SIZE));
@@ -6551,7 +6401,7 @@
     else
       GetTextExtentPointA(hdc, (LPCSTR)lpszText, lstrlenA((LPCSTR)lpszText), &stringSize);
     SelectObject(hdc, hOldFont);
-    ReleaseDC(hwnd, hdc);
+    ReleaseDC(infoPtr->hwndSelf, hdc);
     return stringSize.cx;
   }
   return 0;
@@ -6567,10 +6417,8 @@
  * RETURN:
  * COLORREF associated with the the background.
  */
-static LRESULT LISTVIEW_GetTextBkColor(HWND hwnd)
+static LRESULT LISTVIEW_GetTextBkColor(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
-
   return infoPtr->clrTextBk;
 }
 
@@ -6584,10 +6432,8 @@
  * RETURN:
  * COLORREF associated with the text.
  */
-static LRESULT LISTVIEW_GetTextColor(HWND hwnd)
+static LRESULT LISTVIEW_GetTextColor(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
-
   return infoPtr->clrText;
 }
 
@@ -6604,21 +6450,20 @@
  *   SUCCESS : item index of hit
  *   FAILURE : -1
  */
-static INT LISTVIEW_SuperHitTestItem(HWND hwnd, LPLV_INTHIT lpInt, BOOL subitem)
+static INT LISTVIEW_SuperHitTestItem(LISTVIEW_INFO *infoPtr, LPLV_INTHIT lpInt, BOOL subitem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   INT i,j,topindex,bottomindex;
   RECT rcItem,rcSubItem;
   DWORD xterm, yterm, dist;
 
-  TRACE("(hwnd=%x, x=%ld, y=%ld)\n", hwnd, lpInt->ht.pt.x, lpInt->ht.pt.y);
+  TRACE("(x=%ld, y=%ld)\n", lpInt->ht.pt.x, lpInt->ht.pt.y);
 
-  topindex = LISTVIEW_GetTopIndex(hwnd);
+  topindex = LISTVIEW_GetTopIndex(infoPtr);
   if (uView == LVS_REPORT)
   {
-    bottomindex = topindex + LISTVIEW_GetCountPerColumn(hwnd) + 1;
+    bottomindex = topindex + LISTVIEW_GetCountPerColumn(infoPtr) + 1;
     bottomindex = min(bottomindex,GETITEMCOUNT(infoPtr));
   }
   else
@@ -6632,13 +6477,13 @@
   for (i = topindex; i < bottomindex; i++)
   {
     rcItem.left = LVIR_BOUNDS;
-    if (LISTVIEW_GetItemRect(hwnd, i, &rcItem))
+    if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
     {
       if (PtInRect(&rcItem, lpInt->ht.pt))
       {
         rcSubItem = rcItem;
         rcItem.left = LVIR_ICON;
-        if (LISTVIEW_GetItemRect(hwnd, i, &rcItem))
+        if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
         {
           if (PtInRect(&rcItem, lpInt->ht.pt))
           {
@@ -6649,7 +6494,7 @@
         }
 
         rcItem.left = LVIR_LABEL;
-        if (LISTVIEW_GetItemRect(hwnd, i, &rcItem))
+        if (LISTVIEW_GetItemRect(infoPtr, i, &rcItem))
         {
           if (PtInRect(&rcItem, lpInt->ht.pt))
           {
@@ -6669,7 +6514,7 @@
           for (j = 0; j < infoPtr->nColumnCount; j++)
           {
             rcSubItem.left = rcSubItem.right;
-            rcSubItem.right += LISTVIEW_GetColumnWidth(hwnd, j);
+            rcSubItem.right += LISTVIEW_GetColumnWidth(infoPtr, j);
             if (PtInRect(&rcSubItem, lpInt->ht.pt))
             {
               lpInt->ht.iSubItem = j;
@@ -6717,16 +6562,16 @@
   *   SUCCESS : item index
   *   FAILURE : -1
   */
-static INT LISTVIEW_HitTestItem(HWND hwnd, LPLVHITTESTINFO lpHitTestInfo, BOOL subitem)
+static INT LISTVIEW_HitTestItem(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpHitTestInfo, BOOL subitem)
 {
   INT ret;
   LV_INTHIT lv_inthit;
 
-  TRACE("(hwnd=%x, x=%ld, y=%ld)\n", hwnd, lpHitTestInfo->pt.x,
+  TRACE("(x=%ld, y=%ld)\n", lpHitTestInfo->pt.x,
         lpHitTestInfo->pt.y);
 
   memcpy(&lv_inthit, lpHitTestInfo, sizeof(LVHITTESTINFO));
-  ret = LISTVIEW_SuperHitTestItem(hwnd, &lv_inthit, subitem);
+  ret = LISTVIEW_SuperHitTestItem(infoPtr, &lv_inthit, subitem);
   memcpy(lpHitTestInfo, &lv_inthit, sizeof(LVHITTESTINFO));
   return ret;
 }
@@ -6743,9 +6588,8 @@
  *   SUCCESS : item index
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_HitTest(HWND hwnd, LPLVHITTESTINFO lpHitTestInfo)
+static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpHitTestInfo)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT nItem = -1;
 
   lpHitTestInfo->flags = 0;
@@ -6765,7 +6609,7 @@
      * an app might pass only a structure with space up to iItem!
      * (MS Office 97 does that for instance in the file open dialog)
      */
-    nItem = LISTVIEW_HitTestItem(hwnd, lpHitTestInfo, FALSE);
+    nItem = LISTVIEW_HitTestItem(infoPtr, lpHitTestInfo, FALSE);
   }
 
   return nItem;
@@ -6783,9 +6627,8 @@
  *   SUCCESS : item index
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_SubItemHitTest(HWND hwnd, LPLVHITTESTINFO lpHitTestInfo)
+static LRESULT LISTVIEW_SubItemHitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpHitTestInfo)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT nItem = -1;
 
   lpHitTestInfo->flags = 0;
@@ -6800,7 +6643,7 @@
     lpHitTestInfo->flags |= LVHT_BELOW;
 
   if (lpHitTestInfo->flags == 0)
-    nItem = LISTVIEW_HitTestItem(hwnd, lpHitTestInfo, TRUE);
+    nItem = LISTVIEW_HitTestItem(infoPtr, lpHitTestInfo, TRUE);
 
   return nItem;
 }
@@ -6818,14 +6661,13 @@
  *   SUCCESS : new column index
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_InsertColumnT(HWND hwnd, INT nColumn,
+static LRESULT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
                                       LPLVCOLUMNW lpColumn, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT nNewColumn = -1;
   HDITEMW hdi;
 
-  TRACE("(hwnd=%x, nColumn=%d, lpColumn=%p)\n",hwnd, nColumn, lpColumn);
+  TRACE("(nColumn=%d, lpColumn=%p)\n", nColumn, lpColumn);
 
   if (lpColumn != NULL)
   {
@@ -6898,7 +6740,7 @@
         }
 
         /* retrieve the layout of the header */
-        GetClientRect(hwnd, &rcHeader);
+        GetClientRect(infoPtr->hwndSelf, &rcHeader);
 /*        GetWindowRect(infoPtr->hwndHeader, &rcHeader);*/
         TRACE("start cxy=%d left=%d right=%d\n", hdi.cxy, rcHeader.left, rcHeader.right);
 
@@ -6933,10 +6775,10 @@
                              (WPARAM)nColumn, (LPARAM)&hdi);
 
     /* Need to reset the item width when inserting a new column */
-    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
+    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
 
-    LISTVIEW_UpdateScroll(hwnd);
-    InvalidateRect(hwnd, NULL, FALSE);
+    LISTVIEW_UpdateScroll(infoPtr);
+    InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
   }
 
   return nNewColumn;
@@ -6981,18 +6823,17 @@
  *   SUCCESS : new item index
  *   FAILURE : -1
  */
-static LRESULT LISTVIEW_InsertItemT(HWND hwnd, LPLVITEMW lpLVItem, BOOL isW)
+static LRESULT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   INT nItem = -1;
   HDPA hdpaSubItems;
   INT nItemWidth = 0;
   LISTVIEW_ITEM *lpItem = NULL;
 
-  TRACE("(hwnd=%x, lpLVItem=%s, isW=%d)\n",
-	hwnd, debuglvitem_t(lpLVItem, isW), isW);
+  TRACE("(lpLVItem=%s, isW=%d)\n",
+	debuglvitem_t(lpLVItem, isW), isW);
 
   if (lStyle & LVS_OWNERDATA)
   {
@@ -7009,7 +6850,7 @@
       if ( (lpItem = (LISTVIEW_ITEM *)COMCTL32_Alloc(sizeof(LISTVIEW_ITEM))) )
       {
         ZeroMemory(lpItem, sizeof(LISTVIEW_ITEM));
-        if (LISTVIEW_InitItemT(hwnd, lpItem, lpLVItem, isW))
+        if (LISTVIEW_InitItemT(infoPtr, lpItem, lpLVItem, isW))
         {
           /* insert item in listview control data structure */
           if ( (hdpaSubItems = DPA_Create(8)) )
@@ -7024,7 +6865,7 @@
 		  member. See comments for LISTVIEW_InsertCompare() for greater detail */
 		  nItem = DPA_InsertPtr( infoPtr->hdpaItems,
 			  GETITEMCOUNT( infoPtr ) + 1, hdpaSubItems );
-		  DPA_Sort( infoPtr->hdpaItems, LISTVIEW_InsertCompare, (LPARAM)hwnd );
+		  DPA_Sort( infoPtr->hdpaItems, LISTVIEW_InsertCompare, (LPARAM)infoPtr->hwndSelf );
 		  nItem = DPA_GetPtrIndex( infoPtr->hdpaItems, hdpaSubItems );
 	      }
 	      else
@@ -7036,27 +6877,27 @@
               {
   		NMLISTVIEW nmlv;
 
-                LISTVIEW_ShiftIndices(hwnd,nItem,1);
+                LISTVIEW_ShiftIndices(infoPtr,nItem,1);
 
                 /* manage item focus */
                 if (lpLVItem->mask & LVIF_STATE)
                 {
 	          lpItem->state &= ~(LVIS_FOCUSED|LVIS_SELECTED);
                   if (lpLVItem->stateMask & LVIS_SELECTED)
-                    LISTVIEW_SetSelection(hwnd, nItem);
+                    LISTVIEW_SetSelection(infoPtr, nItem);
 		  else if (lpLVItem->stateMask & LVIS_FOCUSED)
-                    LISTVIEW_SetItemFocus(hwnd, nItem);
+                    LISTVIEW_SetItemFocus(infoPtr, nItem);
                 }
 
                 /* send LVN_INSERTITEM notification */
                 ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
                 nmlv.iItem = nItem;
                 nmlv.lParam = lpItem->lParam;
-		listview_notify(hwnd, LVN_INSERTITEM, &nmlv);
+		listview_notify(infoPtr, LVN_INSERTITEM, &nmlv);
 
                 if ((uView == LVS_SMALLICON) || (uView == LVS_LIST))
 		{
-		  nItemWidth = LISTVIEW_CalculateWidth(hwnd, lpLVItem->iItem);
+		  nItemWidth = LISTVIEW_CalculateWidth(infoPtr, lpLVItem->iItem);
 		  if (nItemWidth > infoPtr->nItemWidth)
 		    infoPtr->nItemWidth = nItemWidth;
 		}
@@ -7065,14 +6906,14 @@
                 if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
                 {
                   if (lStyle & LVS_ALIGNLEFT)
-                    LISTVIEW_AlignLeft(hwnd);
+                    LISTVIEW_AlignLeft(infoPtr);
                   else
-                    LISTVIEW_AlignTop(hwnd);
+                    LISTVIEW_AlignTop(infoPtr);
                 }
 
-                LISTVIEW_UpdateScroll(hwnd);
+                LISTVIEW_UpdateScroll(infoPtr);
                 /* refresh client area */
-                InvalidateRect(hwnd, NULL, FALSE);
+                InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
               }
             }
           }
@@ -7101,9 +6942,8 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_RedrawItems(HWND hwnd, INT nFirst, INT nLast)
+static LRESULT LISTVIEW_RedrawItems(LISTVIEW_INFO *infoPtr, INT nFirst, INT nLast)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult = FALSE;
   RECT rcItem;
   INT i;
@@ -7117,8 +6957,8 @@
         for (i = nFirst; i <= nLast; i++)
         {
  	  rcItem.left = LVIR_BOUNDS;
-	  LISTVIEW_GetItemRect(hwnd, i, &rcItem);
-	  InvalidateRect(hwnd, &rcItem, TRUE);
+	  LISTVIEW_GetItemRect(infoPtr, i, &rcItem);
+	  InvalidateRect(infoPtr->hwndSelf, &rcItem, TRUE);
         }
       }
     }
@@ -7160,10 +7000,10 @@
  *                    dy=  see above
  *
  */
-static LRESULT LISTVIEW_Scroll(HWND hwnd, INT dx, INT dy)
+static LRESULT LISTVIEW_Scroll(LISTVIEW_INFO *infoPtr, INT dx, INT dy)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
+  HWND hwnd = infoPtr->hwndSelf;
   UINT uView =  lStyle & LVS_TYPEMASK;
   INT rows, mode, i;
 
@@ -7174,14 +7014,14 @@
       {
 	  mode = (dy>0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP;
 	  for ( i=0; i<rows; i++)
-	      LISTVIEW_VScroll(hwnd, mode, 0, hwnd);
+	      LISTVIEW_VScroll(infoPtr, mode, 0, hwnd);
       }
 
       if (dx != 0)
       {
 	  mode = (dx>0) ? SB_INTERNAL_RIGHT : SB_INTERNAL_LEFT;
 	  for ( i=0; i<abs(dx); i++)
-	      LISTVIEW_HScroll(hwnd, mode, 0, hwnd);
+	      LISTVIEW_HScroll(infoPtr, mode, 0, hwnd);
       }
       return TRUE;
   }
@@ -7191,7 +7031,7 @@
 
       mode = (dy>0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP;
       for(i=0; i<abs(dy); i++)
-	  LISTVIEW_VScroll(hwnd, mode, 0, hwnd);
+	  LISTVIEW_VScroll(infoPtr, mode, 0, hwnd);
       return TRUE;
   }
   else if (uView == LVS_SMALLICON)
@@ -7200,7 +7040,7 @@
 
       mode = (dy>0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP;
       for(i=0; i<abs(dy); i++)
-	  LISTVIEW_VScroll(hwnd, mode, 0, hwnd);
+	  LISTVIEW_VScroll(infoPtr, mode, 0, hwnd);
       return TRUE;
   }
   else if (uView == LVS_LIST)
@@ -7208,7 +7048,7 @@
       if (dy != 0) return FALSE;
       if (dx == 0) return TRUE;
       mode = (dx>0) ? SB_INTERNAL_RIGHT : SB_INTERNAL_LEFT;
-      LISTVIEW_HScroll(hwnd, mode, 0, hwnd);
+      LISTVIEW_HScroll(infoPtr, mode, 0, hwnd);
       return TRUE;
   }
   return FALSE;
@@ -7226,13 +7066,11 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetBkColor(HWND hwnd, COLORREF clrBk)
+static LRESULT LISTVIEW_SetBkColor(LISTVIEW_INFO *infoPtr, COLORREF clrBk)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   if(infoPtr->clrBk!=clrBk){
     infoPtr->clrBk = clrBk;
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
   }
 
   return TRUE;
@@ -7253,10 +7091,8 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_SetCallbackMask(HWND hwnd, UINT uMask)
+static BOOL LISTVIEW_SetCallbackMask(LISTVIEW_INFO *infoPtr, UINT uMask)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
   infoPtr->uCallbackMask = uMask;
 
   return TRUE;
@@ -7277,10 +7113,9 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetColumnT(HWND hwnd, INT nColumn,
+static LRESULT LISTVIEW_SetColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
                                    LPLVCOLUMNW lpColumn, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult = FALSE;
   HDITEMW hdi, hdiget;
 
@@ -7378,10 +7213,8 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetColumnOrderArray(HWND hwnd, INT iCount, LPINT lpiArray)
+static LRESULT LISTVIEW_SetColumnOrderArray(LISTVIEW_INFO *infoPtr, INT iCount, LPINT lpiArray)
 {
-  /* LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0); */
-
   FIXME("iCount %d lpiArray %p\n", iCount, lpiArray);
 
   if (!lpiArray)
@@ -7404,12 +7237,11 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetColumnWidth(HWND hwnd, INT iCol, INT cx)
+static LRESULT LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT iCol, INT cx)
 {
-    LISTVIEW_INFO *infoPtr;
     HDITEMW hdi;
     LRESULT lret;
-    LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+    LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
     UINT uView = lStyle & LVS_TYPEMASK;
     HDC hdc;
     HFONT header_font;
@@ -7423,10 +7255,6 @@
     LVITEMW lvItem;
     WCHAR szDispText[DISP_TEXT_SIZE];
 
-    /* make sure we can get the listview info */
-    if (!(infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0)))
-      return (FALSE);
-
     if (!infoPtr->hwndHeader) /* make sure we have a header */
       return (FALSE);
 
@@ -7434,7 +7262,7 @@
     if ((uView != LVS_REPORT) && (uView != LVS_LIST))
       return (FALSE);
 
-    TRACE("(hwnd=%x, iCol=%d, cx=%d\n", hwnd, iCol, cx);
+    TRACE("(iCol=%d, cx=%d\n", iCol, cx);
 
     /* take care of invalid cx values */
     if((uView == LVS_REPORT) && (cx < -2))
@@ -7445,7 +7273,7 @@
     /* resize all columns if in LVS_LIST mode */
     if(uView == LVS_LIST) {
       infoPtr->nItemWidth = cx;
-      InvalidateRect(hwnd, NULL, TRUE); /* force redraw of the listview */
+      InvalidateRect(infoPtr->hwndSelf, NULL, TRUE); /* force redraw of the listview */
       return TRUE;
     }
 
@@ -7458,7 +7286,7 @@
         cx = 0;
         for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
         {
-          nLabelWidth = LISTVIEW_GetLabelWidth(hwnd, item_index);
+          nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, item_index);
           cx = (nLabelWidth>cx)?nLabelWidth:cx;
         }
         if (infoPtr->himlSmall)
@@ -7476,8 +7304,8 @@
         for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
         {
           lvItem.iItem = item_index;
-          LISTVIEW_GetItemT(hwnd, &lvItem, FALSE, TRUE);
-          nLabelWidth = LISTVIEW_GetStringWidthT(hwnd, lvItem.pszText, TRUE);
+          LISTVIEW_GetItemT(infoPtr, &lvItem, FALSE, TRUE);
+          nLabelWidth = LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
           cx = (nLabelWidth>cx)?nLabelWidth:cx;
         }
       }
@@ -7523,13 +7351,13 @@
         Header_GetItemW(infoPtr->hwndHeader, iCol, (LPARAM)(&hdi));
 
         /* determine the width of the text in the header */
-        hdc = GetDC(hwnd);
+        hdc = GetDC(infoPtr->hwndSelf);
         old_font = SelectObject(hdc, header_font); /* select the font into hdc */
 
         GetTextExtentPoint32W(hdc, text_buffer, lstrlenW(text_buffer), &size);
 
         SelectObject(hdc, old_font); /* restore the old font */
-        ReleaseDC(hwnd, hdc);
+        ReleaseDC(infoPtr->hwndSelf, hdc);
 
         ZeroMemory(&lvItem, sizeof(lvItem));
         lvItem.iSubItem = iCol;
@@ -7541,8 +7369,8 @@
         for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
         {
           lvItem.iItem = item_index;
-          LISTVIEW_GetItemT(hwnd, &lvItem, FALSE, TRUE);
-          nLabelWidth = LISTVIEW_GetStringWidthT(hwnd, lvItem.pszText, TRUE);
+          LISTVIEW_GetItemT(infoPtr, &lvItem, FALSE, TRUE);
+          nLabelWidth = LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
           nLabelWidth += TRAILING_PADDING;
           /* While it is possible for subitems to have icons, even MS messes
              up the positioning, so I suspect no applications actually use
@@ -7560,7 +7388,7 @@
   hdi.cxy = cx;
   lret = Header_SetItemW(infoPtr->hwndHeader, (WPARAM)iCol, (LPARAM)&hdi);
 
-  InvalidateRect(hwnd, NULL, TRUE); /* force redraw of the listview */
+  InvalidateRect(infoPtr->hwndSelf, NULL, TRUE); /* force redraw of the listview */
 
   return lret;
 }
@@ -7578,9 +7406,8 @@
  *   SUCCESS : previous style
  *   FAILURE : 0
  */
-static LRESULT LISTVIEW_SetExtendedListViewStyle(HWND hwnd, DWORD dwMask, DWORD dwStyle)
+static LRESULT LISTVIEW_SetExtendedListViewStyle(LISTVIEW_INFO *infoPtr, DWORD dwMask, DWORD dwStyle)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   DWORD dwOldStyle = infoPtr->dwExStyle;
 
   /* set new style */
@@ -7592,7 +7419,24 @@
   return dwOldStyle;
 }
 
-/* LISTVIEW_SetHotCursor */
+/***
+ * DESCRIPTION:
+ * Sets the new hot cursor used during hot tracking and hover selection.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : pointer to listview strucure (not NULL)
+ * [I} hCurosr : the new hot cursor handle
+ *
+ * RETURN:
+ * Returns the previous hot cursor
+ */
+static HCURSOR LISTVIEW_SetHotCursor(LISTVIEW_INFO *infoPtr, HCURSOR hCursor)
+{
+    HCURSOR oldCursor = infoPtr->hHotCursor;
+    infoPtr->hHotCursor = hCursor;
+    return oldCursor;
+}
+
 
 /***
  * DESCRIPTION:
@@ -7606,9 +7450,8 @@
  *   SUCCESS : previous hot item index
  *   FAILURE : -1 (no hot item)
  */
-static LRESULT LISTVIEW_SetHotItem(HWND hwnd, INT iIndex)
+static LRESULT LISTVIEW_SetHotItem(LISTVIEW_INFO *infoPtr, INT iIndex)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT iOldIndex = infoPtr->nHotItem;
 
   /* set new style */
@@ -7617,6 +7460,7 @@
   return iOldIndex;
 }
 
+
 /***
  * DESCRIPTION:
  * Sets the amount of time the cursor must hover over an item before it is selected.
@@ -7628,9 +7472,8 @@
  * RETURN:
  * Returns the previous hover time
  */
-static LRESULT LISTVIEW_SetHoverTime(HWND hwnd, DWORD dwHoverTime)
+static LRESULT LISTVIEW_SetHoverTime(LISTVIEW_INFO *infoPtr, DWORD dwHoverTime)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   DWORD oldHoverTime = infoPtr->dwHoverTime;
 
   infoPtr->dwHoverTime = dwHoverTime;
@@ -7649,13 +7492,12 @@
  * RETURN:
  *   MAKELONG(oldcx, oldcy)
  */
-static LRESULT LISTVIEW_SetIconSpacing(HWND hwnd, DWORD spacing)
+static LRESULT LISTVIEW_SetIconSpacing(LISTVIEW_INFO *infoPtr, DWORD spacing)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(hwnd, 0);
   INT cy = HIWORD(spacing);
   INT cx = LOWORD(spacing);
   DWORD oldspacing;
-  LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
 
   oldspacing = MAKELONG(infoPtr->iconSpacing.cx, infoPtr->iconSpacing.cy);
@@ -7675,7 +7517,7 @@
         * icon or label, then make that the width
         */
      else /* FIXME: unknown computation for non LVS_ICON - this is a guess */
-       infoPtr->iconSpacing.cx = LISTVIEW_GetItemWidth(hwnd);
+       infoPtr->iconSpacing.cx = LISTVIEW_GetItemWidth(infoPtr);
   }
   if (cy)
       infoPtr->iconSpacing.cy = cy;
@@ -7686,7 +7528,7 @@
                                   + ICON_BOTTOM_PADDING + ICON_TOP_PADDING + LABEL_VERT_OFFSET;
         /* FIXME.  I don't think so; I think it is based on twice the ntmHeight */
     else /* FIXME: unknown computation for non LVS_ICON - this is a guess */
-       infoPtr->iconSpacing.cy = LISTVIEW_GetItemHeight(hwnd);
+       infoPtr->iconSpacing.cy = LISTVIEW_GetItemHeight(infoPtr);
   }
 
   TRACE("old=(%d,%d), new=(%ld,%ld), iconSize=(%ld,%ld), ntmH=%d\n",
@@ -7696,8 +7538,8 @@
 	infoPtr->ntmHeight);
 
   /* these depend on the iconSpacing */
-  infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-  infoPtr->nItemHeight = LISTVIEW_GetItemHeight(hwnd);
+  infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+  infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
 
   return oldspacing;
 }
@@ -7715,12 +7557,11 @@
  *   SUCCESS : old image list
  *   FAILURE : NULL
  */
-static HIMAGELIST LISTVIEW_SetImageList(HWND hwnd, INT nType, HIMAGELIST himl)
+static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *infoPtr, INT nType, HIMAGELIST himl)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   HIMAGELIST himlOld = 0;
   INT oldHeight;
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
 
   switch (nType)
   {
@@ -7735,7 +7576,7 @@
 	      infoPtr->iconSize.cx, infoPtr->iconSize.cy, cx, cy);
         infoPtr->iconSize.cx = cx;
         infoPtr->iconSize.cy = cy;
-        LISTVIEW_SetIconSpacing(hwnd,0);
+        LISTVIEW_SetIconSpacing(infoPtr,0);
     }
     break;
 
@@ -7752,9 +7593,9 @@
   }
 
   oldHeight = infoPtr->nItemHeight;
-  infoPtr->nItemHeight = LISTVIEW_GetItemHeight(hwnd);
+  infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
   if (infoPtr->nItemHeight != oldHeight)
-    LISTVIEW_UpdateScroll(hwnd);
+    LISTVIEW_UpdateScroll(infoPtr);
 
   return himlOld;
 }
@@ -7772,13 +7613,11 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_SetItemCount(HWND hwnd, INT nItems, DWORD dwFlags)
+static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFlags)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
+  TRACE("(nItems=%d, dwFlags=%lx)\n", nItems, dwFlags);
 
-  TRACE("(hwnd=%x, nItems=%d, dwFlags=%lx)\n", hwnd, nItems, dwFlags);
-
-  if (GetWindowLongW(hwnd, GWL_STYLE) & LVS_OWNERDATA)
+  if (GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_OWNERDATA)
   {
       int precount,topvisible;
 
@@ -7797,25 +7636,25 @@
         LISTVIEW_SELECTION *selection;
         selection = DPA_GetPtr(infoPtr->hdpaSelectionRanges,0);
         if (selection)
-            LISTVIEW_RemoveSelectionRange(hwnd,selection->lower,
+            LISTVIEW_RemoveSelectionRange(infoPtr,selection->lower,
                                           selection->upper);
       }
       while (infoPtr->hdpaSelectionRanges->nItemCount>0);
 
       precount = infoPtr->hdpaItems->nItemCount;
-      topvisible = ListView_GetTopIndex(hwnd) +
-                   LISTVIEW_GetCountPerColumn(hwnd) + 1;
+      topvisible = ListView_GetTopIndex(infoPtr->hwndSelf) +
+                   LISTVIEW_GetCountPerColumn(infoPtr) + 1;
 
       infoPtr->hdpaItems->nItemCount = nItems;
 
-      infoPtr->nItemWidth = max(LISTVIEW_GetItemWidth(hwnd),
+      infoPtr->nItemWidth = max(LISTVIEW_GetItemWidth(infoPtr),
                                 DEFAULT_COLUMN_WIDTH);
 
-      LISTVIEW_UpdateSize(hwnd);
-      LISTVIEW_UpdateScroll(hwnd);
+      LISTVIEW_UpdateSize(infoPtr);
+      LISTVIEW_UpdateScroll(infoPtr);
 
       if (min(precount,infoPtr->hdpaItems->nItemCount)<topvisible)
-        InvalidateRect(hwnd, NULL, TRUE);
+        InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
   }
   else
   {
@@ -7845,17 +7684,16 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_SetItemPosition(HWND hwnd, INT nItem,
+static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem,
                                      LONG nPosX, LONG nPosY)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
-  UINT lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  UINT lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   LISTVIEW_ITEM *lpItem;
   HDPA hdpaSubItems;
   BOOL bResult = FALSE;
 
-  TRACE("(hwnd=%x, nItem=%d, X=%ld, Y=%ld)\n", hwnd, nItem, nPosX, nPosY);
+  TRACE("(nItem=%d, X=%ld, Y=%ld)\n", nItem, nPosX, nPosY);
 
   if (lStyle & LVS_OWNERDATA)
     return FALSE;
@@ -7878,7 +7716,7 @@
              * the true beginning of the list. I will assume the origin.
              */
             POINT pt1;
-            if (!LISTVIEW_GetOrigin(hwnd, &pt1))
+            if (!LISTVIEW_GetOrigin(infoPtr, &pt1))
             {
               pt1.x = 0;
               pt1.y = 0;
@@ -7937,14 +7775,13 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetItemState(HWND hwnd, INT nItem, LPLVITEMW lpLVItem)
+static LRESULT LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEMW lpLVItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult = TRUE;
   LVITEMW lvItem;
 
-  TRACE("(hwnd=%x, nItem=%d, lpLVItem=%s)\n",
-	hwnd, nItem, debuglvitem_t(lpLVItem, TRUE));
+  TRACE("(nItem=%d, lpLVItem=%s)\n",
+	nItem, debuglvitem_t(lpLVItem, TRUE));
 
   ZeroMemory(&lvItem, sizeof(lvItem));
   lvItem.mask = LVIF_STATE;
@@ -7956,10 +7793,10 @@
   {
     /* apply to all items */
     for (lvItem.iItem = 0; lvItem.iItem < GETITEMCOUNT(infoPtr); lvItem.iItem++)
-      if (!LISTVIEW_SetItemT(hwnd, &lvItem, TRUE)) bResult = FALSE;
+      if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) bResult = FALSE;
   }
   else
-    bResult = LISTVIEW_SetItemT(hwnd, &lvItem, TRUE);
+    bResult = LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE);
 
   return bResult;
 }
@@ -7978,14 +7815,13 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static BOOL LISTVIEW_SetItemTextT(HWND hwnd, INT nItem, LPLVITEMW lpLVItem, BOOL isW)
+static BOOL LISTVIEW_SetItemTextT(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEMW lpLVItem, BOOL isW)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult = FALSE;
   LVITEMW lvItem;
 
-  TRACE("(hwnd=%x, nItem=%d, lpLVItem=%s, isW=%d)\n",
-	hwnd, nItem, debuglvitem_t(lpLVItem, isW), isW);
+  TRACE("(nItem=%d, lpLVItem=%s, isW=%d)\n",
+	nItem, debuglvitem_t(lpLVItem, isW), isW);
 
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
   {
@@ -7994,8 +7830,8 @@
     lvItem.pszText = lpLVItem->pszText;
     lvItem.iItem = nItem;
     lvItem.iSubItem = lpLVItem->iSubItem;
-    if(isW) bResult = ListView_SetItemW(hwnd, &lvItem);
-    else    bResult = ListView_SetItemA(hwnd, &lvItem);
+    if(isW) bResult = ListView_SetItemW(infoPtr->hwndSelf, &lvItem);
+    else    bResult = ListView_SetItemA(infoPtr->hwndSelf, &lvItem);
   }
 
   return bResult;
@@ -8012,12 +7848,11 @@
  * RETURN:
  * Index number or -1 if there is no selection mark.
  */
-static LRESULT LISTVIEW_SetSelectionMark(HWND hwnd, INT nIndex)
+static LRESULT LISTVIEW_SetSelectionMark(LISTVIEW_INFO *infoPtr, INT nIndex)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   INT nOldIndex = infoPtr->nSelectionMark;
 
-  TRACE("(hwnd=%x, nIndex=%d)\n", hwnd, nIndex);
+  TRACE("(nIndex=%d)\n", nIndex);
 
   infoPtr->nSelectionMark = nIndex;
 
@@ -8036,14 +7871,12 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetTextBkColor(HWND hwnd, COLORREF clrTextBk)
+static LRESULT LISTVIEW_SetTextBkColor(LISTVIEW_INFO *infoPtr, COLORREF clrTextBk)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x, clrTextBk=%lx)\n", hwnd, clrTextBk);
+  TRACE("(clrTextBk=%lx)\n", clrTextBk);
 
   infoPtr->clrTextBk = clrTextBk;
-  InvalidateRect(hwnd, NULL, TRUE);
+  InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
 
   return TRUE;
 }
@@ -8060,14 +7893,12 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SetTextColor (HWND hwnd, COLORREF clrText)
+static LRESULT LISTVIEW_SetTextColor (LISTVIEW_INFO *infoPtr, COLORREF clrText)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x, clrText=%lx)\n", hwnd, clrText);
+  TRACE("(clrText=%lx)\n", clrText);
 
   infoPtr->clrText = clrText;
-  InvalidateRect(hwnd, NULL, TRUE);
+  InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
 
   return TRUE;
 }
@@ -8091,7 +7922,7 @@
  *   if first and second are equivalent : zero
  */
 static INT WINAPI LISTVIEW_CallBackCompare(LPVOID first, LPVOID second, LPARAM lParam)
-{
+{ 
   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW((HWND)lParam, 0);
   LISTVIEW_ITEM* lv_first = (LISTVIEW_ITEM*) DPA_GetPtr( (HDPA)first, 0 );
   LISTVIEW_ITEM* lv_second = (LISTVIEW_ITEM*) DPA_GetPtr( (HDPA)second, 0 );
@@ -8113,16 +7944,15 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_SortItems(HWND hwnd, PFNLVCOMPARE pfnCompare, LPARAM lParamSort)
+static LRESULT LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompare, LPARAM lParamSort)
 {
-    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-    UINT lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+    UINT lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
     HDPA hdpaSubItems=NULL;
     LISTVIEW_ITEM *pLVItem=NULL;
     LPVOID selectionMarkItem;
     int nCount, i;
 
-    TRACE("(hwnd=%x, pfnCompare=%p, lParamSort=%lx)\n", hwnd, pfnCompare, lParamSort);
+    TRACE("(pfnCompare=%p, lParamSort=%lx)\n", pfnCompare, lParamSort);
 
     if (lStyle & LVS_OWNERDATA) return FALSE;
 
@@ -8135,7 +7965,7 @@
 
     infoPtr->pfnCompare = pfnCompare;
     infoPtr->lParamSort = lParamSort;
-    DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompare, (LPARAM)hwnd);
+    DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompare, (LPARAM)infoPtr->hwndSelf);
 
     /* Adjust selections and indices so that they are the way they should
      * be after the sort (otherwise, the list items move around, but
@@ -8149,9 +7979,9 @@
        pLVItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0);
 
        if (pLVItem->state & LVIS_SELECTED)
-          LISTVIEW_AddSelectionRange(hwnd, i, i);
+          LISTVIEW_AddSelectionRange(infoPtr, i, i);
        else
-          LISTVIEW_RemoveSelectionRange(hwnd, i, i);
+          LISTVIEW_RemoveSelectionRange(infoPtr, i, i);
        if (pLVItem->state & LVIS_FOCUSED)
           infoPtr->nFocusedItem=i;
     }
@@ -8160,10 +7990,10 @@
     /* I believe nHotItem should be left alone, see LISTVIEW_ShiftIndices */
 
     /* align the items */
-    LISTVIEW_AlignTop(hwnd);
+    LISTVIEW_AlignTop(infoPtr);
 
     /* refresh the display */
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
 
     return TRUE;
 }
@@ -8182,14 +8012,13 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_Update(HWND hwnd, INT nItem)
+static LRESULT LISTVIEW_Update(LISTVIEW_INFO *infoPtr, INT nItem)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   BOOL bResult = FALSE;
   RECT rc;
 
-  TRACE("(hwnd=%x, nItem=%d)\n", hwnd, nItem);
+  TRACE("(nItem=%d)\n", nItem);
 
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
   {
@@ -8199,13 +8028,13 @@
     if ((lStyle & LVS_AUTOARRANGE) && (((lStyle & LVS_TYPEMASK) == LVS_ICON) ||
         ((lStyle & LVS_TYPEMASK)  == LVS_SMALLICON)))
     {
-      ListView_Arrange(hwnd, 0);
+      ListView_Arrange(infoPtr->hwndSelf, 0);
     }
     else
     {
       /* get item bounding rectangle */
-      ListView_GetItemRect(hwnd, nItem, &rc, LVIR_BOUNDS);
-      InvalidateRect(hwnd, &rc, TRUE);
+      ListView_GetItemRect(infoPtr->hwndSelf, nItem, &rc, LVIR_BOUNDS);
+      InvalidateRect(infoPtr->hwndSelf, &rc, TRUE);
     }
   }
 
@@ -8228,14 +8057,14 @@
   UINT uView = lpcs->style & LVS_TYPEMASK;
   LOGFONTW logFont;
 
-  TRACE("(hwnd=%x, lpcs=%p)\n", hwnd, lpcs);
+  TRACE("(lpcs=%p)\n", lpcs);
 
   /* initialize info pointer */
   ZeroMemory(infoPtr, sizeof(LISTVIEW_INFO));
 
   /* determine the type of structures to use */
-  infoPtr->notifyFormat = SendMessageW(GetParent(hwnd), WM_NOTIFYFORMAT,
-                                       (WPARAM)hwnd, (LPARAM)NF_QUERY);
+  infoPtr->notifyFormat = SendMessageW(GetParent(infoPtr->hwndSelf), WM_NOTIFYFORMAT,
+                                       (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
 
   /* initialize color information  */
   infoPtr->clrBk = comctl32_color.clrWindow;
@@ -8253,7 +8082,6 @@
   ZeroMemory(&infoPtr->rcList, sizeof(RECT));
   infoPtr->hwndEdit = 0;
   infoPtr->Editing = FALSE;
-  infoPtr->pedititem = NULL;
   infoPtr->nEditLabelItem = -1;
   infoPtr->bIsDrawing = FALSE;
 
@@ -8261,7 +8089,7 @@
   SystemParametersInfoW(SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
   infoPtr->hDefaultFont = CreateFontIndirectW(&logFont);
   infoPtr->hFont = infoPtr->hDefaultFont;
-  LISTVIEW_SaveTextMetrics(hwnd);
+  LISTVIEW_SaveTextMetrics(infoPtr);
 
   /* create header */
   infoPtr->hwndHeader =	CreateWindowW(WC_HEADERW, (LPCWSTR)NULL,
@@ -8314,8 +8142,8 @@
   infoPtr->hdpaSelectionRanges = DPA_Create(10);
 
   /* initialize size of items */
-  infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-  infoPtr->nItemHeight = LISTVIEW_GetItemHeight(hwnd);
+  infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+  infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
 
   /* initialize the hover time to -1(indicating the default system hover time) */
   infoPtr->dwHoverTime = -1;
@@ -8336,23 +8164,22 @@
  *   SUCCESS : TRUE
  *   FAILURE : FALSE
  */
-static LRESULT LISTVIEW_EraseBackground(HWND hwnd, WPARAM wParam,
+static LRESULT LISTVIEW_EraseBackground(LISTVIEW_INFO *infoPtr, WPARAM wParam,
                                         LPARAM lParam)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   BOOL bResult;
 
-  TRACE("(hwnd=%x, wParam=%x, lParam=%lx)\n", hwnd, wParam, lParam);
+  TRACE("(wParam=%x, lParam=%lx)\n", wParam, lParam);
 
   if (infoPtr->clrBk == CLR_NONE)
   {
-    bResult = SendMessageW(GetParent(hwnd), WM_ERASEBKGND, wParam, lParam);
+    bResult = SendMessageW(GetParent(infoPtr->hwndSelf), WM_ERASEBKGND, wParam, lParam);
   }
   else
   {
     RECT rc;
     HBRUSH hBrush = CreateSolidBrush(infoPtr->clrBk);
-    GetClientRect(hwnd, &rc);
+    GetClientRect(infoPtr->hwndSelf, &rc);
     FillRect((HDC)wParam, &rc, hBrush);
     DeleteObject(hBrush);
     bResult = TRUE;
@@ -8362,11 +8189,9 @@
 }
 
 
-static void LISTVIEW_FillBackground(HWND hwnd, HDC hdc, LPRECT rc)
+static void LISTVIEW_FillBackground(LISTVIEW_INFO *infoPtr, HDC hdc, LPRECT rc)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x, hdc=%x, rc=%p)\n", hwnd, hdc, rc);
+  TRACE("(hdc=%x, rc=%p)\n", hdc, rc);
 
   if (infoPtr->clrBk != CLR_NONE)
   {
@@ -8386,11 +8211,9 @@
  * RETURN:
  * Font handle.
  */
-static LRESULT LISTVIEW_GetFont(HWND hwnd)
+static LRESULT LISTVIEW_GetFont(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x)\n", hwnd);
+  TRACE("()\n");
 
   return infoPtr->hFont;
 }
@@ -8416,16 +8239,15 @@
  *        for LVS_LIST cannot occur ??? (implemented as LVS_REPORT)
  *
  */
-static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos,
+static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode, SHORT nCurrentPos,
                                 HWND hScrollWnd)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   SCROLLINFO scrollInfo;
   BOOL is_an_icon;
 
-  TRACE("(hwnd=%x, nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n",
-	hwnd, nScrollCode, nCurrentPos, hScrollWnd);
+  TRACE("(nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n",
+	nScrollCode, nCurrentPos, hScrollWnd);
 
   SendMessageW(infoPtr->hwndEdit, WM_KILLFOCUS, 0, 0);
 
@@ -8435,7 +8257,7 @@
 
   is_an_icon = ((uView == LVS_ICON) || (uView == LVS_SMALLICON));
 
-  if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
+  if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo) != FALSE)
   {
     INT nOldScrollPos = scrollInfo.nPos;
     switch (nScrollCode)
@@ -8497,13 +8319,13 @@
     if (nOldScrollPos != scrollInfo.nPos)
     {
       scrollInfo.fMask = SIF_POS;
-      SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
+      SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
 
       /* Get real position value, the value we set might have been changed
        * by SetScrollInfo (especially if we went too far.
        */
       scrollInfo.fMask = SIF_POS;
-      GetScrollInfo(hwnd, SB_VERT, &scrollInfo);
+      GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo);
 
       /* only if the scroll position really changed, do we update screen */
       if (nOldScrollPos != scrollInfo.nPos)
@@ -8511,14 +8333,14 @@
 	if (IsWindowVisible(infoPtr->hwndHeader))
 	{
 	    RECT rListview, rcHeader, rDest;
-	    GetClientRect(hwnd, &rListview);
+	    GetClientRect(infoPtr->hwndSelf, &rListview);
 	    GetWindowRect(infoPtr->hwndHeader, &rcHeader);
-	    MapWindowPoints((HWND) NULL, hwnd, (LPPOINT) &rcHeader, 2);
+	    MapWindowPoints((HWND) NULL, infoPtr->hwndSelf, (LPPOINT) &rcHeader, 2);
 	    SubtractRect(&rDest, &rListview, &rcHeader);
-	    InvalidateRect(hwnd, &rDest, TRUE);
+	    InvalidateRect(infoPtr->hwndSelf, &rDest, TRUE);
 	}
 	else
-	    InvalidateRect(hwnd, NULL, TRUE);
+	    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
       }
     }
   }
@@ -8548,16 +8370,15 @@
  *                                      scroll is based on columns not pixels
  *
  */
-static LRESULT LISTVIEW_HScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos,
+static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode, SHORT nCurrentPos,
                                 HWND hScrollWnd)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   SCROLLINFO scrollInfo;
   BOOL is_a_list;
 
-  TRACE("(hwnd=%x, nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n",
-	hwnd, nScrollCode, nCurrentPos, hScrollWnd);
+  TRACE("(nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n",
+	nScrollCode, nCurrentPos, hScrollWnd);
 
   SendMessageW(infoPtr->hwndEdit, WM_KILLFOCUS, 0, 0);
 
@@ -8567,7 +8388,7 @@
 
   is_a_list = (uView == LVS_LIST);
 
-  if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
+  if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo) != FALSE)
   {
     INT nOldScrollPos = scrollInfo.nPos;
 
@@ -8627,37 +8448,37 @@
 
     if (nOldScrollPos != scrollInfo.nPos)
     {
-      UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+      UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
       scrollInfo.fMask = SIF_POS;
-      SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
+      SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
 
       /* Get real position value, the value we set might have been changed
        * by SetScrollInfo (especially if we went too far.
        */
       scrollInfo.fMask = SIF_POS;
-      GetScrollInfo(hwnd, SB_HORZ, &scrollInfo);
+      GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo);
       if(uView == LVS_REPORT)
       {
-          LISTVIEW_UpdateHeaderSize(hwnd, scrollInfo.nPos);
+          LISTVIEW_UpdateHeaderSize(infoPtr, scrollInfo.nPos);
       }
 
       /* only if the scroll position really changed, do we update screen */
       if (nOldScrollPos != scrollInfo.nPos)
-	  InvalidateRect(hwnd, NULL, TRUE);
+	  InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
     }
   }
 
   return 0;
 }
 
-static LRESULT LISTVIEW_MouseWheel(HWND hwnd, INT wheelDelta)
+static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
 {
-    UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+    UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
     INT gcWheelDelta = 0;
     UINT pulScrollLines = 3;
     SCROLLINFO scrollInfo;
 
-    TRACE("(hwnd=%x, wheelDelta=%d)\n", hwnd, wheelDelta);
+    TRACE("(wheelDelta=%d)\n", wheelDelta);
 
     SystemParametersInfoW(SPI_GETWHEELSCROLLLINES,0, &pulScrollLines, 0);
     gcWheelDelta -= wheelDelta;
@@ -8674,8 +8495,8 @@
         *  listview should be scrolled by a multiple of 37 dependently on its dimension or its visible item number
         *  should be fixed in the future.
         */
-        if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
-            LISTVIEW_VScroll(hwnd, SB_THUMBPOSITION,
+        if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo) != FALSE)
+            LISTVIEW_VScroll(infoPtr, SB_THUMBPOSITION,
 			     scrollInfo.nPos + (gcWheelDelta < 0) ?
 			     LISTVIEW_SCROLL_ICON_LINE_SIZE :
 			     -LISTVIEW_SCROLL_ICON_LINE_SIZE, 0);
@@ -8684,17 +8505,17 @@
     case LVS_REPORT:
         if (abs(gcWheelDelta) >= WHEEL_DELTA && pulScrollLines)
         {
-            if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
+            if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo) != FALSE)
             {
-                int cLineScroll = min(LISTVIEW_GetCountPerColumn(hwnd), pulScrollLines);
+                int cLineScroll = min(LISTVIEW_GetCountPerColumn(infoPtr), pulScrollLines);
                 cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
-                LISTVIEW_VScroll(hwnd, SB_THUMBPOSITION, scrollInfo.nPos + cLineScroll, 0);
+                LISTVIEW_VScroll(infoPtr, SB_THUMBPOSITION, scrollInfo.nPos + cLineScroll, 0);
             }
         }
         break;
 
     case LVS_LIST:
-        LISTVIEW_HScroll(hwnd, (gcWheelDelta < 0) ? SB_LINELEFT : SB_LINERIGHT, 0, 0);
+        LISTVIEW_HScroll(infoPtr, (gcWheelDelta < 0) ? SB_LINELEFT : SB_LINERIGHT, 0, 0);
         break;
     }
     return 0;
@@ -8712,27 +8533,26 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_KeyDown(HWND hwnd, INT nVirtualKey, LONG lKeyData)
+static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lKeyData)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView =  GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView =  GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT nItem = -1;
   NMLVKEYDOWN nmKeyDown;
 
-  TRACE("(hwnd=%x, nVirtualKey=%d, lKeyData=%ld)\n", hwnd, nVirtualKey, lKeyData);
+  TRACE("(nVirtualKey=%d, lKeyData=%ld)\n", nVirtualKey, lKeyData);
 
   /* send LVN_KEYDOWN notification */
   nmKeyDown.wVKey = nVirtualKey;
   nmKeyDown.flags = 0;
-  notify(hwnd, LVN_KEYDOWN, &nmKeyDown.hdr);
+  notify(infoPtr, LVN_KEYDOWN, &nmKeyDown.hdr);
 
   switch (nVirtualKey)
   {
   case VK_RETURN:
     if ((GETITEMCOUNT(infoPtr) > 0) && (infoPtr->nFocusedItem != -1))
     {
-      hdr_notify(hwnd, NM_RETURN);        /* NM_RETURN notification */
-      hdr_notify(hwnd, LVN_ITEMACTIVATE); /* LVN_ITEMACTIVATE notification */
+      hdr_notify(infoPtr, NM_RETURN);        /* NM_RETURN notification */
+      hdr_notify(infoPtr, LVN_ITEMACTIVATE); /* LVN_ITEMACTIVATE notification */
     }
     break;
 
@@ -8747,44 +8567,44 @@
     break;
 
   case VK_LEFT:
-    nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_TOLEFT);
+    nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_TOLEFT);
     break;
 
   case VK_UP:
-    nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_ABOVE);
+    nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_ABOVE);
     break;
 
   case VK_RIGHT:
-    nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_TORIGHT);
+    nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_TORIGHT);
     break;
 
   case VK_DOWN:
-    nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_BELOW);
+    nItem = ListView_GetNextItem(infoPtr->hwndSelf, infoPtr->nFocusedItem, LVNI_BELOW);
     break;
 
   case VK_PRIOR:
     if (uView == LVS_REPORT)
-      nItem = infoPtr->nFocusedItem - LISTVIEW_GetCountPerColumn(hwnd);
+      nItem = infoPtr->nFocusedItem - LISTVIEW_GetCountPerColumn(infoPtr);
     else
-      nItem = infoPtr->nFocusedItem - LISTVIEW_GetCountPerColumn(hwnd)
-                                    * LISTVIEW_GetCountPerRow(hwnd);
+      nItem = infoPtr->nFocusedItem - LISTVIEW_GetCountPerColumn(infoPtr)
+                                    * LISTVIEW_GetCountPerRow(infoPtr);
     if(nItem < 0) nItem = 0;
     break;
 
   case VK_NEXT:
     if (uView == LVS_REPORT)
-      nItem = infoPtr->nFocusedItem + LISTVIEW_GetCountPerColumn(hwnd);
+      nItem = infoPtr->nFocusedItem + LISTVIEW_GetCountPerColumn(infoPtr);
     else
-      nItem = infoPtr->nFocusedItem + LISTVIEW_GetCountPerColumn(hwnd)
-                                    * LISTVIEW_GetCountPerRow(hwnd);
+      nItem = infoPtr->nFocusedItem + LISTVIEW_GetCountPerColumn(infoPtr)
+                                    * LISTVIEW_GetCountPerRow(infoPtr);
     if(nItem >= GETITEMCOUNT(infoPtr)) nItem = GETITEMCOUNT(infoPtr) - 1;
     break;
   }
 
   if ((nItem != -1) && (nItem != infoPtr->nFocusedItem))
   {
-    if (LISTVIEW_KeySelection(hwnd, nItem))
-      UpdateWindow(hwnd); /* update client area */
+    if (LISTVIEW_KeySelection(infoPtr, nItem))
+      UpdateWindow(infoPtr->hwndSelf); /* update client area */
   }
 
   return 0;
@@ -8800,16 +8620,15 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_KillFocus(HWND hwnd)
+static LRESULT LISTVIEW_KillFocus(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongW(hwnd, 0);
-  UINT uView =  GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView =  GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
   INT i,nTop,nBottom;
 
-  TRACE("(hwnd=%x)\n", hwnd);
+  TRACE("()\n");
 
   /* send NM_KILLFOCUS notification */
-  hdr_notify(hwnd, NM_KILLFOCUS);
+  hdr_notify(infoPtr, NM_KILLFOCUS);
 
   /* set window focus flag */
   infoPtr->bFocus = FALSE;
@@ -8817,9 +8636,9 @@
   /* NEED drawing optimization ; redraw the selected items */
   if (uView & LVS_REPORT)
   {
-    nTop = LISTVIEW_GetTopIndex(hwnd);
+    nTop = LISTVIEW_GetTopIndex(infoPtr);
     nBottom = nTop +
-              LISTVIEW_GetCountPerColumn(hwnd) + 1;
+              LISTVIEW_GetCountPerColumn(infoPtr) + 1;
   }
   else
   {
@@ -8828,12 +8647,12 @@
   }
   for (i = nTop; i<nBottom; i++)
   {
-    if (LISTVIEW_IsSelected(hwnd,i))
+    if (LISTVIEW_IsSelected(infoPtr,i))
     {
       RECT rcItem;
       rcItem.left = LVIR_BOUNDS;
-      LISTVIEW_GetItemRect(hwnd, i, &rcItem);
-      InvalidateRect(hwnd, &rcItem, FALSE);
+      LISTVIEW_GetItemRect(infoPtr, i, &rcItem);
+      InvalidateRect(infoPtr->hwndSelf, &rcItem, FALSE);
     }
   }
 
@@ -8846,27 +8665,25 @@
  *
  * PARAMETER(S):
  * [I] HWND : window handle
- * [I] WORD : key flag
- * [I] WORD : x coordinate
- * [I] WORD : y coordinate
+ * [I] wKey : key flag
+ * [I] pts : mouse coordinate
  *
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_LButtonDblClk(HWND hwnd, WORD wKey, WORD wPosX,
-                                      WORD wPosY)
+static LRESULT LISTVIEW_LButtonDblClk(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
   LVHITTESTINFO htInfo;
   NMLISTVIEW nmlv;
 
-  TRACE("(hwnd=%x, key=%hu, X=%hu, Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, pts.x, pts.y);
 
-  htInfo.pt.x = wPosX;
-  htInfo.pt.y = wPosY;
+  htInfo.pt.x = pts.x;
+  htInfo.pt.y = pts.y;
 
   /* send NM_DBLCLK notification */
   ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
-  if (LISTVIEW_HitTestItem(hwnd, &htInfo, TRUE) != -1)
+  if (LISTVIEW_HitTestItem(infoPtr, &htInfo, TRUE) != -1)
   {
     nmlv.iItem = htInfo.iItem;
     nmlv.iSubItem = htInfo.iSubItem;
@@ -8876,14 +8693,14 @@
     nmlv.iItem = -1;
     nmlv.iSubItem = 0;
   }
-  nmlv.ptAction.x = wPosX;
-  nmlv.ptAction.y = wPosY;
-  listview_notify(hwnd, NM_DBLCLK, &nmlv);
+  nmlv.ptAction.x = pts.x;
+  nmlv.ptAction.y = pts.y;
+  listview_notify(infoPtr, NM_DBLCLK, &nmlv);
 
 
   /* To send the LVN_ITEMACTIVATE, it must be on an Item */
   if(nmlv.iItem != -1)
-    hdr_notify(hwnd, LVN_ITEMACTIVATE);
+    hdr_notify(infoPtr, LVN_ITEMACTIVATE);
 
   return 0;
 }
@@ -8894,70 +8711,65 @@
  *
  * PARAMETER(S):
  * [I] HWND : window handle
- * [I] WORD : key flag
- * [I] WORD : x coordinate
- * [I] WORD : y coordinate
+ * [I] wKey : key flag
+ * [I] pts : mouse coordinate
  *
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_LButtonDown(HWND hwnd, WORD wKey, WORD wPosX,
-                                    WORD wPosY)
+static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   static BOOL bGroupSelect = TRUE;
-  POINT ptPosition;
+  POINT pt = { pts.x, pts.y };
   INT nItem;
 
-  TRACE("(hwnd=%x, key=%hu, X=%hu, Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, pts.x, pts.y);
 
   /* send NM_RELEASEDCAPTURE notification */
-  hdr_notify(hwnd, NM_RELEASEDCAPTURE);
+  hdr_notify(infoPtr, NM_RELEASEDCAPTURE);
 
   if (infoPtr->bFocus == FALSE)
-    SetFocus(hwnd);
+    SetFocus(infoPtr->hwndSelf);
 
   /* set left button down flag */
   infoPtr->bLButtonDown = TRUE;
 
-  ptPosition.x = wPosX;
-  ptPosition.y = wPosY;
-  nItem = LISTVIEW_MouseSelection(hwnd, ptPosition);
+  nItem = LISTVIEW_MouseSelection(infoPtr, pt);
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
   {
     if (lStyle & LVS_SINGLESEL)
     {
-      if ((LISTVIEW_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED)
+      if ((LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED) & LVIS_SELECTED)
           && infoPtr->nEditLabelItem == -1)
           infoPtr->nEditLabelItem = nItem;
       else
-        LISTVIEW_SetSelection(hwnd, nItem);
+        LISTVIEW_SetSelection(infoPtr, nItem);
     }
     else
     {
       if ((wKey & MK_CONTROL) && (wKey & MK_SHIFT))
       {
         if (bGroupSelect)
-          LISTVIEW_AddGroupSelection(hwnd, nItem);
+          LISTVIEW_AddGroupSelection(infoPtr, nItem);
         else
-          LISTVIEW_AddSelection(hwnd, nItem);
+          LISTVIEW_AddSelection(infoPtr, nItem);
       }
       else if (wKey & MK_CONTROL)
       {
-        bGroupSelect = LISTVIEW_ToggleSelection(hwnd, nItem);
+        bGroupSelect = LISTVIEW_ToggleSelection(infoPtr, nItem);
       }
       else  if (wKey & MK_SHIFT)
       {
-        LISTVIEW_SetGroupSelection(hwnd, nItem);
+        LISTVIEW_SetGroupSelection(infoPtr, nItem);
       }
       else
       {
 	BOOL was_selected =
-	    (LISTVIEW_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED);
+	    (LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED) & LVIS_SELECTED);
 
 	/* set selection (clears other pre-existing selections) */
-        LISTVIEW_SetSelection(hwnd, nItem);
+        LISTVIEW_SetSelection(infoPtr, nItem);
 
         if (was_selected && infoPtr->nEditLabelItem == -1)
           infoPtr->nEditLabelItem = nItem;
@@ -8967,11 +8779,11 @@
   else
   {
     /* remove all selections */
-    LISTVIEW_RemoveAllSelections(hwnd);
+    LISTVIEW_RemoveAllSelections(infoPtr);
   }
 
   /* redraw if we could have possibly selected something */
-  if(!GETITEMCOUNT(infoPtr)) InvalidateRect(hwnd, NULL, TRUE);
+  if(!GETITEMCOUNT(infoPtr)) InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
 
   return 0;
 }
@@ -8982,31 +8794,27 @@
  *
  * PARAMETER(S):
  * [I] HWND : window handle
- * [I] WORD : key flag
- * [I] WORD : x coordinate
- * [I] WORD : y coordinate
+ * [I] wKey : key flag
+ * [I] pts : mouse coordinate
  *
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_LButtonUp(HWND hwnd, WORD wKey, WORD wPosX,
-                                  WORD wPosY)
+static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x, key=%hu, X=%hu, Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(key=%hu, X=%hu, Y=%hu)\n", wKey, pts.x, pts.y);
 
   if (infoPtr->bLButtonDown != FALSE)
   {
     LVHITTESTINFO lvHitTestInfo;
     NMLISTVIEW nmlv;
 
-    lvHitTestInfo.pt.x = wPosX;
-    lvHitTestInfo.pt.y = wPosY;
+    lvHitTestInfo.pt.x = pts.x;
+    lvHitTestInfo.pt.y = pts.y;
 
   /* send NM_CLICK notification */
     ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
-    if (LISTVIEW_HitTestItem(hwnd, &lvHitTestInfo, TRUE) != -1)
+    if (LISTVIEW_HitTestItem(infoPtr, &lvHitTestInfo, TRUE) != -1)
     {
         nmlv.iItem = lvHitTestInfo.iItem;
         nmlv.iSubItem = lvHitTestInfo.iSubItem;
@@ -9016,17 +8824,18 @@
         nmlv.iItem = -1;
         nmlv.iSubItem = 0;
     }
-    nmlv.ptAction.x = wPosX;
-    nmlv.ptAction.y = wPosY;
-    listview_notify(hwnd, NM_CLICK, &nmlv);
+    nmlv.ptAction.x = pts.x;
+    nmlv.ptAction.y = pts.y;
+    listview_notify(infoPtr, NM_CLICK, &nmlv);
 
     /* set left button flag */
     infoPtr->bLButtonDown = FALSE;
-
+    
     if(infoPtr->nEditLabelItem != -1)
     {
-      if(lvHitTestInfo.iItem == infoPtr->nEditLabelItem && lvHitTestInfo.flags & LVHT_ONITEMLABEL)
-        LISTVIEW_EditLabelT(hwnd, lvHitTestInfo.iItem, TRUE);
+      if(lvHitTestInfo.iItem == infoPtr->nEditLabelItem && lvHitTestInfo.flags & LVHT_ONITEMLABEL) {
+        LISTVIEW_EditLabelT(infoPtr, lvHitTestInfo.iItem, TRUE);
+      }
       infoPtr->nEditLabelItem = -1;
     }
   }
@@ -9046,28 +8855,23 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_NCCreate(HWND hwnd, WPARAM wParam, LPARAM lParam)
+static BOOL LISTVIEW_NCCreate(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LISTVIEW_INFO *infoPtr;
 
-  TRACE("(hwnd=%x, wParam=%x, lParam=%lx)\n", hwnd, wParam, lParam);
+  TRACE("(wParam=%x, lParam=%lx)\n", wParam, lParam);
 
   /* allocate memory for info structure */
   infoPtr = (LISTVIEW_INFO *)COMCTL32_Alloc(sizeof(LISTVIEW_INFO));
   if (infoPtr == NULL)
   {
     ERR("could not allocate info memory!\n");
-    return 0;
-  }
-
-  SetWindowLongW(hwnd, 0, (LONG)infoPtr);
-  if ((LISTVIEW_INFO *)GetWindowLongW(hwnd, 0) != infoPtr)
-  {
-    ERR("pointer assignment error!\n");
-    return 0;
+    return FALSE;
   }
+  infoPtr->hwndSelf = hwnd;
+  SetWindowLongW(infoPtr->hwndSelf, 0, (LONG)infoPtr);
 
-  return DefWindowProcW(hwnd, WM_NCCREATE, wParam, lParam);
+  return (BOOL)DefWindowProcW(hwnd, WM_NCCREATE, wParam, lParam);
 }
 
 /***
@@ -9080,15 +8884,14 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_NCDestroy(HWND hwnd)
+static LRESULT LISTVIEW_NCDestroy(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
 
-  TRACE("(hwnd=%x)\n", hwnd);
+  TRACE("()\n");
 
   /* delete all items */
-  LISTVIEW_DeleteAllItems(hwnd);
+  LISTVIEW_DeleteAllItems(infoPtr);
 
   /* destroy data structure */
   DPA_Destroy(infoPtr->hdpaItems);
@@ -9125,7 +8928,7 @@
   /* free listview info pointer*/
   COMCTL32_Free(infoPtr);
 
-  SetWindowLongW(hwnd, 0, 0);
+  SetWindowLongW(infoPtr->hwndSelf, 0, 0);
   return 0;
 }
 
@@ -9141,19 +8944,17 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_Notify(HWND hwnd, INT nCtrlId, LPNMHDR lpnmh)
+static LRESULT LISTVIEW_Notify(LISTVIEW_INFO *infoPtr, INT nCtrlId, LPNMHDR lpnmh)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x, nCtrlId=%d, lpnmh=%p)\n", hwnd, nCtrlId, lpnmh);
+  TRACE("(nCtrlId=%d, lpnmh=%p)\n", nCtrlId, lpnmh);
 
   if (lpnmh->hwndFrom == infoPtr->hwndHeader)
   {
     /* handle notification from header control */
     if (lpnmh->code == HDN_ENDTRACKW)
     {
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-      InvalidateRect(hwnd, NULL, TRUE);
+      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
     }
     else if(lpnmh->code ==  HDN_ITEMCLICKW || lpnmh->code ==  HDN_ITEMCLICKA)
     {
@@ -9163,7 +8964,7 @@
         ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
         nmlv.iItem = -1;
         nmlv.iSubItem = ((LPNMHEADERW)lpnmh)->iItem;
-        listview_notify(hwnd, LVN_COLUMNCLICK, &nmlv);
+        listview_notify(infoPtr, LVN_COLUMNCLICK, &nmlv);
     }
     else if(lpnmh->code == NM_RELEASEDCAPTURE)
     {
@@ -9173,9 +8974,9 @@
        * update of the scroll bar here (Header.c works fine as it is,
        * no need to disturb it)
        */
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-      LISTVIEW_UpdateScroll(hwnd);
-      InvalidateRect(hwnd, NULL, TRUE);
+      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      LISTVIEW_UpdateScroll(infoPtr);
+      InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
     }
 
   }
@@ -9195,15 +8996,13 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_NotifyFormat(HWND hwndFrom, HWND hwnd, INT nCommand)
+static LRESULT LISTVIEW_NotifyFormat(LISTVIEW_INFO *infoPtr, HWND hwndFrom, INT nCommand)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwndFrom=%x, hwnd=%x, nCommand=%d)\n", hwndFrom, hwnd, nCommand);
+  TRACE("(hwndFrom=%x, nCommand=%d)\n", hwndFrom, nCommand);
 
   if (nCommand == NF_REQUERY)
     infoPtr->notifyFormat = SendMessageW(hwndFrom, WM_NOTIFYFORMAT,
-                                         (WPARAM)hwnd, (LPARAM)NF_QUERY);
+                                         (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
   return 0;
 }
 
@@ -9218,21 +9017,21 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_Paint(HWND hwnd, HDC hdc)
+static LRESULT LISTVIEW_Paint(LISTVIEW_INFO *infoPtr, HDC hdc)
 {
   PAINTSTRUCT ps;
 
-  TRACE("(hwnd=%x, hdc=%x)\n", hwnd, hdc);
+  TRACE("(hdc=%x)\n", hdc);
 
   if (hdc == 0)
   {
-    hdc = BeginPaint(hwnd, &ps);
-    LISTVIEW_Refresh(hwnd, hdc);
-    EndPaint(hwnd, &ps);
+    hdc = BeginPaint(infoPtr->hwndSelf, &ps);
+    LISTVIEW_Refresh(infoPtr, hdc);
+    EndPaint(infoPtr->hwndSelf, &ps);
   }
   else
   {
-    LISTVIEW_Refresh(hwnd, hdc);
+    LISTVIEW_Refresh(infoPtr, hdc);
   }
 
   return 0;
@@ -9244,23 +9043,21 @@
  *
  * PARAMETER(S):
  * [I] HWND : window handle
- * [I] WORD : key flag
- * [I] WORD : x coordinate
- * [I] WORD : y coordinate
+ * [I] wKey : key flag
+ * [I] pts : mouse coordinate
  *
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_RButtonDblClk(HWND hwnd, WORD wKey, WORD wPosX,
-                                      WORD wPosY)
+static LRESULT LISTVIEW_RButtonDblClk(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
-  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(key=%hu,X=%hu,Y=%hu)\n", wKey, pts.x, pts.y);
 
   /* send NM_RELEASEDCAPTURE notification */
-  hdr_notify(hwnd, NM_RELEASEDCAPTURE);
+  hdr_notify(infoPtr, NM_RELEASEDCAPTURE);
 
   /* send NM_RDBLCLK notification */
-  hdr_notify(hwnd, NM_RDBLCLK);
+  hdr_notify(infoPtr, NM_RDBLCLK);
 
   return 0;
 }
@@ -9271,56 +9068,51 @@
  *
  * PARAMETER(S):
  * [I] HWND : window handle
- * [I] WORD : key flag
- * [I] WORD : x coordinate
- * [I] WORD : y coordinate
+ * [I] wKey : key flag
+ * [I] pts : mouse coordinate
  *
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_RButtonDown(HWND hwnd, WORD wKey, WORD wPosX,
-                                    WORD wPosY)
+static LRESULT LISTVIEW_RButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  POINT ptPosition;
   INT nItem;
   NMLISTVIEW nmlv;
   LVHITTESTINFO lvHitTestInfo;
+  POINT pt = { pts.x, pts.y };
 
-  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(key=%hu,X=%hu,Y=%hu)\n", wKey, pts.x, pts.y);
 
   /* send NM_RELEASEDCAPTURE notification */
-  hdr_notify(hwnd, NM_RELEASEDCAPTURE);
+  hdr_notify(infoPtr, NM_RELEASEDCAPTURE);
 
   /* make sure the listview control window has the focus */
   if (infoPtr->bFocus == FALSE)
-    SetFocus(hwnd);
+    SetFocus(infoPtr->hwndSelf);
 
   /* set right button down flag */
   infoPtr->bRButtonDown = TRUE;
 
   /* determine the index of the selected item */
-  ptPosition.x = wPosX;
-  ptPosition.y = wPosY;
-  nItem = LISTVIEW_MouseSelection(hwnd, ptPosition);
+  nItem = LISTVIEW_MouseSelection(infoPtr, pt);
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
   {
-    LISTVIEW_SetItemFocus(hwnd,nItem);
+    LISTVIEW_SetItemFocus(infoPtr,nItem);
     if (!((wKey & MK_SHIFT) || (wKey & MK_CONTROL)) &&
-        !LISTVIEW_IsSelected(hwnd,nItem))
-      LISTVIEW_SetSelection(hwnd, nItem);
+        !LISTVIEW_IsSelected(infoPtr,nItem))
+      LISTVIEW_SetSelection(infoPtr, nItem);
   }
   else
   {
-    LISTVIEW_RemoveAllSelections(hwnd);
+    LISTVIEW_RemoveAllSelections(infoPtr);
   }
 
-  lvHitTestInfo.pt.x = wPosX;
-  lvHitTestInfo.pt.y = wPosY;
+  lvHitTestInfo.pt.x = pts.x;
+  lvHitTestInfo.pt.y = pts.y;
 
   /* Send NM_RClICK notification */
   ZeroMemory(&nmlv, sizeof(nmlv));
-  if (LISTVIEW_HitTestItem(hwnd, &lvHitTestInfo, TRUE) != -1)
+  if (LISTVIEW_HitTestItem(infoPtr, &lvHitTestInfo, TRUE) != -1)
   {
     nmlv.iItem = lvHitTestInfo.iItem;
     nmlv.iSubItem = lvHitTestInfo.iSubItem;
@@ -9330,9 +9122,9 @@
     nmlv.iItem = -1;
     nmlv.iSubItem = 0;
   }
-  nmlv.ptAction.x = wPosX;
-  nmlv.ptAction.y = wPosY;
-  listview_notify(hwnd, NM_RCLICK, &nmlv);
+  nmlv.ptAction.x = pts.x;
+  nmlv.ptAction.y = pts.y;
+  listview_notify(infoPtr, NM_RCLICK, &nmlv);
 
   return 0;
 }
@@ -9343,40 +9135,63 @@
  *
  * PARAMETER(S):
  * [I] HWND : window handle
- * [I] WORD : key flag
- * [I] WORD : x coordinate
- * [I] WORD : y coordinate
+ * [I] wKey : key flag
+ * [I] pts : mouse coordinate
  *
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_RButtonUp(HWND hwnd, WORD wKey, WORD wPosX,
-                                  WORD wPosY)
+static LRESULT LISTVIEW_RButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(key=%hu,X=%hu,Y=%hu)\n", wKey, pts.x, pts.y);
 
   if (infoPtr->bRButtonDown)
   {
-    POINT pt;
-
-    pt.x = wPosX;
-    pt.y = wPosY;
+    POINT pt = { pts.x, pts.y };
 
     /* set button flag */
     infoPtr->bRButtonDown = FALSE;
 
     /* Change to screen coordinate for WM_CONTEXTMENU */
-    ClientToScreen(hwnd, &pt);
+    ClientToScreen(infoPtr->hwndSelf, &pt);
 
     /* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */
-    SendMessageW( hwnd, WM_CONTEXTMENU, (WPARAM) hwnd, MAKELPARAM(pt.x, pt.y));
+    SendMessageW(infoPtr->hwndSelf, WM_CONTEXTMENU, 
+		 (WPARAM)infoPtr->hwndSelf, MAKELPARAM(pt.x, pt.y));
   }
 
   return 0;
 }
 
+
+/***
+ * DESCRIPTION:
+ * Sets the cursor.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : pointer to listview strucure (not NULL)
+ * [I] hwnd : window handle of window containing the cursor
+ * [I] nHittest : hit-test code
+ * [I] wMouseMsg : ideintifier of the mouse message
+ *
+ * RETURN:
+ * TRUE if cursor is set
+ * FALSE otherwise
+ */
+static BOOL LISTVIEW_SetCursor(LISTVIEW_INFO *infoPtr, HWND hwnd, UINT nHittest, UINT wMouseMsg)
+{
+  POINT pt;
+
+  if(!(infoPtr->dwExStyle & LVS_EX_TRACKSELECT)) return FALSE;
+
+  GetCursorPos(&pt);
+  if (LISTVIEW_MouseSelection(infoPtr, pt) < 0) return FALSE;
+
+  SetCursor(infoPtr->hHotCursor);
+
+  return TRUE;
+}
+
 /***
  * DESCRIPTION:
  * Sets the focus.
@@ -9388,19 +9203,17 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_SetFocus(HWND hwnd, HWND hwndLoseFocus)
+static LRESULT LISTVIEW_SetFocus(LISTVIEW_INFO *infoPtr, HWND hwndLoseFocus)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-
-  TRACE("(hwnd=%x, hwndLoseFocus=%x)\n", hwnd, hwndLoseFocus);
+  TRACE("(hwndLoseFocus=%x)\n", hwndLoseFocus);
 
   /* send NM_SETFOCUS notification */
-  hdr_notify(hwnd, NM_SETFOCUS);
+  hdr_notify(infoPtr, NM_SETFOCUS);
 
   /* set window focus flag */
   infoPtr->bFocus = TRUE;
 
-  UpdateWindow(hwnd);
+  UpdateWindow(infoPtr->hwndSelf);
 
   return 0;
 }
@@ -9417,15 +9230,14 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_SetFont(HWND hwnd, HFONT hFont, WORD fRedraw)
+static LRESULT LISTVIEW_SetFont(LISTVIEW_INFO *infoPtr, HFONT hFont, WORD fRedraw)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  UINT uView = GetWindowLongW(hwnd, GWL_STYLE) & LVS_TYPEMASK;
+  UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
 
-  TRACE("(hwnd=%x,hfont=%x,redraw=%hu)\n", hwnd, hFont, fRedraw);
+  TRACE("(hfont=%x,redraw=%hu)\n", hFont, fRedraw);
 
   infoPtr->hFont = hFont ? hFont : infoPtr->hDefaultFont;
-  LISTVIEW_SaveTextMetrics(hwnd);
+  LISTVIEW_SaveTextMetrics(infoPtr);
 
   if (uView == LVS_REPORT)
   {
@@ -9435,10 +9247,10 @@
   }
 
   /* invalidate listview control client area */
-  InvalidateRect(hwnd, NULL, TRUE);
+  InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
 
   if (fRedraw != FALSE)
-    UpdateWindow(hwnd);
+    UpdateWindow(infoPtr->hwndSelf);
 
   return 0;
 }
@@ -9455,11 +9267,11 @@
  * RETURN:
  * DefWinProc return value
  */
-static LRESULT LISTVIEW_SetRedraw(HWND hwnd, BOOL bRedraw)
+static LRESULT LISTVIEW_SetRedraw(LISTVIEW_INFO *infoPtr, BOOL bRedraw)
 {
-    LRESULT lResult = DefWindowProcW(hwnd, WM_SETREDRAW, bRedraw, 0);
+    LRESULT lResult = DefWindowProcW(infoPtr->hwndSelf, WM_SETREDRAW, bRedraw, 0);
     if(bRedraw)
-        RedrawWindow(hwnd, NULL, 0,
+        RedrawWindow(infoPtr->hwndSelf, NULL, 0,
             RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW);
     return lResult;
 }
@@ -9477,27 +9289,27 @@
  * RETURN:
  * Zero
  */
-static LRESULT LISTVIEW_Size(HWND hwnd, int Width, int Height)
+static LRESULT LISTVIEW_Size(LISTVIEW_INFO *infoPtr, int Width, int Height)
 {
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
 
-  TRACE("(hwnd=%x, width=%d, height=%d)\n", hwnd, Width, Height);
+  TRACE("(width=%d, height=%d)\n", Width, Height);
 
-  if (LISTVIEW_UpdateSize(hwnd))
+  if (LISTVIEW_UpdateSize(infoPtr))
   {
     if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
     {
         if (lStyle & LVS_ALIGNLEFT)
-            LISTVIEW_AlignLeft(hwnd);
+            LISTVIEW_AlignLeft(infoPtr);
         else
-            LISTVIEW_AlignTop(hwnd);
+            LISTVIEW_AlignTop(infoPtr);
     }
 
-    LISTVIEW_UpdateScroll(hwnd);
+    LISTVIEW_UpdateScroll(infoPtr);
 
     /* invalidate client area + erase background */
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
   }
 
   return 0;
@@ -9514,17 +9326,14 @@
  * Zero if no size change
  * 1 of size changed
  */
-static BOOL LISTVIEW_UpdateSize(HWND hwnd)
+static BOOL LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
-  LONG lStyle = GetWindowLongW(hwnd, GWL_STYLE);
+  LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
   UINT uView = lStyle & LVS_TYPEMASK;
   RECT rcList;
   RECT rcOld;
 
-  TRACE("(hwnd=%x)\n", hwnd);
-
-  GetClientRect(hwnd, &rcList);
+  GetClientRect(infoPtr->hwndSelf, &rcList);
   CopyRect(&rcOld,&(infoPtr->rcList));
   infoPtr->rcList.left = 0;
   infoPtr->rcList.right = max(rcList.right - rcList.left, 1);
@@ -9581,16 +9390,15 @@
  * RETURN:
  * Zero
  */
-static INT LISTVIEW_StyleChanged(HWND hwnd, WPARAM wStyleType,
+static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
                                  LPSTYLESTRUCT lpss)
 {
-  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
   UINT uNewView = lpss->styleNew & LVS_TYPEMASK;
   UINT uOldView = lpss->styleOld & LVS_TYPEMASK;
   RECT rcList = infoPtr->rcList;
 
-  TRACE("(hwnd=%x, styletype=%x, styleOld=0x%08lx, styleNew=0x%08lx)\n",
-        hwnd, wStyleType, lpss->styleOld, lpss->styleNew);
+  TRACE("(styletype=%x, styleOld=0x%08lx, styleNew=0x%08lx)\n",
+        wStyleType, lpss->styleOld, lpss->styleNew);
 
   if (wStyleType == GWL_STYLE)
   {
@@ -9599,17 +9407,17 @@
 
     if (((lpss->styleOld & WS_HSCROLL) != 0)&&
         ((lpss->styleNew & WS_HSCROLL) == 0))
-       ShowScrollBar(hwnd, SB_HORZ, FALSE);
+       ShowScrollBar(infoPtr->hwndSelf, SB_HORZ, FALSE);
 
     if (((lpss->styleOld & WS_VSCROLL) != 0)&&
         ((lpss->styleNew & WS_VSCROLL) == 0))
-       ShowScrollBar(hwnd, SB_VERT, FALSE);
+       ShowScrollBar(infoPtr->hwndSelf, SB_VERT, FALSE);
 
     /* If switching modes, then start with no scroll bars and then
      * decide.
      */
     if (uNewView != uOldView)
-	ShowScrollBar(hwnd, SB_BOTH, FALSE);
+	ShowScrollBar(infoPtr->hwndSelf, SB_BOTH, FALSE);
 
     if (uNewView == LVS_ICON)
     {
@@ -9631,16 +9439,16 @@
       {
 	  TRACE("icon old size=(%d,%d), new size=(%ld,%ld)\n",
 		oldcx, oldcy, infoPtr->iconSize.cx, infoPtr->iconSize.cy);
-	  LISTVIEW_SetIconSpacing(hwnd,0);
+	  LISTVIEW_SetIconSpacing(infoPtr,0);
       }
 
       /* Now update the full item width and height */
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(hwnd);
+      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
       if (lpss->styleNew & LVS_ALIGNLEFT)
-        LISTVIEW_AlignLeft(hwnd);
+        LISTVIEW_AlignLeft(infoPtr);
       else
-        LISTVIEW_AlignTop(hwnd);
+        LISTVIEW_AlignTop(infoPtr);
     }
     else if (uNewView == LVS_REPORT)
     {
@@ -9650,43 +9458,43 @@
       hl.prc = &rcList;
       hl.pwpos = &wp;
       Header_Layout(infoPtr->hwndHeader, &hl);
-      SetWindowPos(infoPtr->hwndHeader, hwnd, wp.x, wp.y, wp.cx, wp.cy,
+      SetWindowPos(infoPtr->hwndHeader, infoPtr->hwndSelf, wp.x, wp.y, wp.cx, wp.cy,
                    wp.flags);
       if (!(LVS_NOCOLUMNHEADER & lpss->styleNew))
         ShowWindow(infoPtr->hwndHeader, SW_SHOWNORMAL);
 
       infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
       infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(hwnd);
+      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
     }
     else if (uNewView == LVS_LIST)
     {
       infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
       infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(hwnd);
+      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
     }
     else
     {
       infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
       infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
-      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
-      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(hwnd);
+      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
+      infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
       if (lpss->styleNew & LVS_ALIGNLEFT)
-        LISTVIEW_AlignLeft(hwnd);
+        LISTVIEW_AlignLeft(infoPtr);
       else
-        LISTVIEW_AlignTop(hwnd);
+        LISTVIEW_AlignTop(infoPtr);
     }
 
     /* update the size of the client area */
-    LISTVIEW_UpdateSize(hwnd);
+    LISTVIEW_UpdateSize(infoPtr);
 
     /* add scrollbars if needed */
-    LISTVIEW_UpdateScroll(hwnd);
+    LISTVIEW_UpdateScroll(infoPtr);
 
     /* invalidate client area + erase background */
-    InvalidateRect(hwnd, NULL, TRUE);
+    InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
 
     /* print the list of unsupported window styles */
     LISTVIEW_UnsupportedStyles(lpss->styleNew);
@@ -9711,365 +9519,434 @@
  * Window procedure of the listview control.
  *
  */
-static LRESULT WINAPI LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
-                                   LPARAM lParam)
+static LRESULT WINAPI 
+LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-  TRACE("(hwnd=%x uMsg=%x wParam=%x lParam=%lx)\n", hwnd, uMsg, wParam, lParam);
-  if (!GetWindowLongW(hwnd, 0) && (uMsg != WM_NCCREATE))
-    return DefWindowProcW( hwnd, uMsg, wParam, lParam );
+  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
+	  
+  TRACE("( uMsg=%x wParam=%x lParam=%lx)\n", uMsg, wParam, lParam);
+  
+  if (!infoPtr && (uMsg != WM_NCCREATE))
+    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+  
   switch (uMsg)
   {
   case LVM_APPROXIMATEVIEWRECT:
-    return LISTVIEW_ApproximateViewRect(hwnd, (INT)wParam,
+    return LISTVIEW_ApproximateViewRect(infoPtr, (INT)wParam,
                                         LOWORD(lParam), HIWORD(lParam));
   case LVM_ARRANGE:
-    return LISTVIEW_Arrange(hwnd, (INT)wParam);
+    return LISTVIEW_Arrange(infoPtr, (INT)wParam);
 
+/* case LVN_CANCELEDITLABEL */
+    
 /* case LVM_CREATEDRAGIMAGE: */
 
   case LVM_DELETEALLITEMS:
-    return LISTVIEW_DeleteAllItems(hwnd);
+    return LISTVIEW_DeleteAllItems(infoPtr);
 
   case LVM_DELETECOLUMN:
-    return LISTVIEW_DeleteColumn(hwnd, (INT)wParam);
+    return LISTVIEW_DeleteColumn(infoPtr, (INT)wParam);
 
   case LVM_DELETEITEM:
-    return LISTVIEW_DeleteItem(hwnd, (INT)wParam);
+    return LISTVIEW_DeleteItem(infoPtr, (INT)wParam);
 
   case LVM_EDITLABELW:
-    return (LRESULT)LISTVIEW_EditLabelT(hwnd, (INT)wParam, TRUE);
+    return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam, TRUE);
 
   case LVM_EDITLABELA:
-    return (LRESULT)LISTVIEW_EditLabelT(hwnd, (INT)wParam, FALSE);
+    return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam, FALSE);
 
+  /* case LVN_ENABLEGROUPVIEW: */
+    
   case LVM_ENSUREVISIBLE:
-    return LISTVIEW_EnsureVisible(hwnd, (INT)wParam, (BOOL)lParam);
+    return LISTVIEW_EnsureVisible(infoPtr, (INT)wParam, (BOOL)lParam);
 
   case LVM_FINDITEMW:
-    return LISTVIEW_FindItemW(hwnd, (INT)wParam, (LPLVFINDINFOW)lParam);
+    return LISTVIEW_FindItemW(infoPtr, (INT)wParam, (LPLVFINDINFOW)lParam);
 
   case LVM_FINDITEMA:
-    return LISTVIEW_FindItemA(hwnd, (INT)wParam, (LPLVFINDINFOA)lParam);
+    return LISTVIEW_FindItemA(infoPtr, (INT)wParam, (LPLVFINDINFOA)lParam);
 
   case LVM_GETBKCOLOR:
-    return LISTVIEW_GetBkColor(hwnd);
+    return LISTVIEW_GetBkColor(infoPtr);
 
-/*	case LVM_GETBKIMAGE: */
+  /* case LVM_GETBKIMAGE: */
 
   case LVM_GETCALLBACKMASK:
-    return LISTVIEW_GetCallbackMask(hwnd);
+    return LISTVIEW_GetCallbackMask(infoPtr);
 
   case LVM_GETCOLUMNA:
-    return LISTVIEW_GetColumnT(hwnd, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
+    return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
 
   case LVM_GETCOLUMNW:
-    return LISTVIEW_GetColumnT(hwnd, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+    return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
 
   case LVM_GETCOLUMNORDERARRAY:
-    return LISTVIEW_GetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
+    return LISTVIEW_GetColumnOrderArray(infoPtr, (INT)wParam, (LPINT)lParam);
 
   case LVM_GETCOLUMNWIDTH:
-    return LISTVIEW_GetColumnWidth(hwnd, (INT)wParam);
+    return LISTVIEW_GetColumnWidth(infoPtr, (INT)wParam);
 
   case LVM_GETCOUNTPERPAGE:
-    return LISTVIEW_GetCountPerPage(hwnd);
+    return LISTVIEW_GetCountPerPage(infoPtr);
 
   case LVM_GETEDITCONTROL:
-    return LISTVIEW_GetEditControl(hwnd);
+    return LISTVIEW_GetEditControl(infoPtr);
 
   case LVM_GETEXTENDEDLISTVIEWSTYLE:
-    return LISTVIEW_GetExtendedListViewStyle(hwnd);
+    return LISTVIEW_GetExtendedListViewStyle(infoPtr);
 
   case LVM_GETHEADER:
-    return LISTVIEW_GetHeader(hwnd);
+    return LISTVIEW_GetHeader(infoPtr);
 
   case LVM_GETHOTCURSOR:
-    FIXME("LVM_GETHOTCURSOR: unimplemented\n");
-    return FALSE;
+    return infoPtr->hHotCursor;
 
   case LVM_GETHOTITEM:
-    return LISTVIEW_GetHotItem(hwnd);
+    return LISTVIEW_GetHotItem(infoPtr);
 
   case LVM_GETHOVERTIME:
-    return LISTVIEW_GetHoverTime(hwnd);
+    return LISTVIEW_GetHoverTime(infoPtr);
 
   case LVM_GETIMAGELIST:
-    return LISTVIEW_GetImageList(hwnd, (INT)wParam);
+    return LISTVIEW_GetImageList(infoPtr, (INT)wParam);
 
+  /* case LVN_GETINSERTMARK: */
+    
+  /* case LVN_GETINSERTMARKCOLOR: */
+    
+  /* case LVN_GETINSERTMARKRECT: */
+    
   case LVM_GETISEARCHSTRINGA:
   case LVM_GETISEARCHSTRINGW:
     FIXME("LVM_GETISEARCHSTRING: unimplemented\n");
     return FALSE;
 
   case LVM_GETITEMA:
-    return LISTVIEW_GetItemT(hwnd, (LPLVITEMW)lParam, FALSE, FALSE);
+    return LISTVIEW_GetItemT(infoPtr, (LPLVITEMW)lParam, FALSE, FALSE);
 
   case LVM_GETITEMW:
-    return LISTVIEW_GetItemT(hwnd, (LPLVITEMW)lParam, FALSE, TRUE);
+    return LISTVIEW_GetItemT(infoPtr, (LPLVITEMW)lParam, FALSE, TRUE);
 
   case LVM_GETITEMCOUNT:
-    return LISTVIEW_GetItemCount(hwnd);
+    return LISTVIEW_GetItemCount(infoPtr);
 
   case LVM_GETITEMPOSITION:
-    return LISTVIEW_GetItemPosition(hwnd, (INT)wParam, (LPPOINT)lParam);
+    return LISTVIEW_GetItemPosition(infoPtr, (INT)wParam, (LPPOINT)lParam);
 
   case LVM_GETITEMRECT:
-    return LISTVIEW_GetItemRect(hwnd, (INT)wParam, (LPRECT)lParam);
+    return LISTVIEW_GetItemRect(infoPtr, (INT)wParam, (LPRECT)lParam);
 
   case LVM_GETITEMSPACING:
-    return LISTVIEW_GetItemSpacing(hwnd, (BOOL)wParam);
+    return LISTVIEW_GetItemSpacing(infoPtr, (BOOL)wParam);
 
   case LVM_GETITEMSTATE:
-    return LISTVIEW_GetItemState(hwnd, (INT)wParam, (UINT)lParam);
+    return LISTVIEW_GetItemState(infoPtr, (INT)wParam, (UINT)lParam);
 
   case LVM_GETITEMTEXTA:
-    return LISTVIEW_GetItemTextT(hwnd, (INT)wParam, (LPLVITEMW)lParam, FALSE);
+    return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, FALSE);
 
   case LVM_GETITEMTEXTW:
-    return LISTVIEW_GetItemTextT(hwnd, (INT)wParam, (LPLVITEMW)lParam, TRUE);
+    return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, TRUE);
 
   case LVM_GETNEXTITEM:
-    return LISTVIEW_GetNextItem(hwnd, (INT)wParam, LOWORD(lParam));
+    return LISTVIEW_GetNextItem(infoPtr, (INT)wParam, LOWORD(lParam));
 
   case LVM_GETNUMBEROFWORKAREAS:
     FIXME("LVM_GETNUMBEROFWORKAREAS: unimplemented\n");
     return 1;
 
   case LVM_GETORIGIN:
-    return LISTVIEW_GetOrigin(hwnd, (LPPOINT)lParam);
+    return LISTVIEW_GetOrigin(infoPtr, (LPPOINT)lParam);
 
+  /* case LVN_GETOUTLINECOLOR: */
+    
+  /* case LVM_GETSELECTEDCOLUMN: */
+    
   case LVM_GETSELECTEDCOUNT:
-    return LISTVIEW_GetSelectedCount(hwnd);
+    return LISTVIEW_GetSelectedCount(infoPtr);
 
   case LVM_GETSELECTIONMARK:
-    return LISTVIEW_GetSelectionMark(hwnd);
+    return LISTVIEW_GetSelectionMark(infoPtr);
 
   case LVM_GETSTRINGWIDTHA:
-    return LISTVIEW_GetStringWidthT(hwnd, (LPCWSTR)lParam, FALSE);
+    return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam, FALSE);
 
   case LVM_GETSTRINGWIDTHW:
-    return LISTVIEW_GetStringWidthT(hwnd, (LPCWSTR)lParam, TRUE);
+    return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam, TRUE);
 
   case LVM_GETSUBITEMRECT:
-    return LISTVIEW_GetSubItemRect(hwnd, (UINT)wParam, ((LPRECT)lParam)->top,
+    return LISTVIEW_GetSubItemRect(infoPtr, (UINT)wParam, ((LPRECT)lParam)->top,
                                    ((LPRECT)lParam)->left, (LPRECT)lParam);
 
   case LVM_GETTEXTBKCOLOR:
-    return LISTVIEW_GetTextBkColor(hwnd);
+    return LISTVIEW_GetTextBkColor(infoPtr);
 
   case LVM_GETTEXTCOLOR:
-    return LISTVIEW_GetTextColor(hwnd);
+    return LISTVIEW_GetTextColor(infoPtr);
 
+  /* case LVN_GETTILEINFO: */
+    
+  /* case LVN_GETTILEVIEWINFO: */
+    
   case LVM_GETTOOLTIPS:
     FIXME("LVM_GETTOOLTIPS: unimplemented\n");
     return FALSE;
 
   case LVM_GETTOPINDEX:
-    return LISTVIEW_GetTopIndex(hwnd);
+    return LISTVIEW_GetTopIndex(infoPtr);
 
   /*case LVM_GETUNICODEFORMAT:
     FIXME("LVM_GETUNICODEFORMAT: unimplemented\n");
     return FALSE;*/
 
   case LVM_GETVIEWRECT:
-    return LISTVIEW_GetViewRect(hwnd, (LPRECT)lParam);
+    return LISTVIEW_GetViewRect(infoPtr, (LPRECT)lParam);
 
   case LVM_GETWORKAREAS:
     FIXME("LVM_GETWORKAREAS: unimplemented\n");
     return FALSE;
 
+  /* case LVN_HASGROUP: */
+    
   case LVM_HITTEST:
-    return LISTVIEW_HitTest(hwnd, (LPLVHITTESTINFO)lParam);
+    return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam);
 
   case LVM_INSERTCOLUMNA:
-    return LISTVIEW_InsertColumnT(hwnd, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
+    return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
 
   case LVM_INSERTCOLUMNW:
-    return LISTVIEW_InsertColumnT(hwnd, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+    return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
 
+  /* case LVN_INSERTGROUP: */
+    
+  /* case LVN_INSERTGROUPSORTED: */
+    
   case LVM_INSERTITEMA:
-    return LISTVIEW_InsertItemT(hwnd, (LPLVITEMW)lParam, FALSE);
+    return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, FALSE);
 
   case LVM_INSERTITEMW:
-    return LISTVIEW_InsertItemT(hwnd, (LPLVITEMW)lParam, TRUE);
+    return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, TRUE);
+
+  /* case LVN_INSERTMARKHITTEST: */
+
+  /* case LVN_ISGROUPVIEWENABLED: */
+
+  /* case LVN_MAPIDTOINDEX: */
+
+  /* case LVN_INEDXTOID: */
+
+  /* case LVN_MOVEGROUP: */
+
+  /* case LVN_MOVEITEMTOGROUP: */
 
   case LVM_REDRAWITEMS:
-    return LISTVIEW_RedrawItems(hwnd, (INT)wParam, (INT)lParam);
+    return LISTVIEW_RedrawItems(infoPtr, (INT)wParam, (INT)lParam);
+
+  /* case LVN_REMOVEALLGROUPS: */
+    
+  /* case LVN_REMOVEGROUP: */
 
   case LVM_SCROLL:
-    return LISTVIEW_Scroll(hwnd, (INT)wParam, (INT)lParam);
+    return LISTVIEW_Scroll(infoPtr, (INT)wParam, (INT)lParam);
 
   case LVM_SETBKCOLOR:
-    return LISTVIEW_SetBkColor(hwnd, (COLORREF)lParam);
+    return LISTVIEW_SetBkColor(infoPtr, (COLORREF)lParam);
 
-/*	case LVM_SETBKIMAGE: */
+  /* case LVM_SETBKIMAGE: */
 
   case LVM_SETCALLBACKMASK:
-    return LISTVIEW_SetCallbackMask(hwnd, (UINT)wParam);
+    return LISTVIEW_SetCallbackMask(infoPtr, (UINT)wParam);
 
   case LVM_SETCOLUMNA:
-    return LISTVIEW_SetColumnT(hwnd, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
+    return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
 
   case LVM_SETCOLUMNW:
-    return LISTVIEW_SetColumnT(hwnd, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+    return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
 
   case LVM_SETCOLUMNORDERARRAY:
-    return LISTVIEW_SetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
+    return LISTVIEW_SetColumnOrderArray(infoPtr, (INT)wParam, (LPINT)lParam);
 
   case LVM_SETCOLUMNWIDTH:
-    return LISTVIEW_SetColumnWidth(hwnd, (INT)wParam, SLOWORD(lParam));
+    return LISTVIEW_SetColumnWidth(infoPtr, (INT)wParam, SLOWORD(lParam));
 
   case LVM_SETEXTENDEDLISTVIEWSTYLE:
-    return LISTVIEW_SetExtendedListViewStyle(hwnd, (DWORD)wParam, (DWORD)lParam);
+    return LISTVIEW_SetExtendedListViewStyle(infoPtr, (DWORD)wParam, (DWORD)lParam);
 
-/*	case LVM_SETHOTCURSOR: */
+  /* case LVN_SETGROUPINFO: */
+    
+  /* case LVN_SETGROUPMETRICS: */
+    
+  case LVM_SETHOTCURSOR:
+    return LISTVIEW_SetHotCursor(infoPtr, (HCURSOR)lParam);
 
   case LVM_SETHOTITEM:
-    return LISTVIEW_SetHotItem(hwnd, (INT)wParam);
+    return LISTVIEW_SetHotItem(infoPtr, (INT)wParam);
 
   case LVM_SETHOVERTIME:
-    return LISTVIEW_SetHoverTime(hwnd, (DWORD)wParam);
+    return LISTVIEW_SetHoverTime(infoPtr, (DWORD)wParam);
 
   case LVM_SETICONSPACING:
-    return LISTVIEW_SetIconSpacing(hwnd, (DWORD)lParam);
+    return LISTVIEW_SetIconSpacing(infoPtr, (DWORD)lParam);
 
   case LVM_SETIMAGELIST:
-    return (LRESULT)LISTVIEW_SetImageList(hwnd, (INT)wParam, (HIMAGELIST)lParam);
+    return (LRESULT)LISTVIEW_SetImageList(infoPtr, (INT)wParam, (HIMAGELIST)lParam);
+
+  /* case LVN_SETINFOTIP: */
+
+  /* case LVN_SETINSERTMARK: */
+    
+  /* case LVN_SETINSERTMARKCOLOR: */
 
   case LVM_SETITEMA:
-    return LISTVIEW_SetItemT(hwnd, (LPLVITEMW)lParam, FALSE);
+    return LISTVIEW_SetItemT(infoPtr, (LPLVITEMW)lParam, FALSE);
 
   case LVM_SETITEMW:
-    return LISTVIEW_SetItemT(hwnd, (LPLVITEMW)lParam, TRUE);
+    return LISTVIEW_SetItemT(infoPtr, (LPLVITEMW)lParam, TRUE);
 
   case LVM_SETITEMCOUNT:
-    return LISTVIEW_SetItemCount(hwnd, (INT)wParam, (DWORD)lParam);
+    return LISTVIEW_SetItemCount(infoPtr, (INT)wParam, (DWORD)lParam);
 
   case LVM_SETITEMPOSITION:
-    return LISTVIEW_SetItemPosition(hwnd, (INT)wParam, (INT)LOWORD(lParam),
+    return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, (INT)LOWORD(lParam),
                                     (INT)HIWORD(lParam));
 
   case LVM_SETITEMPOSITION32:
-    return LISTVIEW_SetItemPosition(hwnd, (INT)wParam, ((POINT*)lParam)->x,
+    return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, ((POINT*)lParam)->x,
 				    ((POINT*)lParam)->y);
 
   case LVM_SETITEMSTATE:
-    return LISTVIEW_SetItemState(hwnd, (INT)wParam, (LPLVITEMW)lParam);
+    return LISTVIEW_SetItemState(infoPtr, (INT)wParam, (LPLVITEMW)lParam);
 
   case LVM_SETITEMTEXTA:
-    return LISTVIEW_SetItemTextT(hwnd, (INT)wParam, (LPLVITEMW)lParam, FALSE);
+    return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, FALSE);
 
   case LVM_SETITEMTEXTW:
-    return LISTVIEW_SetItemTextT(hwnd, (INT)wParam, (LPLVITEMW)lParam, TRUE);
+    return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, TRUE);
+
+  /* case LVN_SETOUTLINECOLOR: */
 
+  /* case LVN_SETSELECTEDCOLUMN: */
+    
   case LVM_SETSELECTIONMARK:
-    return LISTVIEW_SetSelectionMark(hwnd, (INT)lParam);
+    return LISTVIEW_SetSelectionMark(infoPtr, (INT)lParam);
 
   case LVM_SETTEXTBKCOLOR:
-    return LISTVIEW_SetTextBkColor(hwnd, (COLORREF)lParam);
+    return LISTVIEW_SetTextBkColor(infoPtr, (COLORREF)lParam);
 
   case LVM_SETTEXTCOLOR:
-    return LISTVIEW_SetTextColor(hwnd, (COLORREF)lParam);
+    return LISTVIEW_SetTextColor(infoPtr, (COLORREF)lParam);
 
-/*	case LVM_SETTOOLTIPS: */
-/*	case LVM_SETUNICODEFORMAT: */
-/*	case LVM_SETWORKAREAS: */
+  /* case LVN_SETTILEINFO: */
+    
+  /* case LVN_SETTILEVIEWINFO: */
+    
+  /* case LVN_SETTILEWIDTH: */
+
+  /* case LVM_SETTOOLTIPS: */
+    
+  /* case LVM_SETUNICODEFORMAT: */
+    
+  /* case LVN_SETVIEW: */
+    
+  /* case LVM_SETWORKAREAS: */
 
+  /* case LVN_SORTGROUPS: */
+    
   case LVM_SORTITEMS:
-    return LISTVIEW_SortItems(hwnd, (PFNLVCOMPARE)lParam, (LPARAM)wParam);
+    return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam);
 
   case LVM_SUBITEMHITTEST:
-    return LISTVIEW_SubItemHitTest(hwnd, (LPLVHITTESTINFO)lParam);
+    return LISTVIEW_SubItemHitTest(infoPtr, (LPLVHITTESTINFO)lParam);
 
   case LVM_UPDATE:
-    return LISTVIEW_Update(hwnd, (INT)wParam);
+    return LISTVIEW_Update(infoPtr, (INT)wParam);
 
   case WM_CHAR:
-    return LISTVIEW_ProcessLetterKeys( hwnd, wParam, lParam );
+    return LISTVIEW_ProcessLetterKeys( infoPtr, wParam, lParam );
 
   case WM_COMMAND:
-    return LISTVIEW_Command(hwnd, wParam, lParam);
+    return LISTVIEW_Command(infoPtr, wParam, lParam);
 
   case WM_CREATE:
-    return LISTVIEW_Create(hwnd, (LPCREATESTRUCTW)lParam);
+    return LISTVIEW_Create(hwnd, (LPCREATESTRUCTW)lParam); //FIXME
 
   case WM_ERASEBKGND:
-    return LISTVIEW_EraseBackground(hwnd, wParam, lParam);
+    return LISTVIEW_EraseBackground(infoPtr, wParam, lParam);
 
   case WM_GETDLGCODE:
     return DLGC_WANTCHARS | DLGC_WANTARROWS;
 
   case WM_GETFONT:
-    return LISTVIEW_GetFont(hwnd);
+    return LISTVIEW_GetFont(infoPtr);
 
   case WM_HSCROLL:
     if (SLOWORD(wParam) < 0) return 0; /* validate not internal codes */
-    return LISTVIEW_HScroll(hwnd, (INT)LOWORD(wParam),
+    return LISTVIEW_HScroll(infoPtr, (INT)LOWORD(wParam),
                             (INT)HIWORD(wParam), (HWND)lParam);
 
   case WM_KEYDOWN:
-    return LISTVIEW_KeyDown(hwnd, (INT)wParam, (LONG)lParam);
+    return LISTVIEW_KeyDown(infoPtr, (INT)wParam, (LONG)lParam);
 
   case WM_KILLFOCUS:
-    return LISTVIEW_KillFocus(hwnd);
+    return LISTVIEW_KillFocus(infoPtr);
 
   case WM_LBUTTONDBLCLK:
-    return LISTVIEW_LButtonDblClk(hwnd, (WORD)wParam, LOWORD(lParam),
-                                HIWORD(lParam));
+    return LISTVIEW_LButtonDblClk(infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
 
   case WM_LBUTTONDOWN:
-    return LISTVIEW_LButtonDown(hwnd, (WORD)wParam, LOWORD(lParam),
-                                HIWORD(lParam));
+    return LISTVIEW_LButtonDown(infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
+		    
   case WM_LBUTTONUP:
-    return LISTVIEW_LButtonUp(hwnd, (WORD)wParam, LOWORD(lParam),
-                              HIWORD(lParam));
+    return LISTVIEW_LButtonUp(infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
+    
   case WM_MOUSEMOVE:
-    return LISTVIEW_MouseMove (hwnd, wParam, lParam);
+    return LISTVIEW_MouseMove (infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
 
   case WM_MOUSEHOVER:
-    return LISTVIEW_MouseHover(hwnd, wParam, lParam);
+    return LISTVIEW_MouseHover(infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
 
   case WM_NCCREATE:
     return LISTVIEW_NCCreate(hwnd, wParam, lParam);
 
   case WM_NCDESTROY:
-    return LISTVIEW_NCDestroy(hwnd);
+    return LISTVIEW_NCDestroy(infoPtr);
 
   case WM_NOTIFY:
-    return LISTVIEW_Notify(hwnd, (INT)wParam, (LPNMHDR)lParam);
+    return LISTVIEW_Notify(infoPtr, (INT)wParam, (LPNMHDR)lParam);
 
   case WM_NOTIFYFORMAT:
-    return LISTVIEW_NotifyFormat(hwnd, (HWND)wParam, (INT)lParam);
+    return LISTVIEW_NotifyFormat(infoPtr, (HWND)wParam, (INT)lParam);
 
   case WM_PAINT:
-    return LISTVIEW_Paint(hwnd, (HDC)wParam);
+    return LISTVIEW_Paint(infoPtr, (HDC)wParam);
 
   case WM_RBUTTONDBLCLK:
-    return LISTVIEW_RButtonDblClk(hwnd, (WORD)wParam, LOWORD(lParam),
-                                  HIWORD(lParam));
+    return LISTVIEW_RButtonDblClk(infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
 
   case WM_RBUTTONDOWN:
-    return LISTVIEW_RButtonDown(hwnd, (WORD)wParam, LOWORD(lParam),
-                                HIWORD(lParam));
+    return LISTVIEW_RButtonDown(infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
 
   case WM_RBUTTONUP:
-    return LISTVIEW_RButtonUp(hwnd, (WORD)wParam, LOWORD(lParam),
-                              HIWORD(lParam));
+    return LISTVIEW_RButtonUp(infoPtr, (WORD)wParam, MAKEPOINTS(lParam));
 
+  case WM_SETCURSOR:
+    return LISTVIEW_SetCursor(infoPtr, (HWND)wParam, LOWORD(lParam), HIWORD(lParam));
+    
   case WM_SETFOCUS:
-    return LISTVIEW_SetFocus(hwnd, (HWND)wParam);
+    return LISTVIEW_SetFocus(infoPtr, (HWND)wParam);
 
   case WM_SETFONT:
-    return LISTVIEW_SetFont(hwnd, (HFONT)wParam, (WORD)lParam);
+    return LISTVIEW_SetFont(infoPtr, (HFONT)wParam, (WORD)lParam);
 
   case WM_SETREDRAW:
-    return LISTVIEW_SetRedraw(hwnd, (BOOL)wParam);
+    return LISTVIEW_SetRedraw(infoPtr, (BOOL)wParam);
 
   case WM_SIZE:
-    return LISTVIEW_Size(hwnd, (int)SLOWORD(lParam), (int)SHIWORD(lParam));
+    return LISTVIEW_Size(infoPtr, (int)SLOWORD(lParam), (int)SHIWORD(lParam));
 
   case WM_STYLECHANGED:
-    return LISTVIEW_StyleChanged(hwnd, wParam, (LPSTYLESTRUCT)lParam);
+    return LISTVIEW_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
 
   case WM_SYSCOLORCHANGE:
     COMCTL32_RefreshSysColors();
@@ -10079,20 +9956,20 @@
 
   case WM_VSCROLL:
     if (SLOWORD(wParam) < 0) return 0; /* validate not internal codes */
-    return LISTVIEW_VScroll(hwnd, (INT)LOWORD(wParam),
+    return LISTVIEW_VScroll(infoPtr, (INT)LOWORD(wParam),
                             (INT)HIWORD(wParam), (HWND)lParam);
 
   case WM_MOUSEWHEEL:
       if (wParam & (MK_SHIFT | MK_CONTROL))
-          return DefWindowProcW( hwnd, uMsg, wParam, lParam );
-      return LISTVIEW_MouseWheel(hwnd, (short int)HIWORD(wParam));
+          return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+      return LISTVIEW_MouseWheel(infoPtr, (short int)HIWORD(wParam));
 
   case WM_WINDOWPOSCHANGED:
       if (!(((WINDOWPOS *)lParam)->flags & SWP_NOSIZE)) {
-	  SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE |
+	  SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE |
 		       SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
-	  LISTVIEW_UpdateSize(hwnd);
-	  LISTVIEW_UpdateScroll(hwnd);
+	  LISTVIEW_UpdateSize(infoPtr);
+	  LISTVIEW_UpdateScroll(infoPtr);
       }
       return DefWindowProcW(hwnd, uMsg, wParam, lParam);
 
@@ -10100,10 +9977,7 @@
 
   default:
     if ((uMsg >= WM_USER) && (uMsg < WM_APP))
-    {
-      ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam,
-          lParam);
-    }
+      ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, lParam);
 
     /* call default window procedure */
     return DefWindowProcW(hwnd, uMsg, wParam, lParam);
@@ -10160,7 +10034,7 @@
  *
  * RETURN:
  */
-static LRESULT LISTVIEW_Command(HWND hwnd, WPARAM wParam, LPARAM lParam)
+static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
     switch (HIWORD(wParam))
     {
@@ -10170,7 +10044,6 @@
 	     * Adjust the edit window size
 	     */
 	    WCHAR buffer[1024];
-	    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(hwnd, 0);
 	    HDC           hdc      = GetDC(infoPtr->hwndEdit);
             HFONT         hFont, hOldFont = 0;
 	    RECT	  rect;
@@ -10207,13 +10080,13 @@
             if(hFont != 0)
                 SelectObject(hdc, hOldFont);
 
-	    ReleaseDC(hwnd, hdc);
+	    ReleaseDC(infoPtr->hwndSelf, hdc);
 
 	    break;
 	}
 
 	default:
-	  return SendMessageW (GetParent (hwnd), WM_COMMAND, wParam, lParam);
+	  return SendMessageW (GetParent (infoPtr->hwndSelf), WM_COMMAND, wParam, lParam);
     }
 
     return 0;
@@ -10232,7 +10105,6 @@
 	WPARAM wParam, LPARAM lParam, BOOL isW)
 {
     LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(GetParent(hwnd), 0);
-    EDITLABEL_ITEM *einfo = infoPtr->pedititem;
     static BOOL bIgnoreKillFocus = FALSE;
     BOOL cancel = FALSE;
 
@@ -10250,10 +10122,9 @@
 
 	case WM_DESTROY:
 	{
-	    WNDPROC editProc = einfo->EditWndProc;
+	    WNDPROC editProc = infoPtr->pedititem.EditWndProc;
+	    infoPtr->pedititem.EditWndProc = 0;
 	    SetWindowLongW(hwnd, GWL_WNDPROC, (LONG)editProc);
-	    COMCTL32_Free(einfo);
-	    infoPtr->pedititem = NULL;
 	    return CallWindowProcT(editProc, hwnd, uMsg, wParam, lParam, isW);
 	}
 
@@ -10267,10 +10138,10 @@
 		break;
 
 	default:
-	    return CallWindowProcT(einfo->EditWndProc, hwnd, uMsg, wParam, lParam, isW);
+	    return CallWindowProcT(infoPtr->pedititem.EditWndProc, hwnd, uMsg, wParam, lParam, isW);
     }
 
-    if (einfo->EditLblCb)
+    if (infoPtr->pedititem.bEditLblCb)
     {
 	LPWSTR buffer = NULL;
 
@@ -10290,11 +10161,11 @@
         /* Processing LVN_ENDLABELEDIT message could kill the focus       */
         /* eg. Using a messagebox                                         */
         bIgnoreKillFocus = TRUE;
-	einfo->EditLblCb(GetParent(hwnd), buffer, einfo->param);
+	LISTVIEW_EndEditLabelT(infoPtr, buffer, infoPtr->pedititem.nEditItem, isW);
 
 	if (buffer) COMCTL32_Free(buffer);
 
-	einfo->EditLblCb = NULL;
+	infoPtr->pedititem.bEditLblCb = FALSE;
         bIgnoreKillFocus = FALSE;
     }
 
@@ -10336,25 +10207,21 @@
  *
  * RETURN:
  */
-HWND CreateEditLabelT(LPCWSTR text, DWORD style, INT x, INT y,
-	INT width, INT height, HWND parent, HINSTANCE hinst,
-	EditlblCallbackW EditLblCb, DWORD param, BOOL isW)
+static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style,
+	INT x, INT y, INT width, INT height, INT nItem, BOOL isW)
 {
-    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongW(parent, 0);
     WCHAR editName[5] = { 'E', 'd', 'i', 't', '\0' };
     HWND hedit;
     SIZE sz;
     HDC hdc;
     HDC hOldFont=0;
     TEXTMETRICW textMetric;
+    HINSTANCE hinst = GetWindowLongW(infoPtr->hwndSelf, GWL_HINSTANCE);
 
     TRACE("(text=%s, ..., isW=%d)\n", debugstr_t(text, isW), isW);
 
-    if (NULL == (infoPtr->pedititem = COMCTL32_Alloc(sizeof(EDITLABEL_ITEM))))
-	return 0;
-
     style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|WS_BORDER;
-    hdc = GetDC(parent);
+    hdc = GetDC(infoPtr->hwndSelf);
 
     /* Select the font to get appropriate metric dimensions */
     if(infoPtr->hFont != 0)
@@ -10370,21 +10237,17 @@
     if(infoPtr->hFont != 0)
         SelectObject(hdc, hOldFont);
 
-    ReleaseDC(parent, hdc);
+    ReleaseDC(infoPtr->hwndSelf, hdc);
     if (isW)
-	hedit = CreateWindowW(editName, text, style, x, y, sz.cx, height, parent, 0, hinst, 0);
+	hedit = CreateWindowW(editName, text, style, x, y, sz.cx, height, infoPtr->hwndSelf, 0, hinst, 0);
     else
-	hedit = CreateWindowA("Edit", (LPCSTR)text, style, x, y, sz.cx, height, parent, 0, hinst, 0);
+	hedit = CreateWindowA("Edit", (LPCSTR)text, style, x, y, sz.cx, height, infoPtr->hwndSelf, 0, hinst, 0);
 
-    if (!hedit)
-    {
-	COMCTL32_Free(infoPtr->pedititem);
-	return 0;
-    }
+    if (!hedit) return 0;
 
-    infoPtr->pedititem->param = param;
-    infoPtr->pedititem->EditLblCb = EditLblCb;
-    infoPtr->pedititem->EditWndProc = (WNDPROC)
+    infoPtr->pedititem.nEditItem = nItem;
+    infoPtr->pedititem.bEditLblCb = TRUE;
+    infoPtr->pedititem.EditWndProc = (WNDPROC)
 	(isW ? SetWindowLongW(hedit, GWL_WNDPROC, (LONG)EditLblWndProcW) :
                SetWindowLongA(hedit, GWL_WNDPROC, (LONG)EditLblWndProcA) );
 




More information about the wine-patches mailing list