Step#1 to add per-folder core options (#11843)

This commit is contained in:
crystalct 2021-02-23 18:59:11 +01:00 committed by GitHub
parent b8f84b8fa1
commit 1687d4a90b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 105 additions and 31 deletions

View File

@ -10941,7 +10941,11 @@ MSG_HASH(
) )
MSG_HASH( MSG_HASH(
MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT,
"Per-Game Options: game-specific core options found at" "[Core Options]: Game-specific core options found at"
)
MSG_HASH(
MSG_FOLDER_SPECIFIC_CORE_OPTIONS_FOUND_AT,
"[Core Options]: Folder-specific core options found at"
) )
MSG_HASH( MSG_HASH(
MSG_GOT_INVALID_DISK_INDEX, MSG_GOT_INVALID_DISK_INDEX,

View File

@ -277,6 +277,7 @@ enum msg_hash_enums
MSG_FAILED_TO_SEND_NICKNAME, MSG_FAILED_TO_SEND_NICKNAME,
MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT, MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT,
MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT,
MSG_FOLDER_SPECIFIC_CORE_OPTIONS_FOUND_AT,
MSG_INVALID_NICKNAME_SIZE, MSG_INVALID_NICKNAME_SIZE,
MSG_VERSION_OF_LIBRETRO_API, MSG_VERSION_OF_LIBRETRO_API,
MSG_COMPILED_AGAINST_API, MSG_COMPILED_AGAINST_API,

View File

@ -34800,7 +34800,13 @@ static bool retroarch_validate_per_core_options(char *s,
const char *core_name, const char *game_name) const char *core_name, const char *game_name)
{ {
char config_directory[PATH_MAX_LENGTH]; char config_directory[PATH_MAX_LENGTH];
config_directory[0] = '\0'; config_directory[0] = '\0';
if (!s ||
(len < 1) ||
string_is_empty(core_name) ||
string_is_empty(game_name))
return false;
fill_pathname_application_special(config_directory, fill_pathname_application_special(config_directory,
sizeof(config_directory), APPLICATION_SPECIAL_DIRECTORY_CONFIG); sizeof(config_directory), APPLICATION_SPECIAL_DIRECTORY_CONFIG);
@ -34827,15 +34833,31 @@ static bool retroarch_validate_per_core_options(char *s,
static bool retroarch_validate_game_options(char *s, size_t len, bool mkdir) static bool retroarch_validate_game_options(char *s, size_t len, bool mkdir)
{ {
struct rarch_state *p_rarch = &rarch_st; struct rarch_state *p_rarch = &rarch_st;
const char *core_name = p_rarch->runloop_system.info.library_name; const char *core_name = p_rarch->runloop_system.info.library_name;
const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME)); const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME));
if (string_is_empty(core_name) || string_is_empty(game_name))
return false;
return retroarch_validate_per_core_options(s, len, mkdir, return retroarch_validate_per_core_options(s, len, mkdir,
core_name, game_name); core_name, game_name);
}
static bool retroarch_validate_folder_options(char *s, size_t len, bool mkdir)
{
struct rarch_state *p_rarch = &rarch_st;
const char *core_name = p_rarch->runloop_system.info.library_name;
const char *game_path = path_get(RARCH_PATH_BASENAME);
char folder_name[PATH_MAX_LENGTH];
folder_name[0] = '\0';
if (string_is_empty(game_path))
return false;
fill_pathname_parent_dir_name(folder_name,
game_path, sizeof(folder_name));
return retroarch_validate_per_core_options(s, len, mkdir,
core_name, folder_name);
} }
/* Validates CPU features for given processor architecture. /* Validates CPU features for given processor architecture.
@ -35358,18 +35380,42 @@ void retroarch_menu_running_finished(bool quit)
**/ **/
static bool rarch_game_specific_options(char **output) static bool rarch_game_specific_options(char **output)
{ {
char game_path[PATH_MAX_LENGTH]; char game_options_path[PATH_MAX_LENGTH];
game_options_path[0] ='\0';
game_path[0] ='\0'; if (!retroarch_validate_game_options(game_options_path,
sizeof(game_options_path), false) ||
if (!retroarch_validate_game_options(game_path, !path_is_valid(game_options_path))
sizeof(game_path), false) || !path_is_valid(game_path))
return false; return false;
RARCH_LOG("%s %s\n", RARCH_LOG("%s %s\n",
msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT),
game_path); game_options_path);
*output = strdup(game_path); *output = strdup(game_options_path);
return true;
}
/**
* rarch_folder_specific_options:
*
* Returns: true (1) if a folder specific core
* options path has been found,
* otherwise false (0).
**/
static bool rarch_folder_specific_options(char **output)
{
char folder_options_path[PATH_MAX_LENGTH];
folder_options_path[0] ='\0';
if (!retroarch_validate_folder_options(folder_options_path,
sizeof(folder_options_path), false) ||
!path_is_valid(folder_options_path))
return false;
RARCH_LOG("%s %s\n",
msg_hash_to_str(MSG_FOLDER_SPECIFIC_CORE_OPTIONS_FOUND_AT),
folder_options_path);
*output = strdup(folder_options_path);
return true; return true;
} }
@ -35427,6 +35473,8 @@ static void rarch_init_core_options_path(
char *src_path, size_t src_len) char *src_path, size_t src_len)
{ {
char *game_options_path = NULL; char *game_options_path = NULL;
char *folder_options_path = NULL;
settings_t *settings = p_rarch->configuration_settings; settings_t *settings = p_rarch->configuration_settings;
bool game_specific_options = settings->bools.game_specific_options; bool game_specific_options = settings->bools.game_specific_options;
@ -35438,18 +35486,34 @@ static void rarch_init_core_options_path(
/* Check whether game-specific options exist */ /* Check whether game-specific options exist */
if (game_specific_options && if (game_specific_options &&
rarch_game_specific_options(&game_options_path)) rarch_game_specific_options(&game_options_path))
{ {
/* Notify system that we have a valid core options /* Notify system that we have a valid core options
* override */ * override */
path_set(RARCH_PATH_CORE_OPTIONS, game_options_path); path_set(RARCH_PATH_CORE_OPTIONS, game_options_path);
p_rarch->runloop_game_options_active = true; p_rarch->runloop_game_options_active = true;
p_rarch->runloop_folder_options_active = false;
/* Copy options path */ /* Copy options path */
strlcpy(path, game_options_path, len); strlcpy(path, game_options_path, len);
free(game_options_path); free(game_options_path);
} }
/* Check whether folder-specific options exist */
else if (game_specific_options &&
rarch_folder_specific_options(&folder_options_path))
{
/* Notify system that we have a valid core options
* override */
path_set(RARCH_PATH_CORE_OPTIONS, folder_options_path);
p_rarch->runloop_game_options_active = false;
p_rarch->runloop_folder_options_active = true;
/* Copy options path */
strlcpy(path, folder_options_path, len);
free(folder_options_path);
}
else else
{ {
char global_options_path[PATH_MAX_LENGTH]; char global_options_path[PATH_MAX_LENGTH];
@ -35468,14 +35532,9 @@ static void rarch_init_core_options_path(
* > if retroarch_validate_per_core_options() returns * > if retroarch_validate_per_core_options() returns
* false, then per-core options are disabled (due to * false, then per-core options are disabled (due to
* unknown system errors...) */ * unknown system errors...) */
per_core_options = retroarch_validate_per_core_options(
if (string_is_empty(core_name)) per_core_options_path, sizeof(per_core_options_path), true,
per_core_options = false; core_name, core_name);
else
per_core_options = retroarch_validate_per_core_options(
per_core_options_path, sizeof(per_core_options_path), true,
core_name, core_name
);
/* If we can use per-core options, check whether an options /* If we can use per-core options, check whether an options
* file already exists */ * file already exists */
@ -35511,7 +35570,8 @@ static void rarch_init_core_options_path(
/* Notify system that we *do not* have a valid core options /* Notify system that we *do not* have a valid core options
* options override */ * options override */
p_rarch->runloop_game_options_active = false; p_rarch->runloop_game_options_active = false;
p_rarch->runloop_folder_options_active = false;
} }
} }
@ -35725,6 +35785,8 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data)
return p_rarch->runloop_missing_bios; return p_rarch->runloop_missing_bios;
case RARCH_CTL_IS_GAME_OPTIONS_ACTIVE: case RARCH_CTL_IS_GAME_OPTIONS_ACTIVE:
return p_rarch->runloop_game_options_active; return p_rarch->runloop_game_options_active;
case RARCH_CTL_IS_FOLDER_OPTIONS_ACTIVE:
return p_rarch->runloop_folder_options_active;
case RARCH_CTL_GET_PERFCNT: case RARCH_CTL_GET_PERFCNT:
{ {
bool **perfcnt = (bool**)data; bool **perfcnt = (bool**)data;
@ -35845,7 +35907,8 @@ static void retroarch_deinit_core_options(struct rarch_state *p_rarch)
core_option_manager_flush( core_option_manager_flush(
conf_tmp, conf_tmp,
p_rarch->runloop_core_options); p_rarch->runloop_core_options);
RARCH_LOG("[Core Options]: Saved game-specific core options to \"%s\"\n", path); RARCH_LOG("[Core Options]: Saved %s-specific core options to \"%s\"\n",
p_rarch->runloop_game_options_active ? "game" : "folder", path);
config_file_write(conf_tmp, path, true); config_file_write(conf_tmp, path, true);
config_file_free(conf_tmp); config_file_free(conf_tmp);
conf_tmp = NULL; conf_tmp = NULL;
@ -35862,12 +35925,12 @@ static void retroarch_deinit_core_options(struct rarch_state *p_rarch)
config_file_write(p_rarch->runloop_core_options->conf, path, true); config_file_write(p_rarch->runloop_core_options->conf, path, true);
} }
if (p_rarch->runloop_game_options_active) p_rarch->runloop_game_options_active = false;
p_rarch->runloop_game_options_active = false; p_rarch->runloop_folder_options_active = false;
if (p_rarch->runloop_core_options) if (p_rarch->runloop_core_options)
core_option_manager_free(p_rarch->runloop_core_options); core_option_manager_free(p_rarch->runloop_core_options);
p_rarch->runloop_core_options = NULL; p_rarch->runloop_core_options = NULL;
} }
static void retroarch_init_core_variables( static void retroarch_init_core_variables(
@ -38738,6 +38801,7 @@ bool create_folder_and_core_options(void)
{ {
char game_path[PATH_MAX_LENGTH]; char game_path[PATH_MAX_LENGTH];
config_file_t *conf = NULL; config_file_t *conf = NULL;
struct rarch_state *p_rarch = &rarch_st;
game_path[0] = '\0'; game_path[0] = '\0';
@ -38760,7 +38824,10 @@ bool create_folder_and_core_options(void)
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, game_path);
p_rarch->runloop_game_options_active = true;
p_rarch->runloop_folder_options_active = false;
} }
config_file_free(conf); config_file_free(conf);

View File

@ -139,6 +139,7 @@ enum rarch_ctl_state
RARCH_CTL_UNSET_MISSING_BIOS, RARCH_CTL_UNSET_MISSING_BIOS,
RARCH_CTL_IS_GAME_OPTIONS_ACTIVE, RARCH_CTL_IS_GAME_OPTIONS_ACTIVE,
RARCH_CTL_IS_FOLDER_OPTIONS_ACTIVE,
RARCH_CTL_IS_PAUSED, RARCH_CTL_IS_PAUSED,
RARCH_CTL_SET_PAUSED, RARCH_CTL_SET_PAUSED,

View File

@ -2272,6 +2272,7 @@ struct rarch_state
bool runloop_remaps_content_dir_active; bool runloop_remaps_content_dir_active;
#endif #endif
bool runloop_game_options_active; bool runloop_game_options_active;
bool runloop_folder_options_active;
bool runloop_autosave; bool runloop_autosave;
#ifdef HAVE_SCREENSHOTS #ifdef HAVE_SCREENSHOTS
bool runloop_max_frames_screenshot; bool runloop_max_frames_screenshot;