mirror of
https://github.com/holub/mame
synced 2025-07-03 17:08:39 +03:00
Added the ability to optionally pass a destructor to ui_menu_alloc_state()
This commit is contained in:
parent
37f422ebec
commit
b3ee2ffd1f
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user