summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2008-07-26 18:34:17 +0000
committer Nathan Woods <npwoods@mess.org>2008-07-26 18:34:17 +0000
commitb3ee2ffd1ff8545fc535ef1c0666178b35cfb83e (patch)
tree54b527b41084f2c573c0f65822d2bc47198b353f /src
parent37f422ebecbd85f8a20fe5518d055f3d8a3a1062 (diff)
Added the ability to optionally pass a destructor to ui_menu_alloc_state()
Diffstat (limited to 'src')
-rw-r--r--src/emu/uimenu.c22
-rw-r--r--src/emu/uimenu.h3
2 files changed, 18 insertions, 7 deletions
diff --git a/src/emu/uimenu.c b/src/emu/uimenu.c
index e71d254498a..cc97ba15348 100644
--- a/src/emu/uimenu.c
+++ b/src/emu/uimenu.c
@@ -119,6 +119,7 @@ struct _ui_menu
ui_menu_event event; /* the UI event that occurred */
ui_menu * parent; /* pointer to parent menu */
void * state; /* menu-specific state */
+ ui_menu_destroy_state_func destroy_state; /* destroy state callback */
int resetpos; /* reset position */
void * resetref; /* reset reference */
int selected; /* which item is selected */
@@ -454,7 +455,11 @@ void ui_menu_free(ui_menu *menu)
/* free the state */
if (menu->state != NULL)
+ {
+ if (menu->destroy_state != NULL)
+ (*menu->destroy_state)(menu, menu->state);
free(menu->state);
+ }
/* free the menu */
free(menu);
@@ -610,11 +615,16 @@ void ui_menu_set_custom_render(ui_menu *menu, ui_menu_custom_func custom, float
memory to represent the menu's state
-------------------------------------------------*/
-void *ui_menu_alloc_state(ui_menu *menu, size_t size)
+void *ui_menu_alloc_state(ui_menu *menu, size_t size, ui_menu_destroy_state_func destroy_state)
{
if (menu->state != NULL)
+ {
+ if (menu->destroy_state != NULL)
+ (*menu->destroy_state)(menu, menu->state);
free(menu->state);
+ }
menu->state = malloc_or_die(size);
+ menu->destroy_state = destroy_state;
memset(menu->state, 0, size);
return menu->state;
@@ -1662,7 +1672,7 @@ static void menu_input_common(running_machine *machine, ui_menu *menu, void *par
/* if no state, allocate now */
if (state == NULL)
- state = ui_menu_alloc_state(menu, sizeof(*menustate));
+ state = ui_menu_alloc_state(menu, sizeof(*menustate), NULL);
menustate = state;
/* if the menu isn't built, populate now */
@@ -1894,7 +1904,7 @@ static void menu_settings_common(running_machine *machine, ui_menu *menu, void *
/* if no state, allocate now */
if (state == NULL)
- state = ui_menu_alloc_state(menu, sizeof(*menustate));
+ state = ui_menu_alloc_state(menu, sizeof(*menustate), NULL);
menustate = state;
/* if the menu isn't built, populate now */
@@ -2321,7 +2331,7 @@ static void menu_bookkeeping(running_machine *machine, ui_menu *menu, void *para
/* if no state, allocate some */
if (state == NULL)
- state = ui_menu_alloc_state(menu, sizeof(*prevtime));
+ state = ui_menu_alloc_state(menu, sizeof(*prevtime), NULL);
prevtime = state;
/* if the time has rolled over another second, regenerate */
@@ -2417,7 +2427,7 @@ static void menu_memory_card(running_machine *machine, ui_menu *menu, void *para
/* if no state, allocate some */
if (state == NULL)
- state = ui_menu_alloc_state(menu, sizeof(*cardnum));
+ state = ui_menu_alloc_state(menu, sizeof(*cardnum), NULL);
cardnum = state;
/* if the menu isn't built, populate now */
@@ -2710,7 +2720,7 @@ static void menu_select_game(running_machine *machine, ui_menu *menu, void *para
/* if no state, allocate some */
if (state == NULL)
{
- state = ui_menu_alloc_state(menu, sizeof(*menustate) + sizeof(menustate->driverlist) * driver_list_get_count(drivers));
+ state = ui_menu_alloc_state(menu, sizeof(*menustate) + sizeof(menustate->driverlist) * driver_list_get_count(drivers), NULL);
if (parameter != NULL)
strcpy(((select_game_state *)state)->search, parameter);
}
diff --git a/src/emu/uimenu.h b/src/emu/uimenu.h
index adfd4c8306a..4325e0bf7f7 100644
--- a/src/emu/uimenu.h
+++ b/src/emu/uimenu.h
@@ -57,6 +57,7 @@ typedef struct _ui_menu ui_menu;
/* menu-related callback functions */
typedef void (*ui_menu_handler_func)(running_machine *machine, ui_menu *menu, void *parameter, void *state);
typedef void (*ui_menu_custom_func)(running_machine *machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x, float y, float x2, float y2);
+typedef void (*ui_menu_destroy_state_func)(ui_menu *menu, void *state);
/* menu-related events */
@@ -106,7 +107,7 @@ const ui_menu_event *ui_menu_process(ui_menu *menu, UINT32 flags);
void ui_menu_set_custom_render(ui_menu *menu, ui_menu_custom_func custom, float top, float bottom);
/* allocate permanent memory to represent the menu's state */
-void *ui_menu_alloc_state(ui_menu *menu, size_t size);
+void *ui_menu_alloc_state(ui_menu *menu, size_t size, ui_menu_destroy_state_func destroy_state);
/* allocate temporary memory from the menu's memory pool */
void *ui_menu_pool_alloc(ui_menu *menu, size_t size);