aboutsummaryrefslogtreecommitdiff
path: root/core/src/Utils/StandardDirectories.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/Utils/StandardDirectories.cpp')
-rw-r--r--core/src/Utils/StandardDirectories.cpp74
1 files changed, 74 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;
+}