summaryrefslogtreecommitdiff
path: root/core/src/Utils
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/Utils')
-rw-r--r--core/src/Utils/StandardDirectories.cpp74
-rw-r--r--core/src/Utils/StandardDirectories.hpp10
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