Add libretro assets directory search path, and have environment variables override configured values (#17054)

* platform_win32: Fix sizeof for DEFAULT_DIR_PLAYLIST.

* frontend/drivers/platform_win32.c (frontend_win32_env_get): Check
the size of correct destination array.

* frontend: Honor the LIBRETRO_ASSETS_DIRECTORY environment variable.

This builds on 763fcd8267 ("unix, win32: Allow set the default
libretro_directory via environment variable") to also allow specifying
the assets directory via an environment variable.

* frontend/drivers/platform_unix.c (frontend_unix_get_env)
<libretro_assets_directory> New variable. Use it to set
DEFAULT_DIR_ASSETS, when available.
* frontend/drivers/platform_win32.c (frontend_win32_env_get): Likewise.

* platform: Honor the LIBRETRO_DIRECTORY environment variable.

Until now, and unlike the defaut core directory, the default
core *info* directory would be hard-coded relative to the installation
directory. Honor the LIBRETRO_DIRECTORY environment variable the same
instead.

* frontend/drivers/platform_unix.c (frontend_unix_get_env): Set
DEFAULT_DIR_CORE_INFO default to the value of the LIBRETRO_DIRECTORY
environment variable, if available.
* frontend/drivers/platform_win32.c (frontend_win32_env_get): Likewise.

* platform: Honor the LIBRETRO_AUTOCONFIG_DIRECTORY environment variable.

* frontend/drivers/platform_unix.c
(libretro_autoconfig_directory): New variable.
(frontend_unix_get_env): Set DEFAULT_DIR_AUTOCONFIG to the value of
the LIBRETRO_AUTOCONFIG_DIRECTORY environment variable, if available.
* frontend/drivers/platform_win32.c: Likewise.

* platform: Honor the LIBRETRO_VIDEO_FILTER_DIRECTORY environment variable.

* frontend/drivers/platform_unix.c
(libretro_video_filter_directory): New variable.
(frontend_unix_get_env): Set DEFAULT_DIR_VIDEO_FILTER to the value of
the LIBRETRO_VIDEO_FILTER_DIRECTORY environment variable, if available.
* frontend/drivers/platform_win32.c: Likewise.

* platform: Honor the LIBRETRO_VIDEO_SHADER_DIRECTORY environment variable.

* frontend/drivers/platform_unix.c
(libretro_video_shader_directory): New variable.
(frontend_unix_get_env): Set DEFAULT_DIR_SHADER to the value of
the LIBRETRO_VIDEO_SHADER_DIRECTORY environment variable, if available.
* frontend/drivers/platform_win32.c: Likewise.

* platform: Honor the LIBRETRO_SYSTEM_DIRECTORY environment variable.

* frontend/drivers/platform_unix.c
(libretro_system_directory): New variable.
(frontend_unix_get_env): Set DEFAULT_DIR_SYSTEM to the value of
the LIBRETRO_SYSTEM_DIRECTORY environment variable, if available.
* frontend/drivers/platform_win32.c: Likewise.

* configuration: Have environment variables override configuration.

Because the configuration file is systematically written when
RetroArch terminates, persisting any previous default/configured
value, setting the LIBRETRO_DIRECTORY, LIBRETRO_ASSETS_DIRECTORY, etc.
environment variables would not have an effect unless the
retroarch.cfg configuration file was cleared.

This seems to go against the common expectation that environment
variables are set by users to *override* the default behavior or
configuration of an application.

* configuration.c (config_load_file) <libretro_directory>
<libretro_assets_directory, libretro_autoconfig_directory>
<libretro_system_directory, libretro_video_filter_directory>
<libretro_video_shader_directory>: New variables. Use the values of
the LIBRETRO_DIRECTORY, LIBRETRO_ASSETS_DIRECTORY,
LIBRETRO_AUTOCONFIG_DIRECTORY, LIBRETRO_SYSTEM_DIRECTORY,
LIBRETRO_VIDEO_FILTER_DIRECTORY and LIBRETRO_VIDEO_SHADER_DIRECTORY
environment variables instead of their corresponding configured
values, when set.
* docs/retroarch.6: Document the environment variables honored and
their behavior.
This commit is contained in:
Apteryks 2025-01-17 19:04:23 +00:00 committed by GitHub
parent b211adaaca
commit 69ceb95ddc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 169 additions and 34 deletions

View File

@ -3568,6 +3568,12 @@ static bool config_load_file(global_t *global,
{ {
unsigned i; unsigned i;
char tmp_str[PATH_MAX_LENGTH]; char tmp_str[PATH_MAX_LENGTH];
char* libretro_directory = NULL;
char* libretro_assets_directory = NULL;
char* libretro_autoconfig_directory = NULL;
char* libretro_system_directory = NULL;
char* libretro_video_filter_directory = NULL;
char* libretro_video_shader_directory = NULL;
static bool first_load = true; static bool first_load = true;
bool without_overrides = false; bool without_overrides = false;
unsigned msg_color = 0; unsigned msg_color = 0;
@ -3849,12 +3855,6 @@ static bool config_load_file(global_t *global,
strlcpy(path_settings[i].ptr, tmp_str, PATH_MAX_LENGTH); strlcpy(path_settings[i].ptr, tmp_str, PATH_MAX_LENGTH);
} }
#if !IOS
if (config_get_path(conf, "libretro_directory", tmp_str, sizeof(tmp_str)))
configuration_set_string(settings,
settings->paths.directory_libretro, tmp_str);
#endif
#ifdef RARCH_CONSOLE #ifdef RARCH_CONSOLE
if (conf) if (conf)
video_driver_load_settings(global, conf); video_driver_load_settings(global, conf);
@ -3862,6 +3862,26 @@ static bool config_load_file(global_t *global,
/* Post-settings load */ /* Post-settings load */
libretro_directory = getenv("LIBRETRO_DIRECTORY");
if (libretro_directory) {
configuration_set_string(settings,
settings->paths.directory_libretro, libretro_directory);
configuration_set_string(settings,
settings->paths.path_libretro_info, libretro_directory);
}
libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
if (libretro_autoconfig_directory)
configuration_set_string(settings,
settings->paths.directory_autoconfig,
libretro_autoconfig_directory);
libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
if (libretro_system_directory)
configuration_set_string(settings,
settings->paths.directory_system,
libretro_system_directory);
if ( (rarch_flags & RARCH_FLAGS_HAS_SET_USERNAME) if ( (rarch_flags & RARCH_FLAGS_HAS_SET_USERNAME)
&& (override_username)) && (override_username))
{ {
@ -4026,15 +4046,27 @@ static bool config_load_file(global_t *global,
*settings->paths.path_menu_wallpaper = '\0'; *settings->paths.path_menu_wallpaper = '\0';
if (string_is_equal(settings->paths.path_rgui_theme_preset, "default")) if (string_is_equal(settings->paths.path_rgui_theme_preset, "default"))
*settings->paths.path_rgui_theme_preset = '\0'; *settings->paths.path_rgui_theme_preset = '\0';
if (string_is_equal(settings->paths.directory_video_shader, "default")) libretro_video_shader_directory = getenv("LIBRETRO_VIDEO_SHADER_DIRECTORY");
if (libretro_video_shader_directory) { /* override configuration value */
configuration_set_string(settings, settings->paths.directory_video_shader,
libretro_video_shader_directory);
} else if (string_is_equal(settings->paths.directory_video_shader, "default"))
*settings->paths.directory_video_shader = '\0'; *settings->paths.directory_video_shader = '\0';
if (string_is_equal(settings->paths.directory_video_filter, "default")) libretro_video_filter_directory = getenv("LIBRETRO_VIDEO_FILTER_DIRECTORY");
if (libretro_video_filter_directory) { /* override configuration value */
configuration_set_string(settings, settings->paths.directory_video_filter,
libretro_video_filter_directory);
} else if (string_is_equal(settings->paths.directory_video_filter, "default"))
*settings->paths.directory_video_filter = '\0'; *settings->paths.directory_video_filter = '\0';
if (string_is_equal(settings->paths.directory_audio_filter, "default")) if (string_is_equal(settings->paths.directory_audio_filter, "default"))
*settings->paths.directory_audio_filter = '\0'; *settings->paths.directory_audio_filter = '\0';
if (string_is_equal(settings->paths.directory_core_assets, "default")) if (string_is_equal(settings->paths.directory_core_assets, "default"))
*settings->paths.directory_core_assets = '\0'; *settings->paths.directory_core_assets = '\0';
if (string_is_equal(settings->paths.directory_assets, "default")) libretro_assets_directory = getenv("LIBRETRO_ASSETS_DIRECTORY");
if (libretro_assets_directory) { /* override configuration value */
configuration_set_string(settings,
settings->paths.directory_assets, libretro_assets_directory);
} else if (string_is_equal(settings->paths.directory_assets, "default"))
*settings->paths.directory_assets = '\0'; *settings->paths.directory_assets = '\0';
#ifdef _3DS #ifdef _3DS
if (string_is_equal(settings->paths.directory_bottom_assets, "default")) if (string_is_equal(settings->paths.directory_bottom_assets, "default"))

View File

@ -1,6 +1,6 @@
.\" retroarch.6: .\" retroarch.6:
.TH "RETROARCH" "6" "November 1, 2011" "RETROARCH" "System Manager's Manual: retroarch" .TH "RETROARCH" "6" "January 16, 2025" "RETROARCH" "System Manager's Manual: retroarch"
.SH NAME .SH NAME
@ -239,3 +239,42 @@ Disables all kinds of content patching.
.TP .TP
\fB-D, --detach\fR \fB-D, --detach\fR
Detach from the current console. This is currently only relevant for Microsoft Windows. Detach from the current console. This is currently only relevant for Microsoft Windows.
.SH ENVIRONMENT
\fBretroarch\fR honors the following environment variables:
.TP
\fBLIBRETRO_DIRECTORY\fR
Specify the directory where RetroArch looks for core and info files,
overriding the value of the "libretro_directory" configuration file
option.
.TP
\fBLIBRETRO_ASSETS_DIRECTORY\fR
Specify the directory where RetroArch looks for assets, overriding
the value of the "assets_directory" configuration file
option.
.TP
\fBLIBRETRO_AUTOCONFIG_DIRECTORY\fR
Specify the directory where RetroArch looks for controller
auto-configuration files, overriding the value of the
"joypad_autoconfig_dir" configuration file option.
.TP
\fBLIBRETRO_SYSTEM_DIRECTORY\fR
Specify the directory where RetroArch looks for system files,
overriding the value of the "system_directory" configuration file
option.
.TP
\fBLIBRETRO_VIDEO_FILTER_DIRECTORY\fR
Specify the directory where RetroArch looks for video filters,
overriding the value of the "video_filter_dir" configuration file
option.
.TP
\fBLIBRETRO_VIDEO_SHADER_DIRECTORY\fR
Specify the directory where RetroArch looks for video shaders,
overriding the value of the "video_shader_dir" configuration file
option.

View File

@ -1323,6 +1323,11 @@ static void frontend_unix_get_env(int *argc,
{ {
unsigned i; unsigned i;
const char* libretro_directory = getenv("LIBRETRO_DIRECTORY"); const char* libretro_directory = getenv("LIBRETRO_DIRECTORY");
const char* libretro_assets_directory = getenv("LIBRETRO_ASSETS_DIRECTORY");
const char* libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
const char* libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
const char* libretro_video_filter_directory = getenv("LIBRETRO_VIDEO_FILTER_DIRECTORY");
const char* libretro_video_shader_directory = getenv("LIBRETRO_VIDEO_SHADER_DIRECTORY");
#ifdef ANDROID #ifdef ANDROID
int32_t major, minor, rel; int32_t major, minor, rel;
char device_model[PROP_VALUE_MAX] = {0}; char device_model[PROP_VALUE_MAX] = {0};
@ -1764,12 +1769,20 @@ static void frontend_unix_get_env(int *argc,
"cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); "cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
else else
#endif #endif
if (!string_is_empty(libretro_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], libretro_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
else
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], base_path, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], base_path,
"cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); "cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
#endif #endif
if (!string_is_empty(libretro_autoconfig_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG],
libretro_autoconfig_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG]));
else
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], base_path, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], base_path,
"autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); "autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG]));
#ifdef ASSETS_DIR #ifdef ASSETS_DIR
if (path_is_directory(ASSETS_DIR "/assets")) if (path_is_directory(ASSETS_DIR "/assets"))
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS],
@ -1777,7 +1790,10 @@ static void frontend_unix_get_env(int *argc,
"assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
else else
#endif #endif
if (path_is_directory("/usr/local/share/retroarch/assets")) if (!string_is_empty(libretro_assets_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_ASSETS], libretro_assets_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
else if (path_is_directory("/usr/local/share/retroarch/assets"))
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS],
"/usr/local/share/retroarch", "/usr/local/share/retroarch",
"assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
@ -1837,7 +1853,11 @@ static void frontend_unix_get_env(int *argc,
"filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); "filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
else else
#endif #endif
if (path_is_directory("/usr/local/share/retroarch/filters/video")) if (!string_is_empty(libretro_video_filter_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
libretro_video_filter_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
else if (path_is_directory("/usr/local/share/retroarch/filters/video"))
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
"/usr/local/share/retroarch", "/usr/local/share/retroarch",
"filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); "filters/video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
@ -1871,6 +1891,11 @@ static void frontend_unix_get_env(int *argc,
"records", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); "records", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT]));
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], base_path, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], base_path,
"database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
if (!string_is_empty(libretro_video_shader_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_SHADER],
libretro_video_shader_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
else
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], base_path, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], base_path,
"shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); "shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], base_path, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], base_path,
@ -1891,6 +1916,11 @@ static void frontend_unix_get_env(int *argc,
"saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); "saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], base_path, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], base_path,
"states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); "states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
if (!string_is_empty(libretro_system_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
libretro_system_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
else
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], base_path, fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], base_path,
"system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
#endif #endif

View File

@ -566,16 +566,31 @@ static void frontend_win32_env_get(int *argc, char *argv[],
{ {
const char *tmp_dir = getenv("TMP"); const char *tmp_dir = getenv("TMP");
const char *libretro_directory = getenv("LIBRETRO_DIRECTORY"); const char *libretro_directory = getenv("LIBRETRO_DIRECTORY");
const char *libretro_assets_directory = getenv("LIBRETRO_ASSETS_DIRECTORY");
const char* libretro_autoconfig_directory = getenv("LIBRETRO_AUTOCONFIG_DIRECTORY");
const char* libretro_system_directory = getenv("LIBRETRO_SYSTEM_DIRECTORY");
const char* libretro_video_filter_directory = getenv("LIBRETRO_VIDEO_FILTER_DIRECTORY");
const char* libretro_video_shader_directory = getenv("LIBRETRO_VIDEO_SHADER_DIRECTORY");
if (!string_is_empty(tmp_dir)) if (!string_is_empty(tmp_dir))
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CACHE], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CACHE],
tmp_dir, sizeof(g_defaults.dirs[DEFAULT_DIR_CACHE])); tmp_dir, sizeof(g_defaults.dirs[DEFAULT_DIR_CACHE]));
gfx_set_dwm(); gfx_set_dwm();
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_ASSETS], if (!string_is_empty(libretro_assets_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_ASSETS], libretro_assets_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
else
fill_pathname_expand_special(
g_defaults.dirs[DEFAULT_DIR_ASSETS],
":\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); ":\\assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER],
":\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER])); ":\\filters\\audio", sizeof(g_defaults.dirs[DEFAULT_DIR_AUDIO_FILTER]));
if (!string_is_empty(libretro_video_filter_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
libretro_video_filter_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
else
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER],
":\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); ":\\filters\\video", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CHEATS],
@ -583,7 +598,7 @@ static void frontend_win32_env_get(int *argc, char *argv[],
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_DATABASE],
":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); ":\\database\\rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_PLAYLIST],
":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); ":\\playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG],
":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); ":\\config\\record", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT],
@ -606,10 +621,24 @@ static void frontend_win32_env_get(int *argc, char *argv[],
else else
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE],
":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); ":\\cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE]));
if (!string_is_empty(libretro_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], libretro_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
else
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_INFO],
":\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); ":\\info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
if (!string_is_empty(libretro_autoconfig_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG],
libretro_autoconfig_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG]));
else
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG],
":\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); ":\\autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG]));
if (!string_is_empty(libretro_video_filter_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_SHADER],
libretro_video_shader_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
else
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SHADER],
":\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); ":\\shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS],
@ -620,6 +649,11 @@ static void frontend_win32_env_get(int *argc, char *argv[],
":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); ":\\saves", sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SAVESTATE],
":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE]));
if (!string_is_empty(libretro_system_directory))
strlcpy(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
libretro_system_directory,
sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
else
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM],
":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM]));
fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_LOGS], fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_LOGS],