cleaner implementation of save file / save state sorting
This commit is contained in:
parent
34cf3c6a13
commit
a0fe04ead5
|
@ -1,6 +1,6 @@
|
||||||
/* RetroArch - A frontend for libretro.
|
/* RetroArch - A frontend for libretro.
|
||||||
* Copyright (C) 2011-2015 - Daniel De Matteis
|
* Copyright (C) 2011-2015 - Daniel De Matteis
|
||||||
*
|
*
|
||||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU General Public License as published by the Free Software Found-
|
* of the GNU General Public License as published by the Free Software Found-
|
||||||
* ation, either version 3 of the License, or (at your option) any later version.
|
* ation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
@ -225,7 +225,7 @@ static void event_disk_control_set_eject(bool new_state, bool print_log)
|
||||||
char msg[PATH_MAX_LENGTH] = {0};
|
char msg[PATH_MAX_LENGTH] = {0};
|
||||||
bool error = false;
|
bool error = false;
|
||||||
rarch_system_info_t *info = rarch_system_info_get_ptr();
|
rarch_system_info_t *info = rarch_system_info_get_ptr();
|
||||||
const struct retro_disk_control_callback *control =
|
const struct retro_disk_control_callback *control =
|
||||||
info ? (const struct retro_disk_control_callback*)&info->disk_control : NULL;
|
info ? (const struct retro_disk_control_callback*)&info->disk_control : NULL;
|
||||||
|
|
||||||
if (!control || !control->get_num_images)
|
if (!control || !control->get_num_images)
|
||||||
|
@ -283,7 +283,7 @@ static void event_disk_control_set_index(unsigned idx)
|
||||||
unsigned num_disks;
|
unsigned num_disks;
|
||||||
char msg[PATH_MAX_LENGTH] = {0};
|
char msg[PATH_MAX_LENGTH] = {0};
|
||||||
rarch_system_info_t *info = rarch_system_info_get_ptr();
|
rarch_system_info_t *info = rarch_system_info_get_ptr();
|
||||||
const struct retro_disk_control_callback *control =
|
const struct retro_disk_control_callback *control =
|
||||||
info ? (const struct retro_disk_control_callback*)&info->disk_control : NULL;
|
info ? (const struct retro_disk_control_callback*)&info->disk_control : NULL;
|
||||||
bool error = false;
|
bool error = false;
|
||||||
|
|
||||||
|
@ -549,14 +549,6 @@ static void event_deinit_core(bool reinit)
|
||||||
if (reinit)
|
if (reinit)
|
||||||
event_command(EVENT_CMD_DRIVERS_DEINIT);
|
event_command(EVENT_CMD_DRIVERS_DEINIT);
|
||||||
|
|
||||||
/* per-core saves: restore the original path so the config is not affected */
|
|
||||||
if(settings->sort_savefiles_enable)
|
|
||||||
strlcpy(global->dir.savefile, orig_savefile_dir,
|
|
||||||
sizeof(global->dir.savefile));
|
|
||||||
if(settings->sort_savestates_enable)
|
|
||||||
strlcpy(global->dir.savestate, orig_savestate_dir,
|
|
||||||
sizeof(global->dir.savestate));
|
|
||||||
|
|
||||||
/* auto overrides: reload the original config */
|
/* auto overrides: reload the original config */
|
||||||
if(global->overrides_active)
|
if(global->overrides_active)
|
||||||
{
|
{
|
||||||
|
@ -696,7 +688,7 @@ static bool event_init_content(void)
|
||||||
|
|
||||||
/* No content to be loaded for dummy core,
|
/* No content to be loaded for dummy core,
|
||||||
* just successfully exit. */
|
* just successfully exit. */
|
||||||
if (global->inited.core.type == CORE_TYPE_DUMMY)
|
if (global->inited.core.type == CORE_TYPE_DUMMY)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!global->inited.core.no_content)
|
if (!global->inited.core.no_content)
|
||||||
|
@ -727,21 +719,13 @@ static bool event_init_core(void)
|
||||||
driver_t *driver = driver_get_ptr();
|
driver_t *driver = driver_get_ptr();
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
/* per-core saves: save the original path */
|
|
||||||
if(orig_savefile_dir[0] == '\0')
|
|
||||||
strlcpy(orig_savefile_dir, global->dir.savefile,
|
|
||||||
sizeof(orig_savefile_dir));
|
|
||||||
if(orig_savestate_dir[0] == '\0')
|
|
||||||
strlcpy(orig_savestate_dir, global->dir.savestate,
|
|
||||||
sizeof(orig_savestate_dir));
|
|
||||||
|
|
||||||
/* auto overrides: apply overrides */
|
/* auto overrides: apply overrides */
|
||||||
if(settings->auto_overrides_enable)
|
if(settings->auto_overrides_enable)
|
||||||
{
|
{
|
||||||
if (config_load_override())
|
if (config_load_override())
|
||||||
global->overrides_active = true;
|
global->overrides_active = true;
|
||||||
else
|
else
|
||||||
global->overrides_active = false;
|
global->overrides_active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reset video format to libretro's default */
|
/* reset video format to libretro's default */
|
||||||
|
@ -754,7 +738,7 @@ static bool event_init_core(void)
|
||||||
config_load_remap();
|
config_load_remap();
|
||||||
|
|
||||||
/* per-core saves: reset redirection paths */
|
/* per-core saves: reset redirection paths */
|
||||||
if((settings->sort_savestates_enable || settings->sort_savefiles_enable) && !global->inited.core.no_content)
|
if((settings->sort_savestates_enable || settings->sort_savefiles_enable) && !global->inited.core.no_content)
|
||||||
set_paths_redirect(global->name.base);
|
set_paths_redirect(global->name.base);
|
||||||
|
|
||||||
rarch_ctl(RARCH_ACTION_STATE_VERIFY_API_VERSION, NULL);
|
rarch_ctl(RARCH_ACTION_STATE_VERIFY_API_VERSION, NULL);
|
||||||
|
@ -779,7 +763,7 @@ static bool event_save_auto_state(void)
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
global_t *global = global_get_ptr();
|
global_t *global = global_get_ptr();
|
||||||
|
|
||||||
if (!settings->savestate_auto_save ||
|
if (!settings->savestate_auto_save ||
|
||||||
(global->inited.core.type == CORE_TYPE_DUMMY) ||
|
(global->inited.core.type == CORE_TYPE_DUMMY) ||
|
||||||
global->inited.core.no_content)
|
global->inited.core.no_content)
|
||||||
return false;
|
return false;
|
||||||
|
@ -1090,7 +1074,7 @@ bool event_command(enum event_command cmd)
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case EVENT_CMD_LOAD_STATE:
|
case EVENT_CMD_LOAD_STATE:
|
||||||
/* Immutable - disallow savestate load when
|
/* Immutable - disallow savestate load when
|
||||||
* we absolutely cannot change game state. */
|
* we absolutely cannot change game state. */
|
||||||
if (global->bsv.movie)
|
if (global->bsv.movie)
|
||||||
return false;
|
return false;
|
||||||
|
@ -1175,7 +1159,7 @@ bool event_command(enum event_command cmd)
|
||||||
{
|
{
|
||||||
const struct retro_hw_render_callback *hw_render =
|
const struct retro_hw_render_callback *hw_render =
|
||||||
(const struct retro_hw_render_callback*)video_driver_callback();
|
(const struct retro_hw_render_callback*)video_driver_callback();
|
||||||
const input_driver_t *input = driver ?
|
const input_driver_t *input = driver ?
|
||||||
(const input_driver_t*)driver->input : NULL;
|
(const input_driver_t*)driver->input : NULL;
|
||||||
|
|
||||||
driver->video_cache_context = hw_render->cache_context;
|
driver->video_cache_context = hw_render->cache_context;
|
||||||
|
@ -1611,7 +1595,7 @@ bool event_command(enum event_command cmd)
|
||||||
if (!video_driver_has_windowed())
|
if (!video_driver_has_windowed())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* If we go fullscreen we drop all drivers and
|
/* If we go fullscreen we drop all drivers and
|
||||||
* reinitialize to be safe. */
|
* reinitialize to be safe. */
|
||||||
settings->video.fullscreen = !settings->video.fullscreen;
|
settings->video.fullscreen = !settings->video.fullscreen;
|
||||||
event_command(EVENT_CMD_REINIT);
|
event_command(EVENT_CMD_REINIT);
|
||||||
|
@ -1657,7 +1641,7 @@ bool event_command(enum event_command cmd)
|
||||||
case EVENT_CMD_DISK_EJECT_TOGGLE:
|
case EVENT_CMD_DISK_EJECT_TOGGLE:
|
||||||
if (system && system->disk_control.get_num_images)
|
if (system && system->disk_control.get_num_images)
|
||||||
{
|
{
|
||||||
const struct retro_disk_control_callback *control =
|
const struct retro_disk_control_callback *control =
|
||||||
(const struct retro_disk_control_callback*)
|
(const struct retro_disk_control_callback*)
|
||||||
&system->disk_control;
|
&system->disk_control;
|
||||||
|
|
||||||
|
@ -1672,7 +1656,7 @@ bool event_command(enum event_command cmd)
|
||||||
case EVENT_CMD_DISK_NEXT:
|
case EVENT_CMD_DISK_NEXT:
|
||||||
if (system && system->disk_control.get_num_images)
|
if (system && system->disk_control.get_num_images)
|
||||||
{
|
{
|
||||||
const struct retro_disk_control_callback *control =
|
const struct retro_disk_control_callback *control =
|
||||||
(const struct retro_disk_control_callback*)
|
(const struct retro_disk_control_callback*)
|
||||||
&system->disk_control;
|
&system->disk_control;
|
||||||
|
|
||||||
|
@ -1692,7 +1676,7 @@ bool event_command(enum event_command cmd)
|
||||||
case EVENT_CMD_DISK_PREV:
|
case EVENT_CMD_DISK_PREV:
|
||||||
if (system && system->disk_control.get_num_images)
|
if (system && system->disk_control.get_num_images)
|
||||||
{
|
{
|
||||||
const struct retro_disk_control_callback *control =
|
const struct retro_disk_control_callback *control =
|
||||||
(const struct retro_disk_control_callback*)
|
(const struct retro_disk_control_callback*)
|
||||||
&system->disk_control;
|
&system->disk_control;
|
||||||
|
|
||||||
|
|
|
@ -41,14 +41,6 @@ void main_exit_save_config(void)
|
||||||
|
|
||||||
if (settings->config_save_on_exit && *global->path.config)
|
if (settings->config_save_on_exit && *global->path.config)
|
||||||
{
|
{
|
||||||
/* restore original paths in case per-core organization is enabled */
|
|
||||||
if (settings->sort_savefiles_enable && orig_savefile_dir[0] != '\0')
|
|
||||||
strlcpy(global->dir.savefile, orig_savefile_dir,
|
|
||||||
sizeof(global->dir.savefile));
|
|
||||||
if (settings->sort_savestates_enable && orig_savestate_dir[0] != '\0')
|
|
||||||
strlcpy(global->dir.savestate, orig_savestate_dir,
|
|
||||||
sizeof(global->dir.savestate));
|
|
||||||
|
|
||||||
/* Save last core-specific config to the default config location,
|
/* Save last core-specific config to the default config location,
|
||||||
* needed on consoles for core switching and reusing last good
|
* needed on consoles for core switching and reusing last good
|
||||||
* config for new cores.
|
* config for new cores.
|
||||||
|
|
69
retroarch.c
69
retroarch.c
|
@ -54,8 +54,9 @@
|
||||||
#include "menu/menu_hash.h"
|
#include "menu/menu_hash.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char orig_savestate_dir[PATH_MAX_LENGTH];
|
char current_savestate_dir[PATH_MAX_LENGTH];
|
||||||
char orig_savefile_dir[PATH_MAX_LENGTH];
|
char current_savefile_dir[PATH_MAX_LENGTH];
|
||||||
|
|
||||||
|
|
||||||
/* Descriptive names for options without short variant. Please keep the name in
|
/* Descriptive names for options without short variant. Please keep the name in
|
||||||
sync with the option name. Order does not matter. */
|
sync with the option name. Order does not matter. */
|
||||||
|
@ -333,62 +334,66 @@ void set_paths_redirect(const char *path)
|
||||||
/* per-core saves: append the library_name to the save location */
|
/* per-core saves: append the library_name to the save location */
|
||||||
if (settings->sort_savefiles_enable && global->dir.savefile[0] != '\0')
|
if (settings->sort_savefiles_enable && global->dir.savefile[0] != '\0')
|
||||||
{
|
{
|
||||||
strlcpy(orig_savefile_dir,global->dir.savefile,
|
fill_pathname_join(
|
||||||
sizeof(orig_savefile_dir));
|
current_savefile_dir,
|
||||||
fill_pathname_dir(
|
|
||||||
global->dir.savefile,
|
|
||||||
global->dir.savefile,
|
global->dir.savefile,
|
||||||
info->info.library_name,
|
info->info.library_name,
|
||||||
sizeof(global->dir.savefile));
|
sizeof(global->dir.savefile));
|
||||||
|
|
||||||
/* If path doesn't exist, try to create it,
|
/* If path doesn't exist, try to create it,
|
||||||
* if everything fails revert to the original path. */
|
* if everything fails revert to the original path. */
|
||||||
if(!path_is_directory(global->dir.savefile) && global->dir.savefile[0] != '\0')
|
if(!path_is_directory(current_savefile_dir) && current_savefile_dir[0] != '\0')
|
||||||
{
|
{
|
||||||
path_mkdir(global->dir.savefile);
|
path_mkdir(current_savefile_dir);
|
||||||
if(!path_is_directory(global->dir.savefile))
|
if(!path_is_directory(current_savefile_dir))
|
||||||
{
|
{
|
||||||
RARCH_LOG("Reverting savefile directory to %s\n", orig_savefile_dir);
|
RARCH_LOG("Reverting savefile directory to %s\n", global->dir.savefile);
|
||||||
strlcpy(global->dir.savefile,
|
strlcpy(current_savefile_dir,
|
||||||
orig_savefile_dir,
|
global->dir.savefile,
|
||||||
sizeof(global->dir.savefile));
|
sizeof(current_savefile_dir));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
strlcpy(current_savefile_dir,
|
||||||
|
global->dir.savefile,
|
||||||
|
sizeof(current_savefile_dir));
|
||||||
|
|
||||||
/* per-core states: append the library_name to the save location */
|
/* per-core states: append the library_name to the save location */
|
||||||
if (settings->sort_savestates_enable && global->dir.savestate[0] != '\0')
|
if (settings->sort_savestates_enable && global->dir.savestate[0] != '\0')
|
||||||
{
|
{
|
||||||
strlcpy(orig_savestate_dir,
|
fill_pathname_join(
|
||||||
global->dir.savestate,
|
current_savestate_dir,
|
||||||
sizeof(orig_savestate_dir));
|
|
||||||
fill_pathname_dir(global->dir.savestate,
|
|
||||||
global->dir.savestate,
|
global->dir.savestate,
|
||||||
info->info.library_name,
|
info->info.library_name,
|
||||||
sizeof(global->dir.savestate));
|
sizeof(global->dir.savestate));
|
||||||
|
|
||||||
/* If path doesn't exist, try to create it.
|
/* If path doesn't exist, try to create it.
|
||||||
* If everything fails, revert to the original path. */
|
* If everything fails, revert to the original path. */
|
||||||
if(!path_is_directory(global->dir.savestate) && global->dir.savestate[0] != '\0')
|
if(!path_is_directory(current_savestate_dir) && current_savestate_dir[0] != '\0')
|
||||||
{
|
{
|
||||||
path_mkdir(global->dir.savestate);
|
path_mkdir(current_savestate_dir);
|
||||||
if(!path_is_directory(global->dir.savestate))
|
if(!path_is_directory(current_savestate_dir))
|
||||||
{
|
{
|
||||||
RARCH_LOG("Reverting savestate directory to %s\n", orig_savestate_dir);
|
RARCH_LOG("Reverting savestate directory to %s\n", global->dir.savestate);
|
||||||
strlcpy(global->dir.savestate,
|
strlcpy(current_savestate_dir,
|
||||||
orig_savestate_dir,
|
global->dir.savestate,
|
||||||
sizeof(global->dir.savestate));
|
sizeof(current_savestate_dir));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
strlcpy(current_savestate_dir,
|
||||||
|
global->dir.savestate,
|
||||||
|
sizeof(current_savestate_dir));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(path_is_directory(global->dir.savefile))
|
if(path_is_directory(current_savefile_dir))
|
||||||
strlcpy(global->name.savefile, global->dir.savefile,
|
strlcpy(global->name.savefile, current_savefile_dir,
|
||||||
sizeof(global->name.savefile));
|
sizeof(global->name.savefile));
|
||||||
|
|
||||||
if(path_is_directory(global->dir.savestate))
|
if(path_is_directory(current_savestate_dir))
|
||||||
strlcpy(global->name.savestate, global->dir.savestate,
|
strlcpy(global->name.savestate, current_savestate_dir,
|
||||||
sizeof(global->name.savestate));
|
sizeof(global->name.savestate));
|
||||||
|
|
||||||
if (path_is_directory(global->name.savefile))
|
if (path_is_directory(global->name.savefile))
|
||||||
|
@ -789,7 +794,7 @@ static void parse_input(int argc, char *argv[])
|
||||||
FreeConsole();
|
FreeConsole();
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RA_OPT_MENU:
|
case RA_OPT_MENU:
|
||||||
global->inited.core.type = CORE_TYPE_DUMMY;
|
global->inited.core.type = CORE_TYPE_DUMMY;
|
||||||
break;
|
break;
|
||||||
|
@ -1057,7 +1062,7 @@ void rarch_main_alloc(void)
|
||||||
/**
|
/**
|
||||||
* rarch_main_new:
|
* rarch_main_new:
|
||||||
*
|
*
|
||||||
* Will teardown drivers and clears all
|
* Will teardown drivers and clears all
|
||||||
* internal state of the program.
|
* internal state of the program.
|
||||||
* If @inited is true, will initialize all
|
* If @inited is true, will initialize all
|
||||||
* drivers again after teardown.
|
* drivers again after teardown.
|
||||||
|
@ -1099,7 +1104,7 @@ void rarch_init_system_av_info(void)
|
||||||
/**
|
/**
|
||||||
* rarch_main_init:
|
* rarch_main_init:
|
||||||
* @argc : Count of (commandline) arguments.
|
* @argc : Count of (commandline) arguments.
|
||||||
* @argv : (Commandline) arguments.
|
* @argv : (Commandline) arguments.
|
||||||
*
|
*
|
||||||
* Initializes the program.
|
* Initializes the program.
|
||||||
*
|
*
|
||||||
|
@ -1512,7 +1517,7 @@ void rarch_playlist_load_content(void *data, unsigned idx)
|
||||||
*
|
*
|
||||||
* Gets deferred core.
|
* Gets deferred core.
|
||||||
*
|
*
|
||||||
* Returns: 0 if there are multiple deferred cores and a
|
* Returns: 0 if there are multiple deferred cores and a
|
||||||
* selection needs to be made from a list, otherwise
|
* selection needs to be made from a list, otherwise
|
||||||
* returns -1 and fills in @s with path to core.
|
* returns -1 and fills in @s with path to core.
|
||||||
**/
|
**/
|
||||||
|
|
12
retroarch.h
12
retroarch.h
|
@ -1,7 +1,7 @@
|
||||||
/* RetroArch - A frontend for libretro.
|
/* RetroArch - A frontend for libretro.
|
||||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||||
* Copyright (C) 2011-2015 - Daniel De Matteis
|
* Copyright (C) 2011-2015 - Daniel De Matteis
|
||||||
*
|
*
|
||||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU General Public License as published by the Free Software Found-
|
* of the GNU General Public License as published by the Free Software Found-
|
||||||
* ation, either version 3 of the License, or (at your option) any later version.
|
* ation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
@ -89,7 +89,7 @@ enum rarch_ctl_state
|
||||||
/* Validates CPU features for given processor architecture.
|
/* Validates CPU features for given processor architecture.
|
||||||
*
|
*
|
||||||
* Make sure we haven't compiled for something we cannot run.
|
* Make sure we haven't compiled for something we cannot run.
|
||||||
* Ideally, code would get swapped out depending on CPU support,
|
* Ideally, code would get swapped out depending on CPU support,
|
||||||
* but this will do for now. */
|
* but this will do for now. */
|
||||||
RARCH_ACTION_STATE_VALIDATE_CPU_FEATURES,
|
RARCH_ACTION_STATE_VALIDATE_CPU_FEATURES,
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data);
|
||||||
/**
|
/**
|
||||||
* rarch_main_init:
|
* rarch_main_init:
|
||||||
* @argc : Count of (commandline) arguments.
|
* @argc : Count of (commandline) arguments.
|
||||||
* @argv : (Commandline) arguments.
|
* @argv : (Commandline) arguments.
|
||||||
*
|
*
|
||||||
* Initializes RetroArch.
|
* Initializes RetroArch.
|
||||||
*
|
*
|
||||||
|
@ -183,7 +183,7 @@ void rarch_playlist_load_content(void *data, unsigned index);
|
||||||
*
|
*
|
||||||
* Gets deferred core.
|
* Gets deferred core.
|
||||||
*
|
*
|
||||||
* Returns: 0 if there are multiple deferred cores and a
|
* Returns: 0 if there are multiple deferred cores and a
|
||||||
* selection needs to be made from a list, otherwise
|
* selection needs to be made from a list, otherwise
|
||||||
* returns -1 and fills in @s with path to core.
|
* returns -1 and fills in @s with path to core.
|
||||||
**/
|
**/
|
||||||
|
@ -207,8 +207,8 @@ int rarch_info_get_capabilities(enum rarch_capabilities type, char *s, size_t le
|
||||||
|
|
||||||
enum rarch_content_type rarch_path_is_media_type(const char *path);
|
enum rarch_content_type rarch_path_is_media_type(const char *path);
|
||||||
|
|
||||||
extern char orig_savestate_dir[PATH_MAX_LENGTH];
|
extern char current_savestate_dir[PATH_MAX_LENGTH];
|
||||||
extern char orig_savefile_dir[PATH_MAX_LENGTH];
|
extern char current_savefile_dir[PATH_MAX_LENGTH];
|
||||||
extern bool orig_system_dir_empty;
|
extern bool orig_system_dir_empty;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
Loading…
Reference in New Issue