aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-06-17 13:38:05 -0500
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-06-17 13:38:05 -0500
commite8b0fa5bd9e83001a82d6501eb39519a71caacdf (patch)
tree2354a7e27b259902d3572112acb1313d3a0f30c6 /src
parent46bc9c9d164ace2c4c0d12a28905e83e2dae74a7 (diff)
Fix bundled font fallback
Diffstat (limited to 'src')
-rw-r--r--src/src/main.cpp44
-rw-r--r--src/src/moapplication.cpp33
2 files changed, 68 insertions, 9 deletions
diff --git a/src/src/main.cpp b/src/src/main.cpp
index fc10456..74c5aa6 100644
--- a/src/src/main.cpp
+++ b/src/src/main.cpp
@@ -34,15 +34,43 @@ int run(int argc, char* argv[]);
namespace
{
-const char* COMPAT_FONTCONFIG = R"(<?xml version="1.0"?>
+QString compatibleFontconfig(const QString& appDir)
+{
+ const QString fontDir = QDir(appDir).filePath(QStringLiteral("fonts")).toHtmlEscaped();
+
+ return QStringLiteral(R"(<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
+ <dir>%1</dir>
<dir>/usr/share/fonts</dir>
<dir>/usr/local/share/fonts</dir>
<dir prefix="xdg">fonts</dir>
<cachedir prefix="xdg">fontconfig</cachedir>
+
+ <alias>
+ <family>sans-serif</family>
+ <prefer><family>DejaVu Sans</family></prefer>
+ </alias>
+ <alias>
+ <family>monospace</family>
+ <prefer><family>DejaVu Sans Mono</family></prefer>
+ </alias>
+ <alias>
+ <family>MS Shell Dlg 2</family>
+ <prefer><family>DejaVu Sans</family></prefer>
+ </alias>
+ <alias>
+ <family>Segoe UI</family>
+ <prefer><family>DejaVu Sans</family></prefer>
+ </alias>
+ <alias>
+ <family>Arial</family>
+ <prefer><family>DejaVu Sans</family></prefer>
+ </alias>
</fontconfig>
-)";
+)")
+ .arg(fontDir);
+}
void configureCompatibleFontconfig(int argc, char* argv[])
{
@@ -61,13 +89,11 @@ void configureCompatibleFontconfig(int argc, char* argv[])
const QString fontDir = QDir(appDir).filePath(QStringLiteral("etc/fonts"));
const QString configPath = QDir(fontDir).filePath(QStringLiteral("fonts.conf"));
- if (!QFileInfo::exists(configPath)) {
- QDir().mkpath(fontDir);
- QFile config(configPath);
- if (config.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
- config.write(COMPAT_FONTCONFIG);
- config.close();
- }
+ QDir().mkpath(fontDir);
+ QFile config(configPath);
+ if (config.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
+ config.write(compatibleFontconfig(appDir).toUtf8());
+ config.close();
}
if (QFileInfo::exists(configPath)) {
diff --git a/src/src/moapplication.cpp b/src/src/moapplication.cpp
index 16ffb62..9fea4ef 100644
--- a/src/src/moapplication.cpp
+++ b/src/src/moapplication.cpp
@@ -45,6 +45,8 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QDesktopServices>
#include <QEvent>
#include <QFile>
+#include <QFont>
+#include <QFontDatabase>
#include <QPainter>
#include <QProxyStyle>
#include <QRegularExpression>
@@ -135,6 +137,36 @@ void addLinuxLibrariesToPath()
env::prependToPath(libsPath);
}
+void configureApplicationFont()
+{
+ const QDir fontDir(QCoreApplication::applicationDirPath() + "/fonts");
+ const QStringList bundledFonts{
+ "DejaVuSans.ttf",
+ "DejaVuSans-Bold.ttf",
+ "DejaVuSansMono.ttf",
+ "DejaVuSansMono-Bold.ttf",
+ };
+
+ QString uiFamily;
+ for (const QString& font : bundledFonts) {
+ const int id = QFontDatabase::addApplicationFont(fontDir.filePath(font));
+ if (id < 0 || !uiFamily.isEmpty()) {
+ continue;
+ }
+
+ const QStringList families = QFontDatabase::applicationFontFamilies(id);
+ if (!families.isEmpty()) {
+ uiFamily = families.first();
+ }
+ }
+
+ if (!uiFamily.isEmpty()) {
+ QFont font = QApplication::font();
+ font.setFamily(uiFamily);
+ QApplication::setFont(font);
+ }
+}
+
#ifdef MO2_WEBENGINE
void configureQtWebEngineProcessPath()
{
@@ -205,6 +237,7 @@ void configureQtWebEngineProcessPath()
MOApplication::MOApplication(int& argc, char** argv) : QApplication(argc, argv)
{
TimeThis const tt("MOApplication()");
+ configureApplicationFont();
// Ensure the app name is always "ModOrganizer" regardless of the binary
// filename (settings/profile lookups key off this).