comctl32: listview: make LVM_GETCOLUMNWIDTH query the header control instead of using cached data (fixes bug #6805)

Mikołaj Zalewski mikolaj at zalewski.pl
Sun Jun 3 17:29:16 CDT 2007


-------------- next part --------------
From 0301716133fff5496068884acc231cfbb4724d2e Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Miko=C5=82aj_Zalewski?= <mikolaj at zalewski.pl>
Date: Mon, 4 Jun 2007 00:26:46 +0200
Subject: [PATCH] comctl32: listview: make LVM_GETCOLUMNWIDTH query the header control

---
 dlls/comctl32/listview.c |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 38f9c18..ba94aec 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -5147,7 +5147,7 @@ static BOOL LISTVIEW_GetColumnOrderArray(const LISTVIEW_INFO *infoPtr, INT iCoun
 static INT LISTVIEW_GetColumnWidth(const LISTVIEW_INFO *infoPtr, INT nColumn)
 {
     INT nColumnWidth = 0;
-    RECT rcHeader;
+    HDITEMW hdItem;
 
     TRACE("nColumn=%d\n", nColumn);
 
@@ -5158,9 +5158,19 @@ static INT LISTVIEW_GetColumnWidth(const LISTVIEW_INFO *infoPtr, INT nColumn)
 	nColumnWidth = infoPtr->nItemWidth;
 	break;
     case LVS_REPORT:
-	if (nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return 0;
-	LISTVIEW_GetHeaderRect(infoPtr, nColumn, &rcHeader);
-	nColumnWidth = rcHeader.right - rcHeader.left;
+	/* We are not using LISTVIEW_GetHeaderRect as this data is updated only after a HDM_ITEMCHANGED.
+	 * There is an application that subclasses the listview, calls LVM_GETCOLUMNWIDTH in the
+	 * HDM_ITEMCHANGED handler and goes into infinite recursion if it receives old data.
+	 *
+	 * TODO: should we do the same in LVM_GETCOLUMN?
+	 */
+	hdItem.mask = HDI_WIDTH;
+	if (!SendMessageW(infoPtr->hwndHeader, HDM_GETITEMW, nColumn, (LPARAM)&hdItem))
+	{
+	    WARN("(%p): HDM_GETITEMW failed for item %d\n", infoPtr->hwndSelf, nColumn);
+	    return 0;
+	}
+	nColumnWidth = hdItem.cxy;
 	break;
     }
 
-- 
1.4.4.2


More information about the wine-patches mailing list