[PATCH v5 8/8] comctl32/listbox: Shrink the item array in a helper function
Gabriel Ivăncescu
gabrielopcode at gmail.com
Thu Nov 22 07:44:44 CST 2018
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/comctl32/listbox.c | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/dlls/comctl32/listbox.c b/dlls/comctl32/listbox.c
index 3b76e19..41eb631 100644
--- a/dlls/comctl32/listbox.c
+++ b/dlls/comctl32/listbox.c
@@ -148,6 +148,24 @@ static BOOL expand_storage(LB_DESCR *descr, UINT amount)
return TRUE;
}
+static void shrink_storage(LB_DESCR *descr)
+{
+ LB_ITEMDATA *p = descr->items;
+ UINT num = descr->nb_items;
+
+ if (num + LB_ARRAY_GRANULARITY * 2 < descr->array_size)
+ {
+ num += LB_ARRAY_GRANULARITY - 1;
+ num -= num % LB_ARRAY_GRANULARITY;
+ p = HeapReAlloc(GetProcessHeap(), 0, p, num * sizeof(LB_ITEMDATA));
+ if (p)
+ {
+ descr->array_size = num;
+ descr->items = p;
+ }
+ }
+}
+
static BOOL is_item_selected(LB_DESCR *descr, UINT index)
{
return descr->items[index].selected;
@@ -1661,7 +1679,6 @@ static void LISTBOX_DeleteItem( LB_DESCR *descr, INT index )
static LRESULT LISTBOX_RemoveItem( LB_DESCR *descr, INT index )
{
LB_ITEMDATA *item;
- INT max_items;
if ((index < 0) || (index >= descr->nb_items)) return LB_ERR;
@@ -1681,20 +1698,8 @@ static LRESULT LISTBOX_RemoveItem( LB_DESCR *descr, INT index )
(descr->nb_items - index) * sizeof(LB_ITEMDATA) );
if (descr->anchor_item == descr->nb_items) descr->anchor_item--;
- /* Shrink the item array if possible */
+ shrink_storage(descr);
- max_items = descr->array_size;
- if (descr->nb_items < max_items - 2*LB_ARRAY_GRANULARITY)
- {
- max_items -= LB_ARRAY_GRANULARITY;
- item = HeapReAlloc( GetProcessHeap(), 0, descr->items,
- max_items * sizeof(LB_ITEMDATA) );
- if (item)
- {
- descr->array_size = max_items;
- descr->items = item;
- }
- }
/* Repaint the items */
LISTBOX_UpdateScroll( descr );
--
2.19.1
More information about the wine-devel
mailing list