From: Gabriel Ivăncescu Subject: [PATCH 9/9] user32/listbox: Send LB_RESETCONTENT from RemoveItem rather than DeleteItem Message-Id: <2f912bebf5d743944c7a67505fd975b86b0e78e5.1550145143.git.gabrielopcode@gmail.com> Date: Thu, 14 Feb 2019 14:06:48 +0200 In-Reply-To: References: Signed-off-by: Gabriel Ivăncescu --- dlls/user32/listbox.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c index 7f9076f..2e0f17b 100644 --- a/dlls/user32/listbox.c +++ b/dlls/user32/listbox.c @@ -1665,19 +1665,12 @@ static LRESULT LISTBOX_InsertString( LB_DESCR *descr, INT index, LPCWSTR str ) */ static void LISTBOX_DeleteItem( LB_DESCR *descr, INT index ) { - /* save the item data before it gets freed by LB_RESETCONTENT */ - ULONG_PTR item_data = get_item_data(descr, index); - LPWSTR item_str = get_item_string(descr, index); - - if (!descr->nb_items) - SendMessageW( descr->self, LB_RESETCONTENT, 0, 0 ); - /* Note: Win 3.1 only sends DELETEITEM on owner-draw items, * while Win95 sends it for all items with user data. * It's probably better to send it too often than not * often enough, so this is what we do here. */ - if (IS_OWNERDRAW(descr) || item_data) + if (IS_OWNERDRAW(descr) || get_item_data(descr, index)) { DELETEITEMSTRUCT dis; UINT id = (UINT)GetWindowLongPtrW( descr->self, GWLP_ID ); @@ -1686,10 +1679,10 @@ static void LISTBOX_DeleteItem( LB_DESCR *descr, INT index ) dis.CtlID = id; dis.itemID = index; dis.hwndItem = descr->self; - dis.itemData = item_data; + dis.itemData = get_item_data(descr, index); SendMessageW( descr->owner, WM_DELETEITEM, id, (LPARAM)&dis ); } - HeapFree( GetProcessHeap(), 0, item_str ); + HeapFree( GetProcessHeap(), 0, get_item_string(descr, index) ); } @@ -1707,11 +1700,14 @@ static LRESULT LISTBOX_RemoveItem( LB_DESCR *descr, INT index ) /* We need to invalidate the original rect instead of the updated one. */ LISTBOX_InvalidateItems( descr, index ); + if (descr->nb_items == 1) + { + SendMessageW(descr->self, LB_RESETCONTENT, 0, 0); + return LB_OKAY; + } descr->nb_items--; LISTBOX_DeleteItem( descr, index ); - if (!descr->nb_items) return LB_OKAY; - /* Remove the item */ item = &descr->items[index]; -- 2.20.1