listview R5
Mike McCormack
mike at codeweavers.com
Wed Oct 16 21:24:48 CDT 2002
Hi Dimi,
It appears we need to duplicate the selected items DPA when doing
RemoveAllSelections because some applications change on
LVN_ITEMCHANGED/LVN_ITEMCHANGING notifications.
This applies after Dimi's listview R5 patch.
Mike
ChangeLog:
* duplicate Selected items list in LISTVIEW_RemoveAllSelections to
prevent infinite loops
-------------- next part --------------
--- dlls/comctl32/listview.c Thu Oct 17 11:16:18 2002
+++ dlls/comctl32/listview.c.mike Thu Oct 17 11:11:36 2002
@@ -2375,7 +2375,8 @@
{
LVITEMW lvItem;
RANGE *sel;
- INT i;
+ INT i, pos;
+ HDPA clone;
if (infoPtr->bRemovingAllSelections) return TRUE;
@@ -2386,16 +2387,17 @@
lvItem.state = 0;
lvItem.stateMask = LVIS_SELECTED;
- do
+ /* need to clone the DPA because callbacks can change it */
+ clone = DPA_Clone(infoPtr->hdpaSelectionRanges, NULL);
+ for ( pos = 0; sel = DPA_GetPtr(clone, pos); pos++ )
{
- sel = DPA_GetPtr(infoPtr->hdpaSelectionRanges, 0);
- if (!sel) continue;
- if (infoPtr->hdpaSelectionRanges->nItemCount == 1 &&
- sel->lower == nSkipItem && sel->upper == nSkipItem) break;
for(i = sel->lower; i <= sel->upper; i++)
- if (i != nSkipItem) LISTVIEW_SetItemState(infoPtr, i, &lvItem);
+ {
+ if (i != nSkipItem)
+ LISTVIEW_SetItemState(infoPtr, i, &lvItem);
+ }
}
- while (infoPtr->hdpaSelectionRanges->nItemCount > 0);
+ DPA_Destroy(clone);
infoPtr->bRemovingAllSelections = FALSE;
More information about the wine-patches
mailing list