comctl32/listview: Send change notifications when inserting (LVIS_SELECTED|LVIS_FOCUSED) items.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Dmitry Timoshkov 2022-02-22 11:06:27 +03:00 committed by Alexandre Julliard
parent f51b2ca8f7
commit 3cd366eee6
2 changed files with 16 additions and 12 deletions

View File

@ -4200,6 +4200,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
LVITEMW item;
/* stateMask is ignored for LVM_INSERTITEM */
UINT stateMask = isNew ? ~0 : lpLVItem->stateMask;
BOOL send_change_notification;
TRACE("()\n");
@ -4260,11 +4261,16 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
nmlv.uChanged = uChanged ? uChanged : lpLVItem->mask;
nmlv.lParam = item.lParam;
/* Send LVN_ITEMCHANGING notification, if the item is not being inserted
/* Send change notification if the item is not being inserted, or inserted (selected|focused),
and we are _NOT_ virtual (LVS_OWNERDATA), and change notifications
are enabled. Even nothing really changed we still need to send this,
are enabled. Even if nothing really changed we still need to send this,
in this case uChanged mask is just set to passed item mask. */
if (lpItem && !isNew && (infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE))
send_change_notification = !isNew;
send_change_notification |= (uChanged & LVIF_STATE) && (lpLVItem->state & (LVIS_FOCUSED | LVIS_SELECTED));
send_change_notification &= !!(infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE);
if (lpItem && send_change_notification)
{
HWND hwndSelf = infoPtr->hwndSelf;
@ -4352,13 +4358,11 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL
}
}
/* if we're inserting the item, we're done */
if (isNew) return TRUE;
/* send LVN_ITEMCHANGED notification */
if (send_change_notification)
{
if (lpLVItem->mask & LVIF_PARAM) nmlv.lParam = lpLVItem->lParam;
if (infoPtr->notify_mask & NOTIFY_MASK_ITEM_CHANGE)
notify_listview(infoPtr, LVN_ITEMCHANGED, &nmlv);
}
return TRUE;
}

View File

@ -6023,7 +6023,7 @@ static void test_LVM_INSERTITEM(void)
if ((insert_item[i].mask & LVIF_STATE) && (insert_item[i].state & (LVIS_FOCUSED | LVIS_SELECTED)))
{
sprintf(buf, "%d: insert focused", i);
ok_sequence(sequences, PARENT_SEQ_INDEX, parent_insert_focused0_seq, buf, TRUE);
ok_sequence(sequences, PARENT_SEQ_INDEX, parent_insert_focused0_seq, buf, insert_item[i].mask != LVIF_STATE);
}
else
{
@ -6060,7 +6060,7 @@ static void test_insertitem(void)
item.iSubItem = 0;
ret = SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item);
ok(ret == 0, "got %d\n", ret);
ok_sequence(sequences, PARENT_SEQ_INDEX, parent_insert_focused0_seq, "insert focused 0", TRUE);
ok_sequence(sequences, PARENT_SEQ_INDEX, parent_insert_focused0_seq, "insert focused 0", FALSE);
state = SendMessageA(hwnd, LVM_GETITEMSTATE, 0, LVIS_FOCUSED);
ok(state == LVIS_FOCUSED, "got %x\n", state);
@ -6073,7 +6073,7 @@ static void test_insertitem(void)
item.iSubItem = 0;
ret = SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item);
ok(ret == 1, "got %d\n", ret);
ok_sequence(sequences, PARENT_SEQ_INDEX, parent_insert_focused1_seq, "insert focused 1", TRUE);
ok_sequence(sequences, PARENT_SEQ_INDEX, parent_insert_focused1_seq, "insert focused 1", FALSE);
state = SendMessageA(hwnd, LVM_GETITEMSTATE, 1, LVIS_FOCUSED);
ok(state == LVIS_FOCUSED, "got %x\n", state);