Add option to (force-)write current core options to disk

This commit is contained in:
jdgleaver 2021-08-26 11:41:28 +01:00
parent 5ca99fdb51
commit a6901dc85e
16 changed files with 205 additions and 8 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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"

View file

@ -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"

View file

@ -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;

View file

@ -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;

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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)
{

View file

@ -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
};

View file

@ -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,

View file

@ -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

View file

@ -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)
{

View file

@ -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
{