From e8b0fa5bd9e83001a82d6501eb39519a71caacdf Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Wed, 17 Jun 2026 13:38:05 -0500 Subject: Fix bundled font fallback --- src/src/main.cpp | 44 +++++++++++++++++++++++++++++++++++--------- src/src/moapplication.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 9 deletions(-) (limited to 'src') 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"( +QString compatibleFontconfig(const QString& appDir) +{ + const QString fontDir = QDir(appDir).filePath(QStringLiteral("fonts")).toHtmlEscaped(); + + return QStringLiteral(R"( + %1 /usr/share/fonts /usr/local/share/fonts fonts fontconfig + + + sans-serif + DejaVu Sans + + + monospace + DejaVu Sans Mono + + + MS Shell Dlg 2 + DejaVu Sans + + + Segoe UI + DejaVu Sans + + + Arial + DejaVu Sans + -)"; +)") + .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 . #include #include #include +#include +#include #include #include #include @@ -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). -- cgit v1.3.1