diff options
Diffstat (limited to 'core/src/Utils')
-rw-r--r-- | core/src/Utils/StandardDirectories.cpp | 74 | ||||
-rw-r--r-- | core/src/Utils/StandardDirectories.hpp | 10 |
2 files changed, 84 insertions, 0 deletions
diff --git a/core/src/Utils/StandardDirectories.cpp b/core/src/Utils/StandardDirectories.cpp new file mode 100644 index 0000000..7defc5d --- /dev/null +++ b/core/src/Utils/StandardDirectories.cpp @@ -0,0 +1,74 @@ +#include "StandardDirectories.hpp" + +#include <filesystem> +#include <stdexcept> + +namespace fs = std::filesystem; + +#if PLATFORM_WIN32 +// https://stackoverflow.com/questions/54499256/how-to-find-the-saved-games-folder-programmatically-in-c-c +# include <ShlObj_core.h> +# include <objbase.h> +# 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 <cstdlib> + +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; +} diff --git a/core/src/Utils/StandardDirectories.hpp b/core/src/Utils/StandardDirectories.hpp new file mode 100644 index 0000000..4f7e5e2 --- /dev/null +++ b/core/src/Utils/StandardDirectories.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include <filesystem> + +namespace StandardDirectories { + +const std::filesystem::path& UserData(); +const std::filesystem::path& UserConfig(); + +} // namespace StandardDirectories |