On Mon, 2 Feb 2004, Fabian Cenedese wrote:
static INT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BOOL subitem, BOOL select) { -- snip--
if (select && !(uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT))) { if (uView == LVS_REPORT) { UnionRect(&rcBounds, &rcIcon, &rcLabel); UnionRect(&rcBounds, &rcBounds, &rcState); } if (!PtInRect(&rcBounds, opt)) iItem = -1; } return lpht->iItem = iItem;
}
In the end is this piece of code. What's the intention of it?
OK, the idea of LISTVIEW_HitTest() is to figure out where a specific point falls: what item/subitem/label/etc. As you said correctly, it does that OK up to this piece of code at the end.
The reason we have this is that for _selecting_ items (hence the test for select), we have slighly different behaviour: -- we 'hit' an item if we click anywhere in the union of the icon and label rectangles. -- the above rule works in all cases _except_ for full row select in REPORT mode, where we have to consider the entire row, and regular REPORT mode where we have to consider the first column only
Index: wine/dlls/comctl32/listview.c
RCS file: /home/wine/wine/dlls/comctl32/listview.c,v retrieving revision 1.380 diff -u -r1.380 listview.c --- wine/dlls/comctl32/listview.c 10 Dec 2003 00:37:14 -0000 1.380 +++ wine/dlls/comctl32/listview.c 2 Feb 2004 14:09:16 -0000 @@ -5980,7 +5980,8 @@ } }
- if (select && !(uView == LVS_REPORT && (infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT)))
- if (select && !(uView == LVS_REPORT && ((infoPtr->dwLvExStyle & LVS_EX_FULLROWSELECT)
{ if (uView == LVS_REPORT) {|| (infoPtr->dwStyle & LVS_OWNERDRAWFIXED))))
I don't think behaviour in the LVS_OWNERDRAWFIXED case is explicitly documented, but I think it should behave as in the LVS_EX_FULLROWSELECT case. In other words, I think your patch is correct, please submit it to wine-patches.