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; double max;
uint64_t flags; uint64_t flags;
uint64_t free_flags;
change_handler_t change_handler; change_handler_t change_handler;
change_handler_t read_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, 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)))) group_info->name, subgroup_info->name, parent_group, change_handler, read_handler))))
return false; return false;
/* Request values to be freed later */
settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_VALUES);
return true; return true;
} }
@ -1729,6 +1734,10 @@ bool CONFIG_BIND(
setting_bind_setting(name, SHORT, target, player, player_offset, default_value, setting_bind_setting(name, SHORT, target, player, player_offset, default_value,
group_info->name, subgroup_info->name, parent_group)))) group_info->name, subgroup_info->name, parent_group))))
return false; 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; return true;
} }
@ -3105,6 +3114,14 @@ void settings_data_list_current_add_flags(
setting_add_special_callbacks(list, list_info, values); 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 #ifdef HAVE_OVERLAY
static void overlay_enable_toggle_change_handler(void *data) 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) static bool menu_setting_free(void *data)
{ {
rarch_setting_t *setting = (rarch_setting_t*)data; rarch_setting_t *setting = (rarch_setting_t*)data;
unsigned values;
unsigned n;
if (!data) if (!data)
return false; return false;
/* Free data which was previously tagged */
for (; menu_setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting)) for (; menu_setting_get_type(setting) != ST_NONE; menu_settings_list_increment(&setting))
{ for (values = setting->free_flags, n = 0; values != 0; values >>= 1, n++)
enum setting_type setting_type = menu_setting_get_type(setting); if (values & 1)
switch (1 << n)
switch (setting_type) {
{ case SD_FREE_FLAG_VALUES:
case ST_STRING_OPTIONS:
if (setting->values)
free((void*)setting->values); free((void*)setting->values);
setting->values = NULL; setting->values = NULL;
break; break;
case ST_BIND: case SD_FREE_FLAG_NAME:
free((void*)setting->name); free((void*)setting->name);
free((void*)setting->short_description); setting->name = NULL;
setting->name = NULL; break;
setting->short_description = NULL; case SD_FREE_FLAG_SHORT:
break; free((void*)setting->short_description);
default: setting->short_description = NULL;
break; break;
} default:
} break;
}
free(data); free(data);

View File

@ -62,6 +62,13 @@ enum setting_flags
SD_FLAG_ADVANCED = (1 << 9) 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 enum menu_setting_ctl_state
{ {
MENU_SETTING_CTL_NONE = 0, MENU_SETTING_CTL_NONE = 0,
@ -370,6 +377,11 @@ void settings_data_list_current_add_flags(
rarch_setting_info_t *list_info, rarch_setting_info_t *list_info,
unsigned values); 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); bool menu_setting_ctl(enum menu_setting_ctl_state state, void *data);
#ifdef __cplusplus #ifdef __cplusplus