diff --git a/kcms/fonts/fonts.h b/kcms/fonts/fonts.h --- a/kcms/fonts/fonts.h +++ b/kcms/fonts/fonts.h @@ -160,7 +160,6 @@ private: bool isSaveNeeded() const override; bool isDefaults() const override; - QFont applyFontDiff(const QFont &fnt, const QFont &newFont, int fontDiffFlags); void setNearestExistingFonts(); FontsSettings *m_settings; diff --git a/kcms/fonts/fonts.cpp b/kcms/fonts/fonts.cpp --- a/kcms/fonts/fonts.cpp +++ b/kcms/fonts/fonts.cpp @@ -42,7 +42,6 @@ #include #include #include -#include #include #include "../krdb/krdb.h" @@ -656,52 +655,47 @@ void KFonts::adjustAllFonts() { - QFont font = m_settings->font(); - KFontChooser::FontDiffFlags fontDiffFlags; - int ret = KFontDialog::getFontDiff(font, fontDiffFlags, KFontChooser::NoDisplayFlags); + bool ok = false; + QFont font = QFontDialog::getFont(&ok, m_settings->font(), nullptr, i18n("Select Font")); - if (ret == KDialog::Accepted && fontDiffFlags) { + if (ok) { if (!m_settings->isImmutable("font")) { - m_settings->setFont(applyFontDiff(m_settings->font(), font, fontDiffFlags)); + m_settings->setFont(font); } if (!m_settings->isImmutable("menuFont")) { - m_settings->setMenuFont(applyFontDiff(m_settings->menuFont(), font, fontDiffFlags)); + m_settings->setMenuFont(font); } if (!m_settings->isImmutable("toolBarFont")) { - m_settings->setToolBarFont(applyFontDiff(m_settings->toolBarFont(), font, fontDiffFlags)); + m_settings->setToolBarFont(font); } if (!m_settings->isImmutable("activeFont")) { - m_settings->setActiveFont(applyFontDiff(m_settings->activeFont(), font, fontDiffFlags)); + m_settings->setActiveFont(font); } if (!m_settings->isImmutable("smallestReadableFont")) { - m_settings->setSmallestReadableFont(applyFontDiff(m_settings->smallestReadableFont(), font, fontDiffFlags)); + m_settings->setSmallestReadableFont(font); } - const QFont adjustedFont = applyFontDiff(m_settings->fixed(), font, fontDiffFlags); - if (QFontInfo(adjustedFont).fixedPitch() && !m_settings->isImmutable("fixed")) { - m_settings->setFixed(adjustedFont); - } - } -} -QFont KFonts::applyFontDiff(const QFont &fnt, const QFont &newFont, int fontDiffFlags) -{ - QFont font(fnt); - - if (fontDiffFlags & KFontChooser::FontDiffSize) { - font.setPointSizeF(newFont.pointSizeF()); - } - if ((fontDiffFlags & KFontChooser::FontDiffFamily)) { - font.setFamily(newFont.family()); - } - if (fontDiffFlags & KFontChooser::FontDiffStyle) { - font.setWeight(newFont.weight()); - font.setStyle(newFont.style()); - font.setUnderline(newFont.underline()); - font.setStyleName(newFont.styleName()); + // Try to find a fixed-width/monspace font from the font family the user selected, e.g.: + // "Noto Sans" -> "Noto Sans Mono", "Ubuntu" -> "Ubuntu Mono" + // we take the first one that comes along, e.g. "Noto Sans Mono" _not_ "Noto Sans Mono Blk" + QFontDatabase fdb; + const QStringList fontFamilies = fdb.families(); + QString mono; + for (const QString &family : fontFamilies) { + // QString::endsWith() is cheaper than contains(), so try it first + if (family.startsWith(font.family()) + && (family.endsWith(QLatin1String("Mono")) + || family.contains(QLatin1String("Mono")))) { + mono = family; + break; + } + } + // fallback if we find nothing + QFont f = mono.isEmpty() ? QFontDatabase::systemFont(QFontDatabase::FixedFont) : QFont(mono); + if (!m_settings->isImmutable("fixed")) { + m_settings->setFixed(f); + } } - - return font; } #include "fonts.moc" -