comctl32: Fix LVM_GETITEM/LVIF_STATE so it only returns the bits it has been asked for, and sets all the others to zero (with conformance test).

Francois Gouget fgouget at free.fr
Fri Sep 29 05:49:01 CDT 2006


---
 dlls/comctl32/listview.c       |    2 +-
 dlls/comctl32/tests/listview.c |   10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 108d055..b66d047 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -5364,7 +5364,7 @@ static BOOL LISTVIEW_GetItemT(LISTVIEW_I
     /* ... the state field (this one is different due to uCallbackmask) */
     if (lpLVItem->mask & LVIF_STATE) 
     {
-	lpLVItem->state = lpItem->state;
+	lpLVItem->state = lpItem->state & lpLVItem->stateMask;
 	if (dispInfo.item.mask & LVIF_STATE)
 	{
 	    lpLVItem->state &= ~dispInfo.item.stateMask;
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index e96ad26..5d166e0 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -189,6 +189,16 @@ static void test_checkboxes(void)
     r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item);
     ok(item.state == 0x2aaa, "state %x\n", item.state);
 
+    /* Check that only the bits we asked for are returned,
+     * and that all the others are set to zero
+     */
+    item.iItem = 3;
+    item.mask = LVIF_STATE;
+    item.stateMask = 0xf000;
+    item.state = 0xffff;
+    r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item);
+    ok(item.state == 0x2000, "state %x\n", item.state);
+
     /* Set the style again and check that doesn't change an item's state */
     r = SendMessage(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES);
     ok(r == LVS_EX_CHECKBOXES, "ret %lx\n", r);
-- 
1.4.1.1




More information about the wine-patches mailing list