@@ -41,6 +41,12 @@ std::string home_dir() {
4141 throw agi::EnvironmentError (" Could not get home directory. Make sure HOME is set." );
4242}
4343
44+ std::string xdg_dir (std::string_view token, agi::fs::path const & fallback) {
45+ const char *env = getenv (token.data ());
46+ if (env) return env;
47+ return fallback.string ();
48+ }
49+
4450#ifdef APPIMAGE_BUILD
4551std::string exe_dir () {
4652 char *exe, *dir;
@@ -70,12 +76,32 @@ namespace agi {
7076void Path::FillPlatformSpecificPaths () {
7177#ifndef __APPLE__
7278 agi::fs::path home = home_dir ();
73- SetToken (" ?user" , home/" .aegisub" );
74- SetToken (" ?local" , home/" .aegisub" );
79+ agi::fs::path old_root = home/" .aegisub" ;
80+
81+ agi::fs::path xdg_config = xdg_dir (" XDG_CONFIG_HOME" , home/" .config" );
82+ agi::fs::path xdg_cache = xdg_dir (" XDG_CACHE_HOME" , home/" cache" );
83+ agi::fs::path xdg_state = xdg_dir (" XDG_STATE_HOME" , home/" .local/state" );
84+ agi::fs::path xdg_data = xdg_dir (" XDG_DATA_HOME" , home/" .local/share" );
85+
86+ if (agi::fs::DirectoryExists (old_root)) {
87+ SetToken (" ?user" , old_root);
88+ SetToken (" ?local" , old_root);
89+ SetToken (" ?state" , old_root);
90+ } else {
91+ SetToken (" ?user" , xdg_config/" aegisub" );
92+ SetToken (" ?local" , xdg_cache/" aegisub" );
93+ SetToken (" ?state" , xdg_state/" aegisub" );
94+ }
7595
7696#ifdef APPIMAGE_BUILD
7797 agi::fs::path data = exe_dir ();
78- if (data == " " ) data = home/" .aegisub" ;
98+ if (data == " " ) {
99+ if (agi::fs::DirectoryExists (old_root)) {
100+ data = old_root;
101+ } else {
102+ data = xdg_data/" aegisub"
103+ }
104+ }
79105 SetToken (" ?data" , data);
80106 SetToken (" ?dictionary" , Decode (" ?data/dictionaries" ));
81107#else
@@ -87,6 +113,7 @@ void Path::FillPlatformSpecificPaths() {
87113 agi::fs::path app_support = agi::util::GetApplicationSupportDirectory ();
88114 SetToken (" ?user" , app_support/" Aegisub" );
89115 SetToken (" ?local" , app_support/" Aegisub" );
116+ SetToken (" ?state" , app_support/" Aegisub" );
90117 SetToken (" ?data" , agi::util::GetBundleSharedSupportDirectory ());
91118 SetToken (" ?dictionary" , Decode (" ?data/dictionaries" ));
92119#endif
0 commit comments