From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/user32/listbox.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c index b104bfd47b..594c956b94 100644 --- a/dlls/user32/listbox.c +++ b/dlls/user32/listbox.c @@ -67,6 +67,7 @@ typedef struct INT height; /* Window height */ LB_ITEMDATA *items; /* Array of items */ INT nb_items; /* Number of items */ + UINT items_size; /* Total number of allocated items in the array */ INT top_item; /* Top visible item */ INT selected_item; /* Selected item */ INT focus_item; /* Item that has the focus */ @@ -713,7 +714,7 @@ static LRESULT LISTBOX_InitStorage( LB_DESCR *descr, INT nb_items ) nb_items += LB_ARRAY_GRANULARITY - 1; nb_items -= (nb_items % LB_ARRAY_GRANULARITY); if (descr->items) { - nb_items += HeapSize( GetProcessHeap(), 0, descr->items ) / sizeof(*item); + nb_items += descr->items_size; item = HeapReAlloc( GetProcessHeap(), 0, descr->items, nb_items * sizeof(LB_ITEMDATA)); } @@ -727,6 +728,7 @@ static LRESULT LISTBOX_InitStorage( LB_DESCR *descr, INT nb_items ) SEND_NOTIFICATION( descr, LBN_ERRSPACE ); return LB_ERRSPACE; } + descr->items_size = nb_items; descr->items = item; return LB_OKAY; } @@ -1537,12 +1539,10 @@ static LRESULT LISTBOX_InsertItem( LB_DESCR *descr, INT index,
if (index == -1) index = descr->nb_items; else if ((index < 0) || (index > descr->nb_items)) return LB_ERR; - if (!descr->items) max_items = 0; - else max_items = HeapSize( GetProcessHeap(), 0, descr->items ) / sizeof(*item); - if (descr->nb_items == max_items) + if (descr->nb_items == descr->items_size) { /* We need to grow the array */ - max_items += LB_ARRAY_GRANULARITY; + max_items = descr->items_size + LB_ARRAY_GRANULARITY; if (descr->items) item = HeapReAlloc( GetProcessHeap(), 0, descr->items, max_items * sizeof(LB_ITEMDATA) ); @@ -1554,6 +1554,7 @@ static LRESULT LISTBOX_InsertItem( LB_DESCR *descr, INT index, SEND_NOTIFICATION( descr, LBN_ERRSPACE ); return LB_ERRSPACE; } + descr->items_size = max_items; descr->items = item; }
@@ -1713,13 +1714,17 @@ static LRESULT LISTBOX_RemoveItem( LB_DESCR *descr, INT index )
/* Shrink the item array if possible */
- max_items = HeapSize( GetProcessHeap(), 0, descr->items ) / sizeof(LB_ITEMDATA); + max_items = descr->items_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->items = item; + if (item) + { + descr->items_size = max_items; + descr->items = item; + } } /* Repaint the items */
@@ -1765,6 +1770,7 @@ static void LISTBOX_ResetContent( LB_DESCR *descr ) descr->selected_item = -1; descr->focus_item = 0; descr->anchor_item = -1; + descr->items_size = 0; descr->items = NULL; }
@@ -2506,6 +2512,7 @@ static BOOL LISTBOX_Create( HWND hwnd, LPHEADCOMBO lphc ) descr->width = rect.right - rect.left; descr->height = rect.bottom - rect.top; descr->items = NULL; + descr->items_size = 0; descr->nb_items = 0; descr->top_item = 0; descr->selected_item = -1;