comctl32/listview: Always return zero state mask for subitems.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2018-01-21 19:53:30 +03:00 committed by Alexandre Julliard
parent ce5fb75f7f
commit 6b2675dc8f
2 changed files with 40 additions and 14 deletions

View File

@ -6679,16 +6679,19 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
/* make a local copy */ /* make a local copy */
isubitem = lpLVItem->iSubItem; isubitem = lpLVItem->iSubItem;
if (isubitem && (lpLVItem->mask & LVIF_STATE))
lpLVItem->state = 0;
/* a quick optimization if all we're asked is the focus state /* a quick optimization if all we're asked is the focus state
* these queries are worth optimising since they are common, * these queries are worth optimising since they are common,
* and can be answered in constant time, without the heavy accesses */ * and can be answered in constant time, without the heavy accesses */
if ( (lpLVItem->mask == LVIF_STATE) && (lpLVItem->stateMask == LVIS_FOCUSED) && if ( (lpLVItem->mask == LVIF_STATE) && (lpLVItem->stateMask == LVIS_FOCUSED) &&
!(infoPtr->uCallbackMask & LVIS_FOCUSED) ) !(infoPtr->uCallbackMask & LVIS_FOCUSED) )
{ {
lpLVItem->state = 0; lpLVItem->state = 0;
if (infoPtr->nFocusedItem == lpLVItem->iItem) if (infoPtr->nFocusedItem == lpLVItem->iItem && isubitem == 0)
lpLVItem->state |= LVIS_FOCUSED; lpLVItem->state |= LVIS_FOCUSED;
return TRUE; return TRUE;
} }
ZeroMemory(&dispInfo, sizeof(dispInfo)); ZeroMemory(&dispInfo, sizeof(dispInfo));

View File

@ -6152,16 +6152,17 @@ static void test_state_image(void)
insert_column(hwnd, 0); insert_column(hwnd, 0);
insert_column(hwnd, 1); insert_column(hwnd, 1);
item.mask = LVIF_TEXT; item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = 0; item.iItem = 0;
item.iSubItem = 0; item.iSubItem = 0;
item.pszText = text; item.pszText = text;
item.lParam = 123456;
r = SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item); r = SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item);
ok(r == 0, "Failed to insert an item.\n"); ok(r == 0, "Failed to insert an item.\n");
item.mask = LVIF_STATE; item.mask = LVIF_STATE;
item.state = INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED; item.state = INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED | LVIS_FOCUSED;
item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED | LVIS_FOCUSED;
item.iItem = 0; item.iItem = 0;
item.iSubItem = 0; item.iSubItem = 0;
r = SendMessageA(hwnd, LVM_SETITEMA, 0, (LPARAM)&item); 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); r = SendMessageA(hwnd, LVM_SETITEMA, 0, (LPARAM)&item);
ok(r, "Failed to set subitem text.\n"); ok(r, "Failed to set subitem text.\n");
item.mask = LVIF_STATE; item.mask = LVIF_STATE | LVIF_PARAM;
item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; item.stateMask = ~0u;
item.state = 0; item.state = 0;
item.iItem = 0; item.iItem = 0;
item.iSubItem = 0; item.iSubItem = 0;
item.lParam = 0;
r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item); r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
ok(r, "Failed to get item state.\n"); 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.mask = 0;
item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; item.stateMask = ~0u;
item.state = INDEXTOSTATEIMAGEMASK(2); item.state = INDEXTOSTATEIMAGEMASK(2);
item.iItem = 0; item.iItem = 0;
item.iSubItem = 1; item.iSubItem = 1;
r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item); r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
ok(r, "Failed to get subitem state.\n"); 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); ok(item.state == 0, "Unexpected state %#x.\n", item.state);
item.mask = LVIF_STATE; item.mask = LVIF_STATE;
item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; item.stateMask = ~0u;
item.state = INDEXTOSTATEIMAGEMASK(2); item.state = INDEXTOSTATEIMAGEMASK(2);
item.iItem = 0; item.iItem = 0;
item.iSubItem = 2; item.iSubItem = 2;