Module: wine Branch: master Commit: a1b55be6935a6a3b44fff69eed6dfdee53d217f7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a1b55be6935a6a3b44fff69eed...
Author: Mikołaj Zalewski mikolaj@zalewski.pl Date: Mon Jun 4 00:26:46 2007 +0200
comctl32: listview: Make LVM_GETCOLUMNWIDTH query the header control instead of using cached data.
---
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; }