Merge pull request #12074 from jdgleaver/core-option-save-remove

Add support for saving per-directory core options and deleting core option overrides
This commit is contained in:
Autechre 2021-02-25 12:00:19 +01:00 committed by GitHub
commit 3dda581e41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 554 additions and 64 deletions

View File

@ -1258,6 +1258,34 @@ MSG_HASH(
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS,
"game_specific_options"
)
MSG_HASH(
MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST,
"core_option_override_list"
)
MSG_HASH(
MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST,
"deferred_core_option_override_list"
)
MSG_HASH(
MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE,
"game_specific_core_options_create"
)
MSG_HASH(
MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE,
"game_specific_core_options_remove"
)
MSG_HASH(
MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE,
"folder_specific_core_options_create"
)
MSG_HASH(
MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE,
"folder_specific_core_options_remove"
)
MSG_HASH(
MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_INFO,
"core_option_override_info"
)
MSG_HASH(
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE,
"game_specific_options_create"

View File

@ -6239,6 +6239,39 @@ MSG_HASH(
/* Quick Menu > Options */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_LIST,
"Manage Core Options"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_LIST,
"Save or remove option overrides for the current content."
)
/* Quick Menu > Options > Core Option Overrides */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_CORE_OPTIONS_CREATE,
"Save Game Options"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_CORE_OPTIONS_REMOVE,
"Delete Game Options"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE,
"Save Content Directory Options"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE,
"Delete Content Directory Options"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_INFO,
"Active Options File:"
)
/* - Legacy (unused) */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE,
"Create Game Options File"
@ -10639,6 +10672,10 @@ MSG_HASH(
MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY,
"Core options file created successfully."
)
MSG_HASH(
MSG_CORE_OPTIONS_FILE_REMOVED_SUCCESSFULLY,
"Core options file removed successfully."
)
MSG_HASH(
MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER,
"Could not find any next driver"
@ -10739,6 +10776,10 @@ MSG_HASH(
MSG_ERROR_SAVING_CORE_OPTIONS_FILE,
"Error saving core options file."
)
MSG_HASH(
MSG_ERROR_REMOVING_CORE_OPTIONS_FILE,
"Error deleting core options file."
)
MSG_HASH(
MSG_ERROR_SAVING_REMAP_FILE,
"Error saving remap file."

View File

@ -133,6 +133,7 @@ GENERIC_DEFERRED_PUSH(deferred_push_frontend_counters, DISPLAYLIST_
GENERIC_DEFERRED_PUSH(deferred_push_core_cheat_options, DISPLAYLIST_OPTIONS_CHEATS)
GENERIC_DEFERRED_PUSH(deferred_push_core_input_remapping_options, DISPLAYLIST_OPTIONS_REMAPPINGS)
GENERIC_DEFERRED_PUSH(deferred_push_core_options, DISPLAYLIST_CORE_OPTIONS)
GENERIC_DEFERRED_PUSH(deferred_push_core_option_override_list, DISPLAYLIST_CORE_OPTION_OVERRIDE_LIST)
GENERIC_DEFERRED_PUSH(deferred_push_disk_options, DISPLAYLIST_OPTIONS_DISK)
GENERIC_DEFERRED_PUSH(deferred_push_browse_url_list, DISPLAYLIST_BROWSE_URL_LIST)
GENERIC_DEFERRED_PUSH(deferred_push_browse_url_start, DISPLAYLIST_BROWSE_URL_START)
@ -775,6 +776,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
{MENU_ENUM_LABEL_CORE_LIST, deferred_push_core_list},
{MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, deferred_push_history_list},
{MENU_ENUM_LABEL_CORE_OPTIONS, deferred_push_core_options},
{MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST, deferred_push_core_option_override_list},
{MENU_ENUM_LABEL_NETWORK_INFORMATION, deferred_push_network_information},
{MENU_ENUM_LABEL_ONLINE_UPDATER, deferred_push_options},
{MENU_ENUM_LABEL_HELP_LIST, deferred_push_help},
@ -1130,6 +1132,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
case MENU_ENUM_LABEL_CORE_OPTIONS:
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_options);
break;
case MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST:
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_option_override_list);
break;
case MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS:
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_cheat_options);
break;

View File

@ -1120,7 +1120,7 @@ static void menu_action_setting_disp_set_label_menu_file_cheat(
path, "(CHEAT)", STRLEN_CONST("(CHEAT)"), s2, len2);
}
static void menu_action_setting_disp_set_label_core_option_create(
static void menu_action_setting_disp_set_label_core_option_override_info(
file_list_t* list,
unsigned *w, unsigned type, unsigned i,
const char *label,
@ -1128,13 +1128,26 @@ static void menu_action_setting_disp_set_label_core_option_create(
const char *path,
char *s2, size_t len2)
{
const char *override_path = path_get(RARCH_PATH_CORE_OPTIONS);
core_option_manager_t *coreopts = NULL;
const char *options_file = NULL;
*s = '\0';
*w = 19;
strcpy_literal(s, "");
if (!string_is_empty(override_path))
options_file = path_basename(override_path);
else if (rarch_ctl(RARCH_CTL_CORE_OPTIONS_LIST_GET, &coreopts))
{
const char *options_path = coreopts->conf_path;
if (!string_is_empty(options_path))
options_file = path_basename(options_path);
}
if (!string_is_empty(path_get(RARCH_PATH_BASENAME)))
strlcpy(s, path_basename(path_get(RARCH_PATH_BASENAME)), len);
if (!string_is_empty(options_file))
strlcpy(s, options_file, len);
else
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len);
strlcpy(s2, path, len2);
}
@ -1612,6 +1625,7 @@ static int menu_cbs_init_bind_get_string_representation_compare_label(
case MENU_ENUM_LABEL_DOWNLOADED_FILE_DETECT_CORE_LIST:
case MENU_ENUM_LABEL_FAVORITES:
case MENU_ENUM_LABEL_CORE_OPTIONS:
case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST:
case MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS:
case MENU_ENUM_LABEL_SHADER_OPTIONS:
case MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS:
@ -1679,6 +1693,10 @@ static int menu_cbs_init_bind_get_string_representation_compare_label(
BIND_ACTION_GET_VALUE(cbs,
menu_action_setting_disp_set_label_core_manager_entry);
break;
case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_INFO:
BIND_ACTION_GET_VALUE(cbs,
menu_action_setting_disp_set_label_core_option_override_info);
break;
default:
return -1;
}
@ -1757,10 +1775,6 @@ static int menu_cbs_init_bind_get_string_representation_compare_type(
switch (type)
{
case MENU_SETTINGS_CORE_OPTION_CREATE:
BIND_ACTION_GET_VALUE(cbs,
menu_action_setting_disp_set_label_core_option_create);
break;
case FILE_TYPE_CORE:
case FILE_TYPE_DIRECT_LOAD:
BIND_ACTION_GET_VALUE(cbs,

View File

@ -458,6 +458,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl)
return MENU_ENUM_LABEL_DEFERRED_MANUAL_CONTENT_SCAN_LIST;
case ACTION_OK_DL_CORE_MANAGER_LIST:
return MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST;
case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST:
return MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST;
default:
break;
}
@ -1507,6 +1509,7 @@ int generic_action_ok_displaylist_push(const char *path,
case ACTION_OK_DL_CDROM_INFO_LIST:
case ACTION_OK_DL_MANUAL_CONTENT_SCAN_LIST:
case ACTION_OK_DL_CORE_MANAGER_LIST:
case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST:
ACTION_OK_DL_LBL(action_ok_dl_to_enum(action_type), DISPLAYLIST_GENERIC);
break;
case ACTION_OK_DL_CDROM_INFO_DETAIL_LIST:
@ -5023,10 +5026,58 @@ DEFAULT_ACTION_OK_DOWNLOAD(action_ok_update_cheats, MENU_ENUM_LABEL_CB_UPDATE_CH
#endif
DEFAULT_ACTION_OK_DOWNLOAD(action_ok_update_autoconfig_profiles, MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES)
static int action_ok_option_create(const char *path,
static int action_ok_game_specific_core_options_create(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
create_folder_and_core_options();
bool refresh = false;
core_options_create_override(true);
/* Refresh menu */
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
return 0;
}
static int action_ok_folder_specific_core_options_create(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
bool refresh = false;
core_options_create_override(false);
/* Refresh menu */
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
return 0;
}
static int action_ok_game_specific_core_options_remove(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
bool refresh = false;
core_options_remove_override(true);
/* Refresh menu */
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
return 0;
}
static int action_ok_folder_specific_core_options_remove(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
{
bool refresh = false;
core_options_remove_override(false);
/* Refresh menu */
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
return 0;
}
@ -5590,6 +5641,7 @@ DEFAULT_ACTION_OK_FUNC(action_ok_pl_thumbnails_updater_list, ACTION_OK_DL_PL_THU
DEFAULT_ACTION_OK_FUNC(action_ok_push_manual_content_scan_list, ACTION_OK_DL_MANUAL_CONTENT_SCAN_LIST)
DEFAULT_ACTION_OK_FUNC(action_ok_manual_content_scan_dat_file, ACTION_OK_DL_MANUAL_CONTENT_SCAN_DAT_FILE)
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_list, ACTION_OK_DL_CORE_MANAGER_LIST)
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_option_override_list, ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST)
static int action_ok_open_uwp_permission_settings(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx)
@ -7696,6 +7748,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs,
{MENU_ENUM_LABEL_LOAD_DISC, action_ok_push_load_disc_list},
{MENU_ENUM_LABEL_SHADER_OPTIONS, action_ok_push_default},
{MENU_ENUM_LABEL_CORE_OPTIONS, action_ok_push_default},
{MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST, action_ok_push_core_option_override_list},
{MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS, action_ok_push_default},
{MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, action_ok_push_default},
{MENU_ENUM_LABEL_DISC_INFORMATION, action_ok_push_default},
@ -8361,8 +8414,17 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs,
case MENU_SETTINGS_CORE_DISK_OPTIONS_DISK_INDEX:
BIND_ACTION_OK(cbs, action_ok_disk_index_dropdown_box_list);
break;
case MENU_SETTINGS_CORE_OPTION_CREATE:
BIND_ACTION_OK(cbs, action_ok_option_create);
case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
BIND_ACTION_OK(cbs, action_ok_game_specific_core_options_create);
break;
case MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE:
BIND_ACTION_OK(cbs, action_ok_folder_specific_core_options_create);
break;
case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_REMOVE:
BIND_ACTION_OK(cbs, action_ok_game_specific_core_options_remove);
break;
case MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE:
BIND_ACTION_OK(cbs, action_ok_folder_specific_core_options_remove);
break;
case MENU_SETTING_ITEM_CORE_RESTORE_BACKUP:
BIND_ACTION_OK(cbs, action_ok_core_restore_backup);

View File

@ -665,6 +665,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_save_current_config_override_game,
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_shader_options, MENU_ENUM_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_options, MENU_ENUM_SUBLABEL_CORE_OPTIONS)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_option_override_list, MENU_ENUM_SUBLABEL_CORE_OPTION_OVERRIDE_LIST)
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)
@ -2486,6 +2487,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_CORE_OPTIONS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_options);
break;
case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_option_override_list);
break;
case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_input_remapping_options);
break;

View File

@ -553,6 +553,7 @@ DEFAULT_TITLE_MACRO(action_get_core_manager_list, MENU_ENUM_LABEL_
DEFAULT_TITLE_MACRO(action_get_add_content_list, MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST)
DEFAULT_TITLE_MACRO(action_get_configurations_list, MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST)
DEFAULT_TITLE_MACRO(action_get_core_options_list, MENU_ENUM_LABEL_VALUE_CORE_OPTIONS)
DEFAULT_TITLE_MACRO(action_get_core_option_override_list, MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_LIST)
DEFAULT_TITLE_MACRO(action_get_quick_menu_list, MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS)
DEFAULT_TITLE_MACRO(action_get_input_remapping_options_list, MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS)
DEFAULT_TITLE_MACRO(action_get_shader_options_list, MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS)
@ -1107,6 +1108,8 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs,
action_get_add_content_list},
{MENU_ENUM_LABEL_CORE_OPTIONS,
action_get_core_options_list},
{MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST,
action_get_core_option_override_list},
{MENU_ENUM_LABEL_CONTENT_SETTINGS,
action_get_quick_menu_list},
{MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS,
@ -1427,6 +1430,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_CORE_OPTIONS:
BIND_ACTION_GET_TITLE(cbs, action_get_core_options_list);
break;
case MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST:
BIND_ACTION_GET_TITLE(cbs, action_get_core_option_override_list);
break;
case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY:
BIND_ACTION_GET_TITLE(cbs, action_get_title_deferred_history_list);
break;

View File

@ -9725,6 +9725,14 @@ static void materialui_list_insert(
node->icon_texture_index = MUI_TEXTURE_CORES;
node->icon_type = MUI_ICON_TYPE_INTERNAL;
break;
case MENU_SETTING_ACTION_CORE_OPTIONS:
node->icon_texture_index = MUI_TEXTURE_CORE_OPTIONS;
node->icon_type = MUI_ICON_TYPE_INTERNAL;
break;
case MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST:
node->icon_texture_index = MUI_TEXTURE_SETTINGS;
node->icon_type = MUI_ICON_TYPE_INTERNAL;
break;
case FILE_TYPE_DOWNLOAD_THUMBNAIL_CONTENT:
case FILE_TYPE_DOWNLOAD_PL_THUMBNAIL_CONTENT:
node->icon_texture_index = MUI_TEXTURE_IMAGE;
@ -9774,10 +9782,14 @@ static void materialui_list_insert(
case MENU_SETTING_ACTION_CORE_DELETE_BACKUP:
case MENU_SETTING_ACTION_VIDEO_FILTER_REMOVE:
case MENU_SETTING_ACTION_AUDIO_DSP_PLUGIN_REMOVE:
case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_REMOVE:
case MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE:
node->icon_texture_index = MUI_TEXTURE_REMOVE;
node->icon_type = MUI_ICON_TYPE_INTERNAL;
break;
case MENU_SETTING_ACTION_CORE_CREATE_BACKUP:
case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
case MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE:
node->icon_texture_index = MUI_TEXTURE_SAVE_STATE;
node->icon_type = MUI_ICON_TYPE_INTERNAL;
break;
@ -9891,11 +9903,6 @@ static void materialui_list_insert(
node->icon_texture_index = MUI_TEXTURE_CLOSE;
node->icon_type = MUI_ICON_TYPE_INTERNAL;
}
else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS)))
{
node->icon_texture_index = MUI_TEXTURE_CORE_OPTIONS;
node->icon_type = MUI_ICON_TYPE_INTERNAL;
}
else if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS)))
{
node->icon_texture_index = MUI_TEXTURE_CORE_CHEAT_OPTIONS;

View File

@ -77,6 +77,8 @@ uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
case MENU_ENUM_LABEL_SAVE_STATE:
case MENU_ENUM_LABEL_CORE_CREATE_BACKUP:
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SAVESTATE];
case MENU_ENUM_LABEL_LOAD_STATE:
case MENU_ENUM_LABEL_CORE_RESTORE_BACKUP_LIST:
@ -250,6 +252,8 @@ uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
case MENU_ENUM_LABEL_CORE_DELETE_BACKUP_LIST:
case MENU_ENUM_LABEL_VIDEO_FILTER_REMOVE:
case MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN_REMOVE:
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE:
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CLOSE];
case MENU_ENUM_LABEL_CORE_LOCK:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE];
@ -408,6 +412,8 @@ uintptr_t ozone_entries_icon_get_texture(ozone_handle_t *ozone,
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE_INFO];
case MENU_SETTING_ACTION_CORE_OPTIONS:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE_OPTIONS];
case MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
case MENU_SETTING_ACTION_CORE_INPUT_REMAPPING_OPTIONS:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_REMAPPING_OPTIONS];
case MENU_SETTING_ACTION_CORE_CHEAT_OPTIONS:

View File

@ -2046,6 +2046,8 @@ static uintptr_t stripes_icon_get_id(stripes_handle_t *stripes,
case MENU_ENUM_LABEL_CORE_OPTIONS:
case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE:
return stripes->textures.list[STRIPES_TEXTURE_CORE_OPTIONS];
case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST:
return stripes->textures.list[STRIPES_TEXTURE_SETTING];
case MENU_ENUM_LABEL_ADD_TO_FAVORITES:
case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST:
return stripes->textures.list[STRIPES_TEXTURE_ADD_FAVORITE];

View File

@ -2470,6 +2470,8 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
case MENU_ENUM_LABEL_CORE_OPTIONS:
case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE:
return xmb->textures.list[XMB_TEXTURE_CORE_OPTIONS];
case MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST:
return xmb->textures.list[XMB_TEXTURE_SETTING];
case MENU_ENUM_LABEL_ADD_TO_FAVORITES:
case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST:
return xmb->textures.list[XMB_TEXTURE_ADD_FAVORITE];
@ -2497,6 +2499,8 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
case MENU_ENUM_LABEL_SAVE_STATE:
case MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE:
case MENU_ENUM_LABEL_CORE_CREATE_BACKUP:
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE:
return xmb->textures.list[XMB_TEXTURE_SAVESTATE];
case MENU_ENUM_LABEL_LOAD_STATE:
case MENU_ENUM_LABEL_CONFIGURATIONS:
@ -2693,6 +2697,8 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
case MENU_ENUM_LABEL_CORE_DELETE_BACKUP_LIST:
case MENU_ENUM_LABEL_VIDEO_FILTER_REMOVE:
case MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN_REMOVE:
case MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE:
case MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE:
return xmb->textures.list[XMB_TEXTURE_CLOSE];
case MENU_ENUM_LABEL_CORE_LOCK:
return xmb->textures.list[XMB_TEXTURE_CORE];

View File

@ -210,7 +210,8 @@ enum
ACTION_OK_DL_MANUAL_CONTENT_SCAN_LIST,
ACTION_OK_DL_MANUAL_CONTENT_SCAN_DAT_FILE,
ACTION_OK_DL_CORE_RESTORE_BACKUP_LIST,
ACTION_OK_DL_CORE_DELETE_BACKUP_LIST
ACTION_OK_DL_CORE_DELETE_BACKUP_LIST,
ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST
};
/* Function callbacks */

View File

@ -900,6 +900,80 @@ static unsigned menu_displaylist_parse_core_manager_list(
return count;
}
static unsigned menu_displaylist_parse_core_option_override_list(
menu_displaylist_info_t *info)
{
unsigned count = 0;
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);
/* Sanity check - cannot handle core option
* overrides if:
* - Core is 'dummy'
* - Core has no options
* - No content has been loaded */
if (rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL) ||
!rarch_ctl(RARCH_CTL_HAS_CORE_OPTIONS, NULL) ||
string_is_empty(path_get(RARCH_PATH_CONTENT)))
goto end;
/* Show currently active core options file */
if (menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_INFO),
msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_INFO),
MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_INFO,
MENU_SETTINGS_CORE_INFO_NONE, 0, 0))
count++;
/* Save core option overrides */
if (!game_options_active)
{
if (menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_CORE_OPTIONS_CREATE),
msg_hash_to_str(MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE),
MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_CREATE,
MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_CREATE, 0, 0))
count++;
if (!folder_options_active)
if (menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE),
msg_hash_to_str(MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE),
MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE,
MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE, 0, 0))
count++;
}
/* Remove core option overrides */
if (game_options_active)
if (menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_CORE_OPTIONS_REMOVE),
msg_hash_to_str(MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE),
MENU_ENUM_LABEL_GAME_SPECIFIC_CORE_OPTIONS_REMOVE,
MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_REMOVE, 0, 0))
count++;
if (folder_options_active)
if (menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE),
msg_hash_to_str(MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE),
MENU_ENUM_LABEL_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE,
MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE, 0, 0))
count++;
end:
/* Fallback, in case we open this menu while running
* a content-less core */
if (count == 0)
if (menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND),
msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND),
MENU_ENUM_LABEL_NO_SETTINGS_FOUND,
0, 0, 0))
count++;
return count;
}
static unsigned menu_displaylist_parse_system_info(file_list_t *list)
{
int controller;
@ -2613,7 +2687,7 @@ static int menu_displaylist_parse_load_content_settings(
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS),
msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS),
MENU_ENUM_LABEL_CORE_OPTIONS,
MENU_SETTING_ACTION, 0, 0))
MENU_SETTING_ACTION_CORE_OPTIONS, 0, 0))
count++;
}
@ -11104,28 +11178,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
rarch_ctl(RARCH_CTL_GET_CORE_OPTION_SIZE, &num_opts);
if (game_specific_options)
{
if (!rarch_ctl(RARCH_CTL_IS_GAME_OPTIONS_ACTIVE, NULL))
{
if (menu_entries_append_enum(info->list,
msg_hash_to_str(
MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE),
msg_hash_to_str(
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE),
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE,
MENU_SETTINGS_CORE_OPTION_CREATE, 0, 0))
count++;
}
else
if (menu_entries_append_enum(info->list,
msg_hash_to_str(
MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE),
msg_hash_to_str(
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_IN_USE),
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_IN_USE,
MENU_SETTINGS_CORE_OPTION_CREATE, 0, 0))
count++;
}
if (menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_LIST),
msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST),
MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST,
MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST, 0, 0))
count++;
if (num_opts != 0)
{
@ -11161,6 +11219,29 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
info->need_push = true;
}
break;
case DISPLAYLIST_CORE_OPTION_OVERRIDE_LIST:
{
/* The number of items in the core option override
* list will vary depending upon whether game or
* content directory overrides are currently active.
* To prevent the menu selection from going out
* of bounds, we therefore have to check that the
* current selection index is less than the current
* number of menu entries - if not, we reset the
* navigation pointer */
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);
if (selection >= count)
{
info->need_refresh = true;
info->need_navigation_clear = true;
}
info->need_push = true;
}
break;
case DISPLAYLIST_ARCHIVE_ACTION:
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
#ifdef HAVE_COMPRESSION

View File

@ -106,6 +106,7 @@ enum menu_displaylist_ctl_state
DISPLAYLIST_LAKKA,
DISPLAYLIST_CORES_DETECTED,
DISPLAYLIST_CORE_OPTIONS,
DISPLAYLIST_CORE_OPTION_OVERRIDE_LIST,
DISPLAYLIST_CORE_INFO,
DISPLAYLIST_DISC_INFO,
DISPLAYLIST_PERFCOUNTERS_CORE,

View File

@ -55,7 +55,6 @@ RETRO_BEGIN_DECLS
#define MENU_SETTINGS_CORE_INFO_NONE 0xffff
#define MENU_SETTINGS_CORE_OPTION_NONE 0xffff
#define MENU_SETTINGS_CHEEVOS_NONE 0xffff
#define MENU_SETTINGS_CORE_OPTION_CREATE 0x05000
#define MENU_SETTINGS_CORE_OPTION_START 0x10000
#define MENU_SETTINGS_CHEEVOS_START 0x40000
#define MENU_SETTINGS_NETPLAY_ROOMS_START 0x80000
@ -108,6 +107,7 @@ enum menu_settings_type
MENU_SETTING_ACTION_CLOSE,
MENU_SETTING_ACTION_CLOSE_HORIZONTAL,
MENU_SETTING_ACTION_CORE_OPTIONS,
MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST,
MENU_SETTING_ACTION_CORE_INPUT_REMAPPING_OPTIONS,
MENU_SETTING_ACTION_CORE_CHEAT_OPTIONS,
MENU_SETTING_ACTION_CORE_MANAGER_OPTIONS,
@ -233,6 +233,11 @@ enum menu_settings_type
MENU_SETTING_ACTION_VIDEO_FILTER_REMOVE,
MENU_SETTING_ACTION_AUDIO_DSP_PLUGIN_REMOVE,
MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_CREATE,
MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_REMOVE,
MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_CREATE,
MENU_SETTING_ACTION_FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE,
MENU_SETTINGS_LAST
};

View File

@ -353,7 +353,9 @@ enum msg_hash_enums
MSG_ERROR_REMOVING_SHADER_PRESET,
MSG_FAILED_TO_CREATE_THE_DIRECTORY,
MSG_ERROR_SAVING_CORE_OPTIONS_FILE,
MSG_ERROR_REMOVING_CORE_OPTIONS_FILE,
MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY,
MSG_CORE_OPTIONS_FILE_REMOVED_SUCCESSFULLY,
MSG_DECOMPRESSION_ALREADY_IN_PROGRESS,
MSG_DECOMPRESSION_FAILED,
MSG_DISK_EJECTED,
@ -1534,6 +1536,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST,
MENU_ENUM_LABEL_DEFERRED_CORE_RESTORE_BACKUP_LIST,
MENU_ENUM_LABEL_DEFERRED_CORE_DELETE_BACKUP_LIST,
MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST,
MENU_ENUM_LABEL_DEFERRED_USER_BINDS_LIST,
MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_CHEEVOS_LIST,
MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_TWITCH_LIST,
@ -1692,8 +1695,21 @@ enum msg_hash_enums
MENU_LABEL(BLOCK_SRAM_OVERWRITE),
MENU_LABEL(GAME_SPECIFIC_OPTIONS),
MENU_LABEL(CORE_OPTION_OVERRIDE_LIST),
MENU_LABEL(GAME_SPECIFIC_CORE_OPTIONS_CREATE),
MENU_LABEL(GAME_SPECIFIC_CORE_OPTIONS_REMOVE),
MENU_LABEL(FOLDER_SPECIFIC_CORE_OPTIONS_CREATE),
MENU_LABEL(FOLDER_SPECIFIC_CORE_OPTIONS_REMOVE),
MENU_LABEL(CORE_OPTION_OVERRIDE_INFO),
/* Legacy (unused)
* > Cannot remove these because they are
* referenced in the translation files,
* which are handled via Crowdin */
MENU_LABEL(GAME_SPECIFIC_OPTIONS_CREATE),
MENU_LABEL(GAME_SPECIFIC_OPTIONS_IN_USE),
MENU_LABEL(AUTO_OVERRIDES_ENABLE),
MENU_LABEL(AUTO_REMAPS_ENABLE),
MENU_LABEL(GLOBAL_CORE_OPTIONS),

View File

@ -35554,7 +35554,7 @@ static void rarch_init_core_options_path(
else if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_resolve_relative(
global_options_path, path_get(RARCH_PATH_CONFIG),
"retroarch-core-options.cfg", sizeof(global_options_path));
FILE_PATH_CORE_OPTIONS_CONFIG, sizeof(global_options_path));
}
/* Allocate correct path/src_path strings */
@ -38796,42 +38796,220 @@ static void set_gamepad_input_override(struct rarch_state *p_rarch,
}
#endif
/* creates folder and core options stub file for subsequent runs */
bool create_folder_and_core_options(void)
/* Creates folder and core options stub file for subsequent runs */
bool core_options_create_override(bool game_specific)
{
char game_path[PATH_MAX_LENGTH];
config_file_t *conf = NULL;
struct rarch_state *p_rarch = &rarch_st;
char options_path[PATH_MAX_LENGTH];
config_file_t *conf = NULL;
struct rarch_state *p_rarch = &rarch_st;
game_path[0] = '\0';
options_path[0] = '\0';
if (!retroarch_validate_game_options(game_path, sizeof(game_path), true))
/* Sanity check - cannot create a folder-specific
* override if a game-specific override is
* already active */
if (!game_specific && p_rarch->runloop_game_options_active)
goto error;
/* Get options file path (either game-specific or folder-specific) */
if (game_specific)
{
runloop_msg_queue_push(
msg_hash_to_str(MSG_ERROR_SAVING_CORE_OPTIONS_FILE),
1, 100, true,
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
return false;
if (!retroarch_validate_game_options(options_path,
sizeof(options_path), true))
goto error;
}
else
if (!retroarch_validate_folder_options(options_path,
sizeof(options_path), true))
goto error;
if (!(conf = config_file_new_from_path_to_string(game_path)))
/* Open config file */
if (!(conf = config_file_new_from_path_to_string(options_path)))
if (!(conf = config_file_new_alloc()))
return false;
goto error;
if (config_file_write(conf, game_path, true))
/* Write config file */
core_option_manager_flush(conf, p_rarch->runloop_core_options);
if (config_file_write(conf, options_path, true))
{
runloop_msg_queue_push(
msg_hash_to_str(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY),
1, 100, true,
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
path_set(RARCH_PATH_CORE_OPTIONS, game_path);
p_rarch->runloop_game_options_active = true;
p_rarch->runloop_folder_options_active = false;
path_set(RARCH_PATH_CORE_OPTIONS, options_path);
p_rarch->runloop_game_options_active = game_specific;
p_rarch->runloop_folder_options_active = !game_specific;
}
else
goto error;
config_file_free(conf);
return true;
error:
runloop_msg_queue_push(
msg_hash_to_str(MSG_ERROR_SAVING_CORE_OPTIONS_FILE),
1, 100, true,
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
if (conf)
config_file_free(conf);
return false;
}
bool core_options_remove_override(bool game_specific)
{
char new_options_path[PATH_MAX_LENGTH];
struct rarch_state *p_rarch = &rarch_st;
core_option_manager_t *coreopts = p_rarch->runloop_core_options;
settings_t *settings = p_rarch->configuration_settings;
bool per_core_options = !settings->bools.global_core_options;
const char *path_core_options = settings->paths.path_core_options;
const char *current_options_path = NULL;
config_file_t *conf = NULL;
bool folder_options_active = false;
new_options_path[0] = '\0';
/* Sanity check 1 - if there are no core options
* or no overrides are active, there is nothing to do */
if (!coreopts ||
(!p_rarch->runloop_game_options_active &&
!p_rarch->runloop_folder_options_active))
return true;
/* Sanity check 2 - can only remove an override
* if the specified type is currently active */
if (game_specific && !p_rarch->runloop_game_options_active)
goto error;
/* Get current options file path */
current_options_path = path_get(RARCH_PATH_CORE_OPTIONS);
if (string_is_empty(current_options_path))
goto error;
/* Remove current options file, if required */
if (path_is_valid(current_options_path))
filestream_delete(current_options_path);
/* Reload any existing 'parent' options file
* > If we have removed a game-specific config,
* check whether a folder-specific config
* exists */
if (game_specific &&
retroarch_validate_folder_options(new_options_path,
sizeof(new_options_path), false) &&
path_is_valid(new_options_path))
folder_options_active = true;
/* > If a folder-specific config does not exist,
* or we removed it, check whether we have a
* top-level config file */
if (!folder_options_active)
{
/* Try core-specific options, if enabled */
if (per_core_options)
{
const char *core_name = p_rarch->runloop_system.info.library_name;
per_core_options = retroarch_validate_per_core_options(
new_options_path, sizeof(new_options_path), true,
core_name, core_name);
}
/* ...otherwise use global options */
if (!per_core_options)
{
if (!string_is_empty(path_core_options))
strlcpy(new_options_path,
path_core_options, sizeof(new_options_path));
else if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_resolve_relative(
new_options_path, path_get(RARCH_PATH_CONFIG),
FILE_PATH_CORE_OPTIONS_CONFIG, sizeof(new_options_path));
}
}
if (string_is_empty(new_options_path))
goto error;
/* > If we have a valid file, load it */
if (folder_options_active ||
path_is_valid(new_options_path))
{
size_t i, j;
if (!(conf = config_file_new_from_path_to_string(new_options_path)))
goto error;
for (i = 0; i < coreopts->size; i++)
{
struct core_option *option = NULL;
struct config_entry_list *entry = NULL;
option = (struct core_option*)&coreopts->opts[i];
if (!option)
continue;
entry = config_get_entry(conf, option->key);
if (!entry || string_is_empty(entry->value))
continue;
/* Set current config value from file entry */
for (j = 0; j < option->vals->size; j++)
{
if (string_is_equal(option->vals->elems[j].data, entry->value))
{
option->index = j;
break;
}
}
}
coreopts->updated = true;
config_file_free(conf);
#ifdef HAVE_CHEEVOS
rcheevos_validate_config_settings();
#endif
}
/* Update runloop status */
if (folder_options_active)
{
path_set(RARCH_PATH_CORE_OPTIONS, new_options_path);
p_rarch->runloop_game_options_active = false;
p_rarch->runloop_folder_options_active = true;
}
else
{
path_clear(RARCH_PATH_CORE_OPTIONS);
p_rarch->runloop_game_options_active = false;
p_rarch->runloop_folder_options_active = false;
strlcpy(coreopts->conf_path, new_options_path,
sizeof(coreopts->conf_path));
}
runloop_msg_queue_push(
msg_hash_to_str(MSG_CORE_OPTIONS_FILE_REMOVED_SUCCESSFULLY),
1, 100, true,
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
return true;
error:
runloop_msg_queue_push(
msg_hash_to_str(MSG_ERROR_REMOVING_CORE_OPTIONS_FILE),
1, 100, true,
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
if (conf)
config_file_free(conf);
return false;
}
void menu_content_environment_get(int *argc, char *argv[],

View File

@ -1992,8 +1992,9 @@ void input_driver_init_joypads(void);
void *input_driver_init_wrap(input_driver_t *input, const char *name);
/* creates folder and core options stub file for subsequent runs */
bool create_folder_and_core_options(void);
/* Creates folder and core options stub file for subsequent runs */
bool core_options_create_override(bool game_specific);
bool core_options_remove_override(bool game_specific);
typedef enum apple_view_type
{

View File

@ -34,6 +34,7 @@ extern "C" {
#include "../../../paths.h"
#include "../../../file_path_special.h"
#include "../../../core_option_manager.h"
#include "../../../menu/menu_driver.h"
#ifndef CXX_BUILD
}
@ -122,8 +123,32 @@ void CoreOptionsDialog::reload()
void CoreOptionsDialog::onSaveGameSpecificOptions()
{
if (!create_folder_and_core_options())
#ifdef HAVE_MENU
bool refresh = false;
#endif
if (!core_options_create_override(true))
QMessageBox::critical(this, msg_hash_to_str(MSG_ERROR), msg_hash_to_str(MSG_ERROR_SAVING_CORE_OPTIONS_FILE));
#ifdef HAVE_MENU
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
#endif
}
void CoreOptionsDialog::onSaveFolderSpecificOptions()
{
#ifdef HAVE_MENU
bool refresh = false;
#endif
if (!core_options_create_override(false))
QMessageBox::critical(this, msg_hash_to_str(MSG_ERROR), msg_hash_to_str(MSG_ERROR_SAVING_CORE_OPTIONS_FILE));
#ifdef HAVE_MENU
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
#endif
}
void CoreOptionsDialog::onCoreOptionComboBoxCurrentIndexChanged(int index)

View File

@ -26,6 +26,7 @@ private slots:
void clearLayout();
void buildLayout();
void onSaveGameSpecificOptions();
void onSaveFolderSpecificOptions();
void onCoreOptionComboBoxCurrentIndexChanged(int index);
void onCoreOptionResetClicked();
void onCoreOptionResetAllClicked();