[PATCH] comctl32/listview: Always return zero state mask for subitems
Nikolay Sivov
nsivov at codeweavers.com
Sun Jan 21 10:53:30 CST 2018
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/comctl32/listview.c | 11 +++++++----
dlls/comctl32/tests/listview.c | 43 ++++++++++++++++++++++++++++++++----------
2 files changed, 40 insertions(+), 14 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 589d5c4a7e..c085578062 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -6679,16 +6679,19 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
/* make a local copy */
isubitem = lpLVItem->iSubItem;
+ if (isubitem && (lpLVItem->mask & LVIF_STATE))
+ lpLVItem->state = 0;
+
/* a quick optimization if all we're asked is the focus state
* these queries are worth optimising since they are common,
* and can be answered in constant time, without the heavy accesses */
if ( (lpLVItem->mask == LVIF_STATE) && (lpLVItem->stateMask == LVIS_FOCUSED) &&
!(infoPtr->uCallbackMask & LVIS_FOCUSED) )
{
- lpLVItem->state = 0;
- if (infoPtr->nFocusedItem == lpLVItem->iItem)
- lpLVItem->state |= LVIS_FOCUSED;
- return TRUE;
+ lpLVItem->state = 0;
+ if (infoPtr->nFocusedItem == lpLVItem->iItem && isubitem == 0)
+ lpLVItem->state |= LVIS_FOCUSED;
+ return TRUE;
}
ZeroMemory(&dispInfo, sizeof(dispInfo));
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 8efd3dab69..18e874a00f 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -6152,16 +6152,17 @@ static void test_state_image(void)
insert_column(hwnd, 0);
insert_column(hwnd, 1);
- item.mask = LVIF_TEXT;
+ item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = 0;
item.iSubItem = 0;
item.pszText = text;
+ item.lParam = 123456;
r = SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item);
ok(r == 0, "Failed to insert an item.\n");
item.mask = LVIF_STATE;
- item.state = INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED;
- item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED;
+ item.state = INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED | LVIS_FOCUSED;
+ item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED | LVIS_FOCUSED;
item.iItem = 0;
item.iSubItem = 0;
r = SendMessageA(hwnd, LVM_SETITEMA, 0, (LPARAM)&item);
@@ -6174,27 +6175,49 @@ static void test_state_image(void)
r = SendMessageA(hwnd, LVM_SETITEMA, 0, (LPARAM)&item);
ok(r, "Failed to set subitem text.\n");
- item.mask = LVIF_STATE;
- item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED;
+ item.mask = LVIF_STATE | LVIF_PARAM;
+ item.stateMask = ~0u;
item.state = 0;
item.iItem = 0;
item.iSubItem = 0;
+ item.lParam = 0;
r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
ok(r, "Failed to get item state.\n");
- ok(item.state == (INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED), "Unexpected item state %#x.\n", item.state);
+ ok(item.state == (INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED | LVIS_FOCUSED),
+ "Unexpected item state %#x.\n", item.state);
+ ok(item.lParam == 123456, "Unexpected lParam %ld.\n", item.lParam);
- item.mask = LVIF_STATE;
- item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED;
+ item.mask = 0;
+ item.stateMask = ~0u;
item.state = INDEXTOSTATEIMAGEMASK(2);
item.iItem = 0;
item.iSubItem = 1;
r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
ok(r, "Failed to get subitem state.\n");
- todo_wine
+ ok(item.state == INDEXTOSTATEIMAGEMASK(2), "Unexpected state %#x.\n", item.state);
+
+ item.mask = LVIF_STATE | LVIF_PARAM;
+ item.stateMask = ~0u;
+ item.state = INDEXTOSTATEIMAGEMASK(2);
+ item.iItem = 0;
+ item.iSubItem = 1;
+ item.lParam = 0;
+ r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
+ ok(r, "Failed to get subitem state.\n");
+ ok(item.state == 0, "Unexpected state %#x.\n", item.state);
+ ok(item.lParam == 123456, "Unexpected lParam %ld.\n", item.lParam);
+
+ item.mask = LVIF_STATE;
+ item.stateMask = LVIS_FOCUSED;
+ item.state = 0;
+ item.iItem = 0;
+ item.iSubItem = 1;
+ r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
+ ok(r, "Failed to get subitem state.\n");
ok(item.state == 0, "Unexpected state %#x.\n", item.state);
item.mask = LVIF_STATE;
- item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED;
+ item.stateMask = ~0u;
item.state = INDEXTOSTATEIMAGEMASK(2);
item.iItem = 0;
item.iSubItem = 2;
--
2.15.1
More information about the wine-devel
mailing list