summaryrefslogtreecommitdiff
path: root/src/platform.cpp
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2021-11-28 22:48:30 -0500
committerouwou <26526779+ouwou@users.noreply.github.com>2021-11-28 22:48:30 -0500
commite1703aea3fd597b23bde90e6c505278c517be611 (patch)
tree37d98fc90c9cd0844388bfb79beda2204f44af92 /src/platform.cpp
parentfd53a76bf6f53a095a639765923a30f2206b2cd6 (diff)
parente02107feea8214a045e6faa969f00dcbc0d2b072 (diff)
downloadabaddon-portaudio-e1703aea3fd597b23bde90e6c505278c517be611.tar.gz
abaddon-portaudio-e1703aea3fd597b23bde90e6c505278c517be611.zip
merge master
Diffstat (limited to 'src/platform.cpp')
-rw-r--r--src/platform.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/platform.cpp b/src/platform.cpp
new file mode 100644
index 0000000..dfbea3b
--- /dev/null
+++ b/src/platform.cpp
@@ -0,0 +1,157 @@
+#include "platform.hpp"
+#include "util.hpp"
+#include <string>
+#include <fstream>
+#include <filesystem>
+#include <config.h>
+
+using namespace std::literals::string_literals;
+
+#if defined(_WIN32)
+ #include <Windows.h>
+ #include <Shlwapi.h>
+ #include <ShlObj.h>
+ #include <pango/pangocairo.h>
+ #include <pango/pangofc-fontmap.h>
+ #pragma comment(lib, "Shlwapi.lib")
+bool Platform::SetupFonts() {
+ using namespace std::string_literals;
+
+ char buf[MAX_PATH] { 0 };
+ GetCurrentDirectoryA(MAX_PATH, buf);
+ {
+ // thanks @WorkingRobot for da help :^))
+
+ std::ifstream template_stream(buf + "\\fonts\\fonts.template.conf"s);
+ std::ofstream conf_stream(buf + "\\fonts\\fonts.conf"s);
+ if (!template_stream.good()) {
+ printf("can't open fonts/fonts.template.conf\n");
+ return false;
+ }
+ if (!conf_stream.good()) {
+ printf("can't open write to fonts.conf\n");
+ return false;
+ }
+
+ std::string line;
+ while (std::getline(template_stream, line)) {
+ if (line == "<!--(CONFD)-->")
+ conf_stream << "<include ignore_missing=\"no\">" << (buf + "\\fonts\\conf.d"s) << "</include>";
+ else
+ conf_stream << line;
+ conf_stream << '\n';
+ }
+ }
+
+ auto fc = FcConfigCreate();
+ FcConfigSetCurrent(fc);
+ FcConfigParseAndLoad(fc, const_cast<FcChar8 *>(reinterpret_cast<const FcChar8 *>((buf + "\\fonts\\fonts.conf"s).c_str())), true);
+ FcConfigAppFontAddDir(fc, const_cast<FcChar8 *>(reinterpret_cast<const FcChar8 *>((buf + "\\fonts"s).c_str())));
+
+ char fonts_path[MAX_PATH];
+ if (SHGetFolderPathA(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, fonts_path) == S_OK) {
+ FcConfigAppFontAddDir(fc, reinterpret_cast<FcChar8 *>(fonts_path));
+ }
+
+ auto map = pango_cairo_font_map_new_for_font_type(CAIRO_FONT_TYPE_FT);
+ pango_fc_font_map_set_config(reinterpret_cast<PangoFcFontMap *>(map), fc);
+ pango_cairo_font_map_set_default(reinterpret_cast<PangoCairoFontMap *>(map));
+
+ return true;
+}
+#else
+bool Platform::SetupFonts() {
+ return true;
+}
+#endif
+
+#if defined(_WIN32)
+std::string Platform::FindResourceFolder() {
+ return ".";
+}
+
+std::string Platform::FindConfigFile() {
+ const auto x = std::getenv("ABADDON_CONFIG");
+ if (x != nullptr)
+ return x;
+ return "./abaddon.ini";
+}
+
+std::string Platform::FindStateCacheFolder() {
+ return ".";
+}
+
+#elif defined(__linux__)
+std::string Platform::FindResourceFolder() {
+ static std::string found_path;
+ static bool found = false;
+ if (found) return found_path;
+
+ const auto home_env = std::getenv("HOME");
+ if (home_env != nullptr) {
+ const static std::string home_path = home_env + "/.local/share/abaddon"s;
+
+ for (const auto &path : { "."s, home_path, std::string(ABADDON_DEFAULT_RESOURCE_DIR) }) {
+ if (util::IsFolder(path + "/res") && util::IsFolder(path + "/css")) {
+ found_path = path;
+ found = true;
+ return found_path;
+ }
+ }
+ }
+
+ puts("cant find a resources folder, will try to load from cwd");
+ found_path = ".";
+ found = true;
+ return found_path;
+}
+
+std::string Platform::FindConfigFile() {
+ const auto x = std::getenv("ABADDON_CONFIG");
+ if (x != nullptr)
+ return x;
+
+ const auto home_env = std::getenv("HOME");
+ if (home_env != nullptr) {
+ const auto home_path = home_env + "/.config/abaddon/abaddon.ini"s;
+ for (auto path : { "./abaddon.ini"s, home_path }) {
+ if (util::IsFile(path)) return path;
+ }
+ }
+ puts("can't find configuration file!");
+ return "./abaddon.ini";
+}
+
+std::string Platform::FindStateCacheFolder() {
+ const auto home_env = std::getenv("HOME");
+ if (home_env != nullptr) {
+ auto home_path = home_env + "/.cache/abaddon"s;
+ std::error_code ec;
+ if (!util::IsFolder(home_path))
+ std::filesystem::create_directories(home_path, ec);
+ if (util::IsFolder(home_path))
+ return home_path;
+ }
+ puts("can't find cache folder!");
+ return ".";
+}
+
+#else
+std::string Platform::FindResourceFolder() {
+ puts("unknown OS, trying to load resources from cwd");
+ return ".";
+}
+
+std::string Platform::FindConfigFile() {
+ const auto x = std::getenv("ABADDON_CONFIG");
+ if (x != nullptr)
+ return x;
+ puts("unknown OS, trying to load config from cwd");
+ return "./abaddon.ini";
+}
+
+std::string Platform::FindStateCacheFolder() {
+ puts("unknown OS, setting state cache folder to cwd");
+ return ".";
+}
+#endif