menu setting: Introduce generic concept of free flags for settings data

This commit is contained in:
Sebastien Ronsse 2016-05-23 11:45:25 +10:00
parent d9884b486a
commit 14c0984497
2 changed files with 50 additions and 19 deletions

View File

@ -101,6 +101,7 @@ struct rarch_setting
double max;
uint64_t flags;
uint64_t free_flags;
change_handler_t change_handler;
change_handler_t read_handler;
@ -1692,6 +1693,10 @@ bool CONFIG_STRING_OPTIONS(
setting_string_setting_options(ST_STRING_OPTIONS, name, SHORT, target, len, default_value, "", values,
group_info->name, subgroup_info->name, parent_group, change_handler, read_handler))))
return false;
/* Request values to be freed later */
settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_VALUES);
return true;
}
@ -1729,6 +1734,10 @@ bool CONFIG_BIND(
setting_bind_setting(name, SHORT, target, player, player_offset, default_value,
group_info->name, subgroup_info->name, parent_group))))
return false;
/* Request name and short description to be freed later */
settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT);
return true;
}
@ -3105,6 +3114,14 @@ void settings_data_list_current_add_flags(
setting_add_special_callbacks(list, list_info, values);
}
void settings_data_list_current_add_free_flags(
rarch_setting_t **list,
rarch_setting_info_t *list_info,
unsigned values)
{
(*list)[list_info->index - 1].free_flags |= values;
}
#ifdef HAVE_OVERLAY
static void overlay_enable_toggle_change_handler(void *data)
{
@ -7324,31 +7341,33 @@ static bool setting_append_list(
static bool menu_setting_free(void *data)
{
rarch_setting_t *setting = (rarch_setting_t*)data;
unsigned values;
unsigned n;
if (!data)
return false;
/* Free data which was previously tagged */
for (; menu_setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting))
{
enum setting_type setting_type = menu_setting_get_type(setting);
switch (setting_type)
{
case ST_STRING_OPTIONS:
if (setting->values)
for (values = setting->free_flags, n = 0; values != 0; values >>= 1, n++)
if (values & 1)
switch (1 << n)
{
case SD_FREE_FLAG_VALUES:
free((void*)setting->values);
setting->values = NULL;
break;
case ST_BIND:
free((void*)setting->name);
free((void*)setting->short_description);
setting->name = NULL;
setting->short_description = NULL;
break;
default:
break;
}
}
setting->values = NULL;
break;
case SD_FREE_FLAG_NAME:
free((void*)setting->name);
setting->name = NULL;
break;
case SD_FREE_FLAG_SHORT:
free((void*)setting->short_description);
setting->short_description = NULL;
break;
default:
break;
}
free(data);

View File

@ -62,6 +62,13 @@ enum setting_flags
SD_FLAG_ADVANCED = (1 << 9)
};
enum settings_free_flags
{
SD_FREE_FLAG_VALUES = (1 << 0),
SD_FREE_FLAG_NAME = (1 << 1),
SD_FREE_FLAG_SHORT = (1 << 2)
};
enum menu_setting_ctl_state
{
MENU_SETTING_CTL_NONE = 0,
@ -370,6 +377,11 @@ void settings_data_list_current_add_flags(
rarch_setting_info_t *list_info,
unsigned values);
void settings_data_list_current_add_free_flags(
rarch_setting_t **list,
rarch_setting_info_t *list_info,
unsigned values);
bool menu_setting_ctl(enum menu_setting_ctl_state state, void *data);
#ifdef __cplusplus