diff --git a/config.def.h b/config.def.h index ee693e7ce3..80b96ee352 100644 --- a/config.def.h +++ b/config.def.h @@ -596,6 +596,9 @@ static const bool quick_menu_show_start_streaming = true; static const bool quick_menu_show_set_core_association = true; static const bool quick_menu_show_reset_core_association = true; static const bool quick_menu_show_options = true; + +#define DEFAULT_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH false + static const bool quick_menu_show_controls = true; static const bool quick_menu_show_cheats = true; static const bool quick_menu_show_shaders = true; diff --git a/configuration.c b/configuration.c index 55837a3fb3..507c49c16e 100644 --- a/configuration.c +++ b/configuration.c @@ -1683,6 +1683,7 @@ static struct config_bool_setting *populate_settings_bool( SETTING_BOOL("quick_menu_show_set_core_association", &settings->bools.quick_menu_show_set_core_association, true, quick_menu_show_set_core_association, false); SETTING_BOOL("quick_menu_show_reset_core_association", &settings->bools.quick_menu_show_reset_core_association, true, quick_menu_show_reset_core_association, false); SETTING_BOOL("quick_menu_show_options", &settings->bools.quick_menu_show_options, true, quick_menu_show_options, false); + SETTING_BOOL("quick_menu_show_core_options_flush", &settings->bools.quick_menu_show_core_options_flush, true, DEFAULT_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, false); SETTING_BOOL("quick_menu_show_controls", &settings->bools.quick_menu_show_controls, true, quick_menu_show_controls, false); SETTING_BOOL("quick_menu_show_cheats", &settings->bools.quick_menu_show_cheats, true, quick_menu_show_cheats, false); SETTING_BOOL("quick_menu_show_shaders", &settings->bools.quick_menu_show_shaders, true, quick_menu_show_shaders, false); diff --git a/configuration.h b/configuration.h index 09f7116749..f0da0b5047 100644 --- a/configuration.h +++ b/configuration.h @@ -693,6 +693,7 @@ typedef struct settings bool quick_menu_show_set_core_association; bool quick_menu_show_reset_core_association; bool quick_menu_show_options; + bool quick_menu_show_core_options_flush; bool quick_menu_show_controls; bool quick_menu_show_cheats; bool quick_menu_show_shaders; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 66df80f03d..baa893610b 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1322,6 +1322,10 @@ MSG_HASH( MENU_ENUM_LABEL_CORE_OPTIONS_RESET, "core_options_reset" ) +MSG_HASH( + MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH, + "core_options_flush" + ) MSG_HASH( MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE, "game_specific_options_create" @@ -4070,6 +4074,10 @@ MSG_HASH( MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS, "quick_menu_show_options" ) +MSG_HASH( + MENU_ENUM_LABEL_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, + "quick_menu_show_core_options_flush" + ) MSG_HASH( MENU_ENUM_LABEL_QUICK_MENU_SHOW_CONTROLS, "quick_menu_show_controls" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 61c065b369..7257de54aa 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4569,6 +4569,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, "Show the 'Options' option." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, + "Show 'Flush Options to Disk'" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, + "Show the 'Flush Options to Disk' entry in the 'Options > Manage Core Options' menu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, "Show 'Controls'" @@ -6494,6 +6502,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CORE_OPTIONS_RESET, "Set all core options to default values." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_FLUSH, + "Flush Options to Disk" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_OPTIONS_FLUSH, + "Force current settings to be written to active options file. Ensures options are preserved in the event that a core bug causes improper shutdown of the frontend." + ) /* - Legacy (unused) */ MSG_HASH( @@ -10952,6 +10968,14 @@ MSG_HASH( MSG_CORE_OPTIONS_RESET, "All core options reset to default." ) +MSG_HASH( + MSG_CORE_OPTIONS_FLUSHED, + "Core options saved to:" + ) +MSG_HASH( + MSG_CORE_OPTIONS_FLUSH_FAILED, + "Failed to save core options to:" + ) MSG_HASH( MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, "Could not find any next driver" diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 83728a7532..3d4ebaebf5 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -5084,6 +5084,13 @@ static int action_ok_core_options_reset(const char *path, return 0; } +static int action_ok_core_options_flush(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + core_options_flush(); + return 0; +} + int action_ok_close_content(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { int ret; @@ -8437,6 +8444,9 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, case MENU_SETTING_ACTION_CORE_OPTIONS_RESET: BIND_ACTION_OK(cbs, action_ok_core_options_reset); break; + case MENU_SETTING_ACTION_CORE_OPTIONS_FLUSH: + BIND_ACTION_OK(cbs, action_ok_core_options_flush); + break; case MENU_SETTING_ITEM_CORE_RESTORE_BACKUP: BIND_ACTION_OK(cbs, action_ok_core_restore_backup); break; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index a590e7658d..13256795c8 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -688,6 +688,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_shader_options, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_input_remapping_options, MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_option_override_list, MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_LIST) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_options_reset, MENU_ENUM_SUBLABEL_CORE_OPTIONS_RESET) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_options_flush, MENU_ENUM_SUBLABEL_CORE_OPTIONS_FLUSH) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_show_advanced_settings, MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_threaded_data_runloop_enable, MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_playlist_entry_rename, MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME) @@ -770,6 +771,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_start_streaming, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_set_core_association, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_reset_core_association,MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_options, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_core_options_flush, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_controls, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_shaders, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_content_show_overlays, MENU_ENUM_SUBLABEL_CONTENT_SHOW_OVERLAYS) @@ -2364,6 +2366,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_options); break; + case MENU_ENUM_LABEL_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_core_options_flush); + break; case MENU_ENUM_LABEL_QUICK_MENU_SHOW_CONTROLS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_controls); break; @@ -2666,6 +2671,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CORE_OPTIONS_RESET: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_options_reset); break; + case MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_options_flush); + break; case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_input_remapping_options); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 36b4c5e96e..822d8f4bb1 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -10068,6 +10068,10 @@ static void materialui_list_insert( node->icon_texture_index = MUI_TEXTURE_UNDO_SAVE_STATE; node->icon_type = MUI_ICON_TYPE_INTERNAL; break; + case MENU_SETTING_ACTION_CORE_OPTIONS_FLUSH: + node->icon_texture_index = MUI_TEXTURE_FILE; + node->icon_type = MUI_ICON_TYPE_INTERNAL; + break; case FILE_TYPE_RPL_ENTRY: case MENU_SETTING_DROPDOWN_ITEM: case MENU_SETTING_DROPDOWN_ITEM_RESOLUTION: diff --git a/menu/drivers/ozone/ozone_texture.c b/menu/drivers/ozone/ozone_texture.c index 8390d85823..04ce921697 100644 --- a/menu/drivers/ozone/ozone_texture.c +++ b/menu/drivers/ozone/ozone_texture.c @@ -259,6 +259,8 @@ uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone, return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CLOSE]; case MENU_ENUM_LABEL_CORE_OPTIONS_RESET: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_UNDO]; + case MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH: + return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_FILE]; case MENU_ENUM_LABEL_CORE_LOCK: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE]; case MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS: diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index e51970692d..f47eabd0c1 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2778,6 +2778,8 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, return xmb->textures.list[XMB_TEXTURE_CLOSE]; case MENU_ENUM_LABEL_CORE_OPTIONS_RESET: return xmb->textures.list[XMB_TEXTURE_UNDO]; + case MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH: + return xmb->textures.list[XMB_TEXTURE_FILE]; case MENU_ENUM_LABEL_CORE_LOCK: return xmb->textures.list[XMB_TEXTURE_CORE]; case MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS: diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 3686ed6e99..699f7cdd2f 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1026,13 +1026,15 @@ end: } static unsigned menu_displaylist_parse_core_option_override_list( - menu_displaylist_info_t *info) + menu_displaylist_info_t *info, settings_t *settings) { - unsigned count = 0; - bool core_has_options = !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL) && + unsigned count = 0; + bool core_has_options = !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL) && rarch_ctl(RARCH_CTL_HAS_CORE_OPTIONS, NULL); - bool game_options_active = rarch_ctl(RARCH_CTL_IS_GAME_OPTIONS_ACTIVE, NULL); - bool folder_options_active = rarch_ctl(RARCH_CTL_IS_FOLDER_OPTIONS_ACTIVE, NULL); + bool game_options_active = rarch_ctl(RARCH_CTL_IS_GAME_OPTIONS_ACTIVE, NULL); + bool folder_options_active = rarch_ctl(RARCH_CTL_IS_FOLDER_OPTIONS_ACTIVE, NULL); + bool show_core_options_flush = settings ? + settings->bools.quick_menu_show_core_options_flush : false; /* Sanity check - cannot handle core option * overrides if: @@ -1087,14 +1089,25 @@ static unsigned menu_displaylist_parse_core_option_override_list( MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE, 0, 0)) count++; end: - /* Reset core options */ if (core_has_options) + { + /* Flush core options to disk */ + if (show_core_options_flush) + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_FLUSH), + msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH), + MENU_ENUM_LABEL_CORE_OPTIONS_FLUSH, + MENU_SETTING_ACTION_CORE_OPTIONS_FLUSH, 0, 0)) + count++; + + /* Reset core options */ if (menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS_RESET), msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS_RESET), MENU_ENUM_LABEL_CORE_OPTIONS_RESET, MENU_SETTING_ACTION_CORE_OPTIONS_RESET, 0, 0)) count++; + } /* Fallback, in case we open this menu while running * a core without options */ @@ -8896,6 +8909,7 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_QUICK_MENU_SHOW_SET_CORE_ASSOCIATION, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS, PARSE_ONLY_BOOL}, + {MENU_ENUM_LABEL_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_CONTROLS, PARSE_ONLY_BOOL}, {MENU_ENUM_LABEL_QUICK_MENU_SHOW_CHEATS, PARSE_ONLY_BOOL}, }; @@ -11464,7 +11478,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, size_t selection = menu_navigation_get_selection(); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - count = menu_displaylist_parse_core_option_override_list(info); + count = menu_displaylist_parse_core_option_override_list(info, settings); if (selection >= count) { diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 53563fc1b1..007baffc5b 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -244,6 +244,7 @@ enum menu_settings_type MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE, MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE, MENU_SETTING_ACTION_CORE_OPTIONS_RESET, + MENU_SETTING_ACTION_CORE_OPTIONS_FLUSH, MENU_SETTINGS_LAST }; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index c0669aa224..e1f4072d5f 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -17734,6 +17734,21 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); + CONFIG_BOOL( + list, list_info, + &settings->bools.quick_menu_show_core_options_flush, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, + DEFAULT_QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + CONFIG_BOOL( list, list_info, &settings->bools.quick_menu_show_controls, diff --git a/msg_hash.h b/msg_hash.h index d3fdb81c26..f855bc70a5 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -358,6 +358,8 @@ enum msg_hash_enums MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, MSG_CORE_OPTIONS_FILE_REMOVED_SUCCESSFULLY, MSG_CORE_OPTIONS_RESET, + MSG_CORE_OPTIONS_FLUSHED, + MSG_CORE_OPTIONS_FLUSH_FAILED, MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, MSG_DECOMPRESSION_FAILED, MSG_DISK_EJECTED, @@ -1249,6 +1251,7 @@ enum msg_hash_enums MENU_LABEL(QUICK_MENU_SHOW_SET_CORE_ASSOCIATION), MENU_LABEL(QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION), MENU_LABEL(QUICK_MENU_SHOW_OPTIONS), + MENU_LABEL(QUICK_MENU_SHOW_CORE_OPTIONS_FLUSH), MENU_LABEL(QUICK_MENU_SHOW_CONTROLS), MENU_LABEL(QUICK_MENU_SHOW_CHEATS), MENU_LABEL(QUICK_MENU_SHOW_SHADERS), @@ -1753,6 +1756,7 @@ enum msg_hash_enums MENU_LABEL(FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE), MENU_LABEL(CORE_OPTION_OVERRIDE_INFO), MENU_LABEL(CORE_OPTIONS_RESET), + MENU_LABEL(CORE_OPTIONS_FLUSH), /* Legacy (unused) * > Cannot remove these because they are diff --git a/retroarch.c b/retroarch.c index e36b8898cf..9b30bd9f5a 100644 --- a/retroarch.c +++ b/retroarch.c @@ -39611,7 +39611,6 @@ bool core_options_remove_override(bool game_specific) } coreopts->updated = true; - config_file_free(conf); #ifdef HAVE_CHEEVOS rcheevos_validate_config_settings(); @@ -39631,8 +39630,17 @@ bool core_options_remove_override(bool game_specific) runloop_state.game_options_active = false; runloop_state.folder_options_active = false; + /* Update config file path/object stored in + * core option manager struct */ strlcpy(coreopts->conf_path, new_options_path, sizeof(coreopts->conf_path)); + + if (conf) + { + config_file_free(coreopts->conf); + coreopts->conf = conf; + conf = NULL; + } } runloop_msg_queue_push( @@ -39640,6 +39648,9 @@ bool core_options_remove_override(bool game_specific) 1, 100, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + if (conf) + config_file_free(conf); + return true; error: @@ -39679,6 +39690,94 @@ void core_options_reset(void) NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } +void core_options_flush(void) +{ + core_option_manager_t *coreopts = runloop_state.core_options; + const char *path_core_options = path_get(RARCH_PATH_CORE_OPTIONS); + const char *core_options_file = NULL; + bool success = false; + char msg[256]; + + msg[0] = '\0'; + + /* If there are no core options, there + * is nothing to do */ + if (!coreopts || (coreopts->size < 1)) + return; + + /* Check whether game/folder-specific options file + * is being used */ + if (!string_is_empty(path_core_options)) + { + config_file_t *conf_tmp = NULL; + + /* Attempt to load existing file */ + if (path_is_valid(path_core_options)) + conf_tmp = config_file_new_from_path_to_string(path_core_options); + + /* Create new file if required */ + if (!conf_tmp) + conf_tmp = config_file_new_alloc(); + + if (conf_tmp) + { + core_option_manager_flush( + runloop_state.core_options, + conf_tmp); + + success = config_file_write(conf_tmp, path_core_options, true); + config_file_free(conf_tmp); + } + } + else + { + /* We are using the 'default' core options file */ + path_core_options = runloop_state.core_options->conf_path; + + if (!string_is_empty(path_core_options)) + { + core_option_manager_flush( + runloop_state.core_options, + runloop_state.core_options->conf); + + /* We must *guarantee* that a file gets written + * to disk if any options differ from the current + * options file contents. Must therefore handle + * the case where the 'default' file does not + * exist (e.g. if it gets deleted manually while + * a core is running) */ + if (!path_is_valid(path_core_options)) + runloop_state.core_options->conf->modified = true; + + success = config_file_write(runloop_state.core_options->conf, + path_core_options, true); + } + } + + /* Get options file name for display purposes */ + if (!string_is_empty(path_core_options)) + core_options_file = path_basename(path_core_options); + + if (string_is_empty(core_options_file)) + core_options_file = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNKNOWN); + + /* Log result */ + RARCH_LOG(success ? + "[Core Options]: Saved core options to \"%s\"\n" : + "[Core Options]: Failed to save core options to \"%s\"\n", + path_core_options ? path_core_options : "UNKNOWN"); + + snprintf(msg, sizeof(msg), "%s \"%s\"", + success ? + msg_hash_to_str(MSG_CORE_OPTIONS_FLUSHED) : + msg_hash_to_str(MSG_CORE_OPTIONS_FLUSH_FAILED), + core_options_file); + + runloop_msg_queue_push( + msg, 1, 100, true, + NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); +} + void menu_content_environment_get(int *argc, char *argv[], void *args, void *params_data) { diff --git a/retroarch.h b/retroarch.h index b183d00cad..7236065618 100644 --- a/retroarch.h +++ b/retroarch.h @@ -2079,6 +2079,7 @@ static const unsigned input_config_bind_order[] = { bool core_options_create_override(bool game_specific); bool core_options_remove_override(bool game_specific); void core_options_reset(void); +void core_options_flush(void); typedef enum apple_view_type {