diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 5cd4d0c574..bed113d78d 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -529,8 +529,6 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) menu_driver_data_own = true; break; case RARCH_MENU_CTL_UNSET_OWN_DRIVER: - if (!content_is_inited()) - return false; menu_driver_data_own = false; break; case RARCH_MENU_CTL_SET_TEXTURE: diff --git a/menu/menu_setting.c b/menu/menu_setting.c index b43103c643..e9b243131c 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -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) { @@ -3438,7 +3455,7 @@ static bool setting_append_list_input_player_options( &settings->input.binds[user][i], user + 1, user, - strdup(name), /* TODO: Find a way to fix these memleaks. */ + strdup(name), strdup(label), &defaults[i], &group_info, @@ -6571,6 +6588,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT); } CONFIG_BOOL( @@ -7324,31 +7342,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); diff --git a/menu/menu_setting.h b/menu/menu_setting.h index 770821dc0e..0526721497 100644 --- a/menu/menu_setting.h +++ b/menu/menu_setting.h @@ -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