#include "StandardDirectories.hpp" #include #include namespace fs = std::filesystem; #if PLATFORM_WIN32 // https://stackoverflow.com/questions/54499256/how-to-find-the-saved-games-folder-programmatically-in-c-c # include # include # pragma comment(lib, "shell32.lib") # pragma comment(lib, "ole32.lib") static fs::path GetAppDataRoaming() { PWSTR path = nullptr; HRESULT hr = SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, nullptr, &path); if (SUCCEEDED(hr)) { auto dataDir = fs::path(path); CoTaskMemFree(path); fs::create_directories(dataDir); return dataDir; } else { fs::path dataDir("~/AppData/Roaming"); fs::create_directories(dataDir); return dataDir; } } #elif PLATFORM_MACOS // TODO #elif PLATFORM_LINUX # include static fs::path GetEnvVar(const char* name, const char* backup) { if (const char* path = std::getenv(name)) { fs::path dataDir(path); fs::create_directories(dataDir); return dataDir; } else { fs::path dataDir(backup); fs::create_directories(dataDir); return dataDir; } } #endif const std::filesystem::path& StandardDirectories::UserData() { static auto userDataDir = []() -> fs::path { #if PLATFORM_WIN32 return GetAppDataRoaming(); #elif PLATFORM_MACOS // TODO where? #elif PLATFORM_LINUX return GetEnvVar("XDG_DATA_HOME", "~/.local/share"); #endif }(); return userDataDir; } const std::filesystem::path& StandardDirectories::UserConfig() { static auto userConfigDir = []() -> fs::path { #if PLATFORM_WIN32 return GetAppDataRoaming(); #elif PLATFORM_MACOS // TODO where? #elif PLATFORM_LINUX return GetEnvVar("XDG_CONFIG_HOME", "~/.config"); #endif }(); return userConfigDir; }