Nikolay Sivov : comctl32: Fix LVN_DELETEALLITEMS notification for LVS_OWNERDATA case.
Alexandre Julliard
julliard at winehq.org
Wed Apr 9 13:52:05 CDT 2014
Module: wine
Branch: master
Commit: d24095a7d1156928ab15844a54438e1de966d9f4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d24095a7d1156928ab15844a54438e1de966d9f4
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Apr 9 16:50:59 2014 +0400
comctl32: Fix LVN_DELETEALLITEMS notification for LVS_OWNERDATA case.
---
dlls/comctl32/listview.c | 17 ++++++++++-------
dlls/comctl32/tests/listview.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index c5b5670..fa9895d 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -5383,9 +5383,8 @@ static HIMAGELIST LISTVIEW_CreateDragImage(LISTVIEW_INFO *infoPtr, INT iItem, LP
*/
static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr, BOOL destroy)
{
- NMLISTVIEW nmlv;
HDPA hdpaSubItems = NULL;
- BOOL bSuppress;
+ BOOL suppress = FALSE;
ITEMHDR *hdrItem;
ITEM_INFO *lpItem;
ITEM_ID *lpID;
@@ -5400,11 +5399,15 @@ static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr, BOOL destroy)
SetRectEmpty(&infoPtr->rcFocus);
/* But we are supposed to leave nHotItem as is! */
-
/* send LVN_DELETEALLITEMS notification */
- ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
- nmlv.iItem = -1;
- bSuppress = notify_listview(infoPtr, LVN_DELETEALLITEMS, &nmlv);
+ if (!(infoPtr->dwStyle & LVS_OWNERDATA) || !destroy)
+ {
+ NMLISTVIEW nmlv;
+
+ memset(&nmlv, 0, sizeof(NMLISTVIEW));
+ nmlv.iItem = -1;
+ suppress = notify_listview(infoPtr, LVN_DELETEALLITEMS, &nmlv);
+ }
for (i = infoPtr->nItemCount - 1; i >= 0; i--)
{
@@ -5412,7 +5415,7 @@ static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr, BOOL destroy)
{
/* send LVN_DELETEITEM notification, if not suppressed
and if it is not a virtual listview */
- if (!bSuppress) notify_deleteitem(infoPtr, i);
+ if (!suppress) notify_deleteitem(infoPtr, i);
hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, i);
lpItem = DPA_GetPtr(hdpaSubItems, 0);
/* free id struct */
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index f5d0a01..9310f56 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -330,6 +330,23 @@ static const struct message listview_destroy[] = {
{ 0 }
};
+static const struct message listview_ownerdata_destroy[] = {
+ { 0x0090, sent|optional }, /* Vista */
+ { WM_PARENTNOTIFY, sent },
+ { WM_SHOWWINDOW, sent },
+ { WM_WINDOWPOSCHANGING, sent },
+ { WM_WINDOWPOSCHANGED, sent|optional },
+ { WM_DESTROY, sent },
+ { WM_NCDESTROY, sent },
+ { 0 }
+};
+
+static const struct message listview_ownerdata_deleteall[] = {
+ { LVM_DELETEALLITEMS, sent },
+ { WM_NOTIFY, sent|id, 0, 0, LVN_DELETEALLITEMS },
+ { 0 }
+};
+
static const struct message listview_header_changed_seq[] = {
{ LVM_SETCOLUMNA, sent },
{ WM_NOTIFY, sent|id|defwinproc, 0, 0, LISTVIEW_ID },
@@ -5059,6 +5076,7 @@ static void test_hover(void)
static void test_destroynotify(void)
{
HWND hwnd;
+ BOOL ret;
hwnd = create_listview_control(LVS_REPORT);
ok(hwnd != NULL, "failed to create listview window\n");
@@ -5066,6 +5084,23 @@ static void test_destroynotify(void)
flush_sequences(sequences, NUM_MSG_SEQUENCES);
DestroyWindow(hwnd);
ok_sequence(sequences, COMBINED_SEQ_INDEX, listview_destroy, "check destroy order", FALSE);
+
+ /* same for ownerdata list */
+ hwnd = create_listview_control(LVS_REPORT|LVS_OWNERDATA);
+ ok(hwnd != NULL, "failed to create listview window\n");
+
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+ DestroyWindow(hwnd);
+ ok_sequence(sequences, COMBINED_SEQ_INDEX, listview_ownerdata_destroy, "check destroy order, ownerdata", FALSE);
+
+ hwnd = create_listview_control(LVS_REPORT|LVS_OWNERDATA);
+ ok(hwnd != NULL, "failed to create listview window\n");
+
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+ ret = SendMessageA(hwnd, LVM_DELETEALLITEMS, 0, 0);
+ ok(ret == TRUE, "got %d\n", ret);
+ ok_sequence(sequences, COMBINED_SEQ_INDEX, listview_ownerdata_deleteall, "deleteall ownerdata", FALSE);
+ DestroyWindow(hwnd);
}
static void test_header_notification(void)
More information about the wine-cvs
mailing list