summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
1bbd230)
Currently, pemnu_destroy is used to free items. This means that the menu
code needs to iterate over items, and we have no way to free the ITEM *
of items that aren't in a menu.
Instead, free the ITEM in the pmenu_item destructor.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
+static int pmenu_item_destructor(void *arg)
+{
+ struct pmenu_item *item = arg;
+ free_item(item->nci);
+ return 0;
+}
+
/**
* pmenu_item_create - Allocate and initialize a new pmenu_item instance.
*
/**
* pmenu_item_create - Allocate and initialize a new pmenu_item instance.
*
+ talloc_set_destructor(item, pmenu_item_destructor);
+
set_item_userptr(item->nci, item);
return item;
set_item_userptr(item->nci, item);
return item;
if (index < 0)
return -1;
if (index < 0)
return -1;
talloc_free(item);
/* Note that items array has a null terminator. */
talloc_free(item);
/* Note that items array has a null terminator. */
void pmenu_delete(struct pmenu *menu)
{
void pmenu_delete(struct pmenu *menu)
{
assert(menu->scr.sig == pb_pmenu_sig);
menu->scr.sig = pb_removed_sig;
assert(menu->scr.sig == pb_pmenu_sig);
menu->scr.sig = pb_removed_sig;
- for (i = item_count(menu->ncm); i; i--)
- free_item(menu->items[i - 1]);
-
free_menu(menu->ncm);
delwin(menu->scr.sub_ncw);
delwin(menu->scr.main_ncw);
free_menu(menu->ncm);
delwin(menu->scr.sub_ncw);
delwin(menu->scr.main_ncw);