[PATCH v3 2/6] comctl32/listview: Fix deselect on LVS_OWNERDATA.

Angelo Haller wine-devel at szanni.org
Fri Jun 17 22:08:39 CDT 2022


From: Angelo Haller <angelo at szanni.org>

Send one "deselect all items" notification on selection change for
LVS_OWNERDATA listviews instead of notifying about each individual
item change.

Enable LVS_OWNERDATA multi select tests for wine.

Signed-off-by: Angelo Haller <angelo at szanni.org>

---
v3: Remove double `;;` and clarify comment.
    Move patch to the front to enable tests in a more fine
    grained manner.
---
 dlls/comctl32/listview.c       | 6 ++++++
 dlls/comctl32/tests/listview.c | 4 ++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 730bf4aaddd..6fc58c933a9 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -3405,6 +3405,12 @@ static BOOL LISTVIEW_DeselectAllSkipItems(LISTVIEW_INFO *infoPtr, RANGES toSkip)
 
     lvItem.state = 0;
     lvItem.stateMask = LVIS_SELECTED;
+
+    /* Only send one deselect all (-1) notification on LVS_OWNERDATA style */
+    if (infoPtr->dwStyle & LVS_OWNERDATA) {
+        LISTVIEW_SetItemState(infoPtr, -1, &lvItem);
+        return TRUE;
+    }
     
     /* need to clone the DPA because callbacks can change it */
     if (!(clone = ranges_clone(infoPtr->selectionRanges))) return FALSE;
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 0b17fb7c834..2294c3b1487 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -3729,7 +3729,7 @@ static void test_ownerdata_multiselect(void)
     expect(0, res);
     ok_sequence(sequences, PARENT_ODSTATECHANGED_SEQ_INDEX,
                 ownerdata_multiselect_select_3_odstatechanged_seq,
-                "ownerdata multiselect: deselect all, select item 3 via DOWN", TRUE);
+                "ownerdata multiselect: deselect all, select item 3 via DOWN", FALSE);
     res = SendMessageA(hwnd, WM_KEYUP, VK_DOWN, 0);
     expect(0, res);
     res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
@@ -3831,7 +3831,7 @@ static void test_ownerdata_multiselect(void)
     expect(0, res);
     ok_sequence(sequences, PARENT_ODSTATECHANGED_SEQ_INDEX,
                 ownerdata_multiselect_select_0_odstatechanged_seq,
-                "ownerdata multiselect: deselect all, select item 0 via UP", TRUE);
+                "ownerdata multiselect: deselect all, select item 0 via UP", FALSE);
     res = SendMessageA(hwnd, WM_KEYUP, VK_UP, 0);
     expect(0, res);
     res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
-- 
2.36.1




More information about the wine-devel mailing list