1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#include "platform.hpp"
#include <string>
#include <fstream>
#include <filesystem>
using namespace std::literals::string_literals;
bool IsFolder(std::string_view path) {
std::error_code ec;
const auto status = std::filesystem::status(path, ec);
if (ec) return false;
return status.type() == std::filesystem::file_type::directory;
}
bool IsFile(std::string_view path) {
std::error_code ec;
const auto status = std::filesystem::status(path, ec);
if (ec) return false;
return status.type() == std::filesystem::file_type::regular;
}
#if defined(_WIN32) && defined(_MSC_VER)
#include <Windows.h>
#include <Shlwapi.h>
#include <ShlObj_core.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";
}
#elif defined(__linux__)
std::string Platform::FindResourceFolder() {
static std::string path;
static bool found = false;
if (found) return path;
if (IsFolder("/usr/share/abaddon/res") && IsFolder("/usr/share/abaddon/css")) {
path = "/usr/share/abaddon";
} else {
puts("resources are not in /usr/share/abaddon, will try to load from cwd");
path = ".";
}
found = true;
return path;
}
std::string Platform::FindConfigFile() {
const auto x = std::getenv("ABADDON_CONFIG");
if (x != nullptr)
return x;
const auto home_path = std::string(std::getenv("HOME")) + "/.config/abaddon/abaddon.ini";
for (const auto path : { "./abaddon.ini"s, home_path }) {
if (IsFile(path)) return path;
}
puts("can't find configuration file!");
return "./abaddon.ini";
}
#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";
}
#endif
|