mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
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:
commit
3dda581e41
@ -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"
|
||||
|
@ -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."
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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];
|
||||
|
@ -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];
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
16
msg_hash.h
16
msg_hash.h
@ -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),
|
||||
|
216
retroarch.c
216
retroarch.c
@ -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[],
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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)
|
||||
|
@ -26,6 +26,7 @@ private slots:
|
||||
void clearLayout();
|
||||
void buildLayout();
|
||||
void onSaveGameSpecificOptions();
|
||||
void onSaveFolderSpecificOptions();
|
||||
void onCoreOptionComboBoxCurrentIndexChanged(int index);
|
||||
void onCoreOptionResetClicked();
|
||||
void onCoreOptionResetAllClicked();
|
||||
|
Loading…
x
Reference in New Issue
Block a user