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, MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS,
"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( MSG_HASH(
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE, MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE,
"game_specific_options_create" "game_specific_options_create"

View File

@ -6239,6 +6239,39 @@ MSG_HASH(
/* Quick Menu > Options */ /* 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( MSG_HASH(
MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE, MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE,
"Create Game Options File" "Create Game Options File"
@ -10639,6 +10672,10 @@ MSG_HASH(
MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY,
"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_HASH(
MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER,
"Could not find any next driver" "Could not find any next driver"
@ -10739,6 +10776,10 @@ MSG_HASH(
MSG_ERROR_SAVING_CORE_OPTIONS_FILE, MSG_ERROR_SAVING_CORE_OPTIONS_FILE,
"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_HASH(
MSG_ERROR_SAVING_REMAP_FILE, MSG_ERROR_SAVING_REMAP_FILE,
"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_cheat_options, DISPLAYLIST_OPTIONS_CHEATS)
GENERIC_DEFERRED_PUSH(deferred_push_core_input_remapping_options, DISPLAYLIST_OPTIONS_REMAPPINGS) 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_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_disk_options, DISPLAYLIST_OPTIONS_DISK)
GENERIC_DEFERRED_PUSH(deferred_push_browse_url_list, DISPLAYLIST_BROWSE_URL_LIST) GENERIC_DEFERRED_PUSH(deferred_push_browse_url_list, DISPLAYLIST_BROWSE_URL_LIST)
GENERIC_DEFERRED_PUSH(deferred_push_browse_url_start, DISPLAYLIST_BROWSE_URL_START) 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_CORE_LIST, deferred_push_core_list},
{MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, deferred_push_history_list}, {MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, deferred_push_history_list},
{MENU_ENUM_LABEL_CORE_OPTIONS, deferred_push_core_options}, {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_NETWORK_INFORMATION, deferred_push_network_information},
{MENU_ENUM_LABEL_ONLINE_UPDATER, deferred_push_options}, {MENU_ENUM_LABEL_ONLINE_UPDATER, deferred_push_options},
{MENU_ENUM_LABEL_HELP_LIST, deferred_push_help}, {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: case MENU_ENUM_LABEL_CORE_OPTIONS:
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_options); BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_options);
break; 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: case MENU_ENUM_LABEL_CORE_CHEAT_OPTIONS:
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_cheat_options); BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_cheat_options);
break; 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); 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, file_list_t* list,
unsigned *w, unsigned type, unsigned i, unsigned *w, unsigned type, unsigned i,
const char *label, const char *label,
@ -1128,13 +1128,26 @@ static void menu_action_setting_disp_set_label_core_option_create(
const char *path, const char *path,
char *s2, size_t len2) 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'; *s = '\0';
*w = 19; *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))) if (!string_is_empty(options_file))
strlcpy(s, path_basename(path_get(RARCH_PATH_BASENAME)), len); strlcpy(s, options_file, len);
else
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len);
strlcpy(s2, path, len2); 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_DOWNLOADED_FILE_DETECT_CORE_LIST:
case MENU_ENUM_LABEL_FAVORITES: case MENU_ENUM_LABEL_FAVORITES:
case MENU_ENUM_LABEL_CORE_OPTIONS: 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_CORE_CHEAT_OPTIONS:
case MENU_ENUM_LABEL_SHADER_OPTIONS: case MENU_ENUM_LABEL_SHADER_OPTIONS:
case MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS: 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, BIND_ACTION_GET_VALUE(cbs,
menu_action_setting_disp_set_label_core_manager_entry); menu_action_setting_disp_set_label_core_manager_entry);
break; 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: default:
return -1; return -1;
} }
@ -1757,10 +1775,6 @@ static int menu_cbs_init_bind_get_string_representation_compare_type(
switch (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_CORE:
case FILE_TYPE_DIRECT_LOAD: case FILE_TYPE_DIRECT_LOAD:
BIND_ACTION_GET_VALUE(cbs, 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; return MENU_ENUM_LABEL_DEFERRED_MANUAL_CONTENT_SCAN_LIST;
case ACTION_OK_DL_CORE_MANAGER_LIST: case ACTION_OK_DL_CORE_MANAGER_LIST:
return MENU_ENUM_LABEL_DEFERRED_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: default:
break; 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_CDROM_INFO_LIST:
case ACTION_OK_DL_MANUAL_CONTENT_SCAN_LIST: case ACTION_OK_DL_MANUAL_CONTENT_SCAN_LIST:
case ACTION_OK_DL_CORE_MANAGER_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); ACTION_OK_DL_LBL(action_ok_dl_to_enum(action_type), DISPLAYLIST_GENERIC);
break; break;
case ACTION_OK_DL_CDROM_INFO_DETAIL_LIST: 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 #endif
DEFAULT_ACTION_OK_DOWNLOAD(action_ok_update_autoconfig_profiles, MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES) 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) 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; 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_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_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_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, static int action_ok_open_uwp_permission_settings(const char *path,
const char *label, unsigned type, size_t idx, size_t entry_idx) 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_LOAD_DISC, action_ok_push_load_disc_list},
{MENU_ENUM_LABEL_SHADER_OPTIONS, action_ok_push_default}, {MENU_ENUM_LABEL_SHADER_OPTIONS, action_ok_push_default},
{MENU_ENUM_LABEL_CORE_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_CHEAT_OPTIONS, action_ok_push_default},
{MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_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}, {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: case MENU_SETTINGS_CORE_DISK_OPTIONS_DISK_INDEX:
BIND_ACTION_OK(cbs, action_ok_disk_index_dropdown_box_list); BIND_ACTION_OK(cbs, action_ok_disk_index_dropdown_box_list);
break; break;
case MENU_SETTINGS_CORE_OPTION_CREATE: case MENU_SETTING_ACTION_GAME_SPECIFIC_CORE_OPTIONS_CREATE:
BIND_ACTION_OK(cbs, action_ok_option_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; break;
case MENU_SETTING_ITEM_CORE_RESTORE_BACKUP: case MENU_SETTING_ITEM_CORE_RESTORE_BACKUP:
BIND_ACTION_OK(cbs, action_ok_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_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_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_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_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_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) 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: case MENU_ENUM_LABEL_CORE_OPTIONS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_options); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_options);
break; 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: case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_input_remapping_options); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_input_remapping_options);
break; 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_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_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_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_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_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) 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}, action_get_add_content_list},
{MENU_ENUM_LABEL_CORE_OPTIONS, {MENU_ENUM_LABEL_CORE_OPTIONS,
action_get_core_options_list}, action_get_core_options_list},
{MENU_ENUM_LABEL_DEFERRED_CORE_OPTION_OVERRIDE_LIST,
action_get_core_option_override_list},
{MENU_ENUM_LABEL_CONTENT_SETTINGS, {MENU_ENUM_LABEL_CONTENT_SETTINGS,
action_get_quick_menu_list}, action_get_quick_menu_list},
{MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS, {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: case MENU_ENUM_LABEL_CORE_OPTIONS:
BIND_ACTION_GET_TITLE(cbs, action_get_core_options_list); BIND_ACTION_GET_TITLE(cbs, action_get_core_options_list);
break; 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: case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY:
BIND_ACTION_GET_TITLE(cbs, action_get_title_deferred_history_list); BIND_ACTION_GET_TITLE(cbs, action_get_title_deferred_history_list);
break; break;

View File

@ -9725,6 +9725,14 @@ static void materialui_list_insert(
node->icon_texture_index = MUI_TEXTURE_CORES; node->icon_texture_index = MUI_TEXTURE_CORES;
node->icon_type = MUI_ICON_TYPE_INTERNAL; node->icon_type = MUI_ICON_TYPE_INTERNAL;
break; 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_THUMBNAIL_CONTENT:
case FILE_TYPE_DOWNLOAD_PL_THUMBNAIL_CONTENT: case FILE_TYPE_DOWNLOAD_PL_THUMBNAIL_CONTENT:
node->icon_texture_index = MUI_TEXTURE_IMAGE; 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_CORE_DELETE_BACKUP:
case MENU_SETTING_ACTION_VIDEO_FILTER_REMOVE: case MENU_SETTING_ACTION_VIDEO_FILTER_REMOVE:
case MENU_SETTING_ACTION_AUDIO_DSP_PLUGIN_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_texture_index = MUI_TEXTURE_REMOVE;
node->icon_type = MUI_ICON_TYPE_INTERNAL; node->icon_type = MUI_ICON_TYPE_INTERNAL;
break; break;
case MENU_SETTING_ACTION_CORE_CREATE_BACKUP: 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_texture_index = MUI_TEXTURE_SAVE_STATE;
node->icon_type = MUI_ICON_TYPE_INTERNAL; node->icon_type = MUI_ICON_TYPE_INTERNAL;
break; break;
@ -9891,11 +9903,6 @@ static void materialui_list_insert(
node->icon_texture_index = MUI_TEXTURE_CLOSE; node->icon_texture_index = MUI_TEXTURE_CLOSE;
node->icon_type = MUI_ICON_TYPE_INTERNAL; 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))) 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; 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]; return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SETTING];
case MENU_ENUM_LABEL_SAVE_STATE: case MENU_ENUM_LABEL_SAVE_STATE:
case MENU_ENUM_LABEL_CORE_CREATE_BACKUP: 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]; return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_SAVESTATE];
case MENU_ENUM_LABEL_LOAD_STATE: case MENU_ENUM_LABEL_LOAD_STATE:
case MENU_ENUM_LABEL_CORE_RESTORE_BACKUP_LIST: 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_CORE_DELETE_BACKUP_LIST:
case MENU_ENUM_LABEL_VIDEO_FILTER_REMOVE: case MENU_ENUM_LABEL_VIDEO_FILTER_REMOVE:
case MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN_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]; return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CLOSE];
case MENU_ENUM_LABEL_CORE_LOCK: case MENU_ENUM_LABEL_CORE_LOCK:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE]; 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]; return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_CORE_INFO];
case MENU_SETTING_ACTION_CORE_OPTIONS: case MENU_SETTING_ACTION_CORE_OPTIONS:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_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: case MENU_SETTING_ACTION_CORE_INPUT_REMAPPING_OPTIONS:
return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_REMAPPING_OPTIONS]; return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_REMAPPING_OPTIONS];
case MENU_SETTING_ACTION_CORE_CHEAT_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_CORE_OPTIONS:
case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE:
return stripes->textures.list[STRIPES_TEXTURE_CORE_OPTIONS]; 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:
case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST: case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST:
return stripes->textures.list[STRIPES_TEXTURE_ADD_FAVORITE]; 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_CORE_OPTIONS:
case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE:
return xmb->textures.list[XMB_TEXTURE_CORE_OPTIONS]; 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:
case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST: case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST:
return xmb->textures.list[XMB_TEXTURE_ADD_FAVORITE]; 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_SAVE_STATE:
case MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE: case MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE:
case MENU_ENUM_LABEL_CORE_CREATE_BACKUP: 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]; return xmb->textures.list[XMB_TEXTURE_SAVESTATE];
case MENU_ENUM_LABEL_LOAD_STATE: case MENU_ENUM_LABEL_LOAD_STATE:
case MENU_ENUM_LABEL_CONFIGURATIONS: 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_CORE_DELETE_BACKUP_LIST:
case MENU_ENUM_LABEL_VIDEO_FILTER_REMOVE: case MENU_ENUM_LABEL_VIDEO_FILTER_REMOVE:
case MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN_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]; return xmb->textures.list[XMB_TEXTURE_CLOSE];
case MENU_ENUM_LABEL_CORE_LOCK: case MENU_ENUM_LABEL_CORE_LOCK:
return xmb->textures.list[XMB_TEXTURE_CORE]; 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_LIST,
ACTION_OK_DL_MANUAL_CONTENT_SCAN_DAT_FILE, ACTION_OK_DL_MANUAL_CONTENT_SCAN_DAT_FILE,
ACTION_OK_DL_CORE_RESTORE_BACKUP_LIST, 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 */ /* Function callbacks */

View File

@ -900,6 +900,80 @@ static unsigned menu_displaylist_parse_core_manager_list(
return count; 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) static unsigned menu_displaylist_parse_system_info(file_list_t *list)
{ {
int controller; 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_VALUE_CORE_OPTIONS),
msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS), msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTIONS),
MENU_ENUM_LABEL_CORE_OPTIONS, MENU_ENUM_LABEL_CORE_OPTIONS,
MENU_SETTING_ACTION, 0, 0)) MENU_SETTING_ACTION_CORE_OPTIONS, 0, 0))
count++; 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); rarch_ctl(RARCH_CTL_GET_CORE_OPTION_SIZE, &num_opts);
if (game_specific_options) if (game_specific_options)
{
if (!rarch_ctl(RARCH_CTL_IS_GAME_OPTIONS_ACTIVE, NULL))
{
if (menu_entries_append_enum(info->list, if (menu_entries_append_enum(info->list,
msg_hash_to_str( msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_OPTION_OVERRIDE_LIST),
MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE), msg_hash_to_str(MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST),
msg_hash_to_str( MENU_ENUM_LABEL_CORE_OPTION_OVERRIDE_LIST,
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE), MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST, 0, 0))
MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS_CREATE,
MENU_SETTINGS_CORE_OPTION_CREATE, 0, 0))
count++; 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 (num_opts != 0) if (num_opts != 0)
{ {
@ -11161,6 +11219,29 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
info->need_push = true; info->need_push = true;
} }
break; 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: case DISPLAYLIST_ARCHIVE_ACTION:
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
#ifdef HAVE_COMPRESSION #ifdef HAVE_COMPRESSION

View File

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

View File

@ -55,7 +55,6 @@ RETRO_BEGIN_DECLS
#define MENU_SETTINGS_CORE_INFO_NONE 0xffff #define MENU_SETTINGS_CORE_INFO_NONE 0xffff
#define MENU_SETTINGS_CORE_OPTION_NONE 0xffff #define MENU_SETTINGS_CORE_OPTION_NONE 0xffff
#define MENU_SETTINGS_CHEEVOS_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_CORE_OPTION_START 0x10000
#define MENU_SETTINGS_CHEEVOS_START 0x40000 #define MENU_SETTINGS_CHEEVOS_START 0x40000
#define MENU_SETTINGS_NETPLAY_ROOMS_START 0x80000 #define MENU_SETTINGS_NETPLAY_ROOMS_START 0x80000
@ -108,6 +107,7 @@ enum menu_settings_type
MENU_SETTING_ACTION_CLOSE, MENU_SETTING_ACTION_CLOSE,
MENU_SETTING_ACTION_CLOSE_HORIZONTAL, MENU_SETTING_ACTION_CLOSE_HORIZONTAL,
MENU_SETTING_ACTION_CORE_OPTIONS, MENU_SETTING_ACTION_CORE_OPTIONS,
MENU_SETTING_ACTION_CORE_OPTION_OVERRIDE_LIST,
MENU_SETTING_ACTION_CORE_INPUT_REMAPPING_OPTIONS, MENU_SETTING_ACTION_CORE_INPUT_REMAPPING_OPTIONS,
MENU_SETTING_ACTION_CORE_CHEAT_OPTIONS, MENU_SETTING_ACTION_CORE_CHEAT_OPTIONS,
MENU_SETTING_ACTION_CORE_MANAGER_OPTIONS, MENU_SETTING_ACTION_CORE_MANAGER_OPTIONS,
@ -233,6 +233,11 @@ enum menu_settings_type
MENU_SETTING_ACTION_VIDEO_FILTER_REMOVE, MENU_SETTING_ACTION_VIDEO_FILTER_REMOVE,
MENU_SETTING_ACTION_AUDIO_DSP_PLUGIN_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 MENU_SETTINGS_LAST
}; };

View File

@ -353,7 +353,9 @@ enum msg_hash_enums
MSG_ERROR_REMOVING_SHADER_PRESET, MSG_ERROR_REMOVING_SHADER_PRESET,
MSG_FAILED_TO_CREATE_THE_DIRECTORY, MSG_FAILED_TO_CREATE_THE_DIRECTORY,
MSG_ERROR_SAVING_CORE_OPTIONS_FILE, MSG_ERROR_SAVING_CORE_OPTIONS_FILE,
MSG_ERROR_REMOVING_CORE_OPTIONS_FILE,
MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY,
MSG_CORE_OPTIONS_FILE_REMOVED_SUCCESSFULLY,
MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, MSG_DECOMPRESSION_ALREADY_IN_PROGRESS,
MSG_DECOMPRESSION_FAILED, MSG_DECOMPRESSION_FAILED,
MSG_DISK_EJECTED, MSG_DISK_EJECTED,
@ -1534,6 +1536,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST, MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_LIST,
MENU_ENUM_LABEL_DEFERRED_CORE_RESTORE_BACKUP_LIST, MENU_ENUM_LABEL_DEFERRED_CORE_RESTORE_BACKUP_LIST,
MENU_ENUM_LABEL_DEFERRED_CORE_DELETE_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_USER_BINDS_LIST,
MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_CHEEVOS_LIST, MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_CHEEVOS_LIST,
MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_TWITCH_LIST, MENU_ENUM_LABEL_DEFERRED_ACCOUNTS_TWITCH_LIST,
@ -1692,8 +1695,21 @@ enum msg_hash_enums
MENU_LABEL(BLOCK_SRAM_OVERWRITE), MENU_LABEL(BLOCK_SRAM_OVERWRITE),
MENU_LABEL(GAME_SPECIFIC_OPTIONS), 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_CREATE),
MENU_LABEL(GAME_SPECIFIC_OPTIONS_IN_USE), MENU_LABEL(GAME_SPECIFIC_OPTIONS_IN_USE),
MENU_LABEL(AUTO_OVERRIDES_ENABLE), MENU_LABEL(AUTO_OVERRIDES_ENABLE),
MENU_LABEL(AUTO_REMAPS_ENABLE), MENU_LABEL(AUTO_REMAPS_ENABLE),
MENU_LABEL(GLOBAL_CORE_OPTIONS), 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)) else if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_resolve_relative( fill_pathname_resolve_relative(
global_options_path, path_get(RARCH_PATH_CONFIG), 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 */ /* Allocate correct path/src_path strings */
@ -38796,42 +38796,220 @@ static void set_gamepad_input_override(struct rarch_state *p_rarch,
} }
#endif #endif
/* creates folder and core options stub file for subsequent runs */ /* Creates folder and core options stub file for subsequent runs */
bool create_folder_and_core_options(void) bool core_options_create_override(bool game_specific)
{ {
char game_path[PATH_MAX_LENGTH]; char options_path[PATH_MAX_LENGTH];
config_file_t *conf = NULL; config_file_t *conf = NULL;
struct rarch_state *p_rarch = &rarch_st; 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( if (!retroarch_validate_game_options(options_path,
msg_hash_to_str(MSG_ERROR_SAVING_CORE_OPTIONS_FILE), sizeof(options_path), true))
1, 100, true, goto error;
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
return false;
} }
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())) 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( runloop_msg_queue_push(
msg_hash_to_str(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY), msg_hash_to_str(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY),
1, 100, true, 1, 100, true,
NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
path_set(RARCH_PATH_CORE_OPTIONS, game_path); path_set(RARCH_PATH_CORE_OPTIONS, options_path);
p_rarch->runloop_game_options_active = true; p_rarch->runloop_game_options_active = game_specific;
p_rarch->runloop_folder_options_active = false; 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); 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; 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[], 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); void *input_driver_init_wrap(input_driver_t *input, const char *name);
/* creates folder and core options stub file for subsequent runs */ /* Creates folder and core options stub file for subsequent runs */
bool create_folder_and_core_options(void); bool core_options_create_override(bool game_specific);
bool core_options_remove_override(bool game_specific);
typedef enum apple_view_type typedef enum apple_view_type
{ {

View File

@ -34,6 +34,7 @@ extern "C" {
#include "../../../paths.h" #include "../../../paths.h"
#include "../../../file_path_special.h" #include "../../../file_path_special.h"
#include "../../../core_option_manager.h" #include "../../../core_option_manager.h"
#include "../../../menu/menu_driver.h"
#ifndef CXX_BUILD #ifndef CXX_BUILD
} }
@ -122,8 +123,32 @@ void CoreOptionsDialog::reload()
void CoreOptionsDialog::onSaveGameSpecificOptions() 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)); 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) void CoreOptionsDialog::onCoreOptionComboBoxCurrentIndexChanged(int index)

View File

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