diff --git a/kcms/fonts/fonts.h b/kcms/fonts/fonts.h --- a/kcms/fonts/fonts.h +++ b/kcms/fonts/fonts.h @@ -46,8 +46,23 @@ Q_PROPERTY(bool exclude READ exclude WRITE setExclude NOTIFY excludeChanged) Q_PROPERTY(int excludeTo READ excludeTo WRITE setExcludeTo NOTIFY excludeToChanged) Q_PROPERTY(int excludeFrom READ excludeFrom WRITE setExcludeFrom NOTIFY excludeFromChanged) - Q_PROPERTY(int antiAliasing READ antiAliasing WRITE setAntiAliasing NOTIFY aliasingChanged) + Q_PROPERTY(bool antiAliasing READ antiAliasing WRITE setAntiAliasing NOTIFY aliasingChanged) Q_PROPERTY(int dpi READ dpi WRITE setDpi NOTIFY dpiChanged) + + struct State + { + bool exclude; + int excludeFrom; + int excludeTo; + int antiAliasing; + bool antiAliasingHasLocalConfig; + int dpi; + int subPixel; + int hinting; + + bool operator==(const State& other) const; + bool operator!=(const State& other) const; + }; public: enum AASetting { AAEnabled, AASystem, AADisabled }; @@ -70,8 +85,10 @@ void setExcludeFrom(const int &excludeTo); int excludeFrom() const; - void setAntiAliasing(const int& antiAliasing); - int antiAliasing() const; + void setAntiAliasing(bool antiAliasing); + bool antiAliasing() const; + + bool antiAliasingNeedsSave() const; void setDpi(const int &dpi); int dpi() const; @@ -97,21 +114,10 @@ #if defined(HAVE_FONTCONFIG) && defined (HAVE_X11) private: - int m_excludeTo; - int m_excludeToOriginal; - int m_excludeFrom; - int m_excludeFromOriginal; - int m_antiAliasing; - int m_antiAliasingOriginal; - int m_dpi; - int m_dpiOriginal; - int m_subPixelCurrentIndex = 0; - int m_subPixelCurrentIndexOriginal; - int m_hintingCurrentIndex = 0; - int m_hintingCurrentIndexOriginal; + State m_state; + State m_originalState; QStandardItemModel *m_subPixelOptionsModel; QStandardItemModel *m_hintingOptionsModel; - bool m_exclude = false; #endif }; diff --git a/kcms/fonts/fonts.cpp b/kcms/fonts/fonts.cpp --- a/kcms/fonts/fonts.cpp +++ b/kcms/fonts/fonts.cpp @@ -129,24 +129,25 @@ KXftConfig xft; if (xft.getExcludeRange(from, to)) { - m_excludeFrom = from; - m_excludeTo = to; + m_state.excludeFrom = from; + m_state.excludeTo = to; setExclude(true); } else { - m_excludeFrom = 8; - m_excludeTo = 15; + m_state.excludeFrom = 8; + m_state.excludeTo = 15; setExclude(false); } - m_excludeFromOriginal = m_excludeFrom; - m_excludeToOriginal = m_excludeTo; + m_originalState.exclude = m_state.exclude; + m_originalState.excludeFrom = m_state.excludeFrom; + m_originalState.excludeTo = m_state.excludeTo; excludeToChanged(); excludeFromChanged(); KXftConfig::SubPixel::Type spType; xft.getSubPixelType(spType); setSubPixelCurrentIndex(spType); - m_subPixelCurrentIndexOriginal = spType; + m_originalState.subPixel = spType; KXftConfig::Hint::Style hStyle; @@ -161,7 +162,7 @@ } setHintingCurrentIndex(hStyle); - m_hintingCurrentIndexOriginal = hStyle; + m_originalState.hinting = hStyle; KConfig _cfgfonts("kcmfonts"); KConfigGroup cfgfonts(&_cfgfonts, "General"); @@ -174,24 +175,28 @@ } if (dpicfg <= 0) { - m_dpiOriginal = 0; + m_originalState.dpi = 0; } else { - m_dpiOriginal = dpicfg; + m_originalState.dpi = dpicfg; }; setDpi(dpicfg); KSharedConfig::Ptr config = KSharedConfig::openConfig("kdeglobals"); KConfigGroup cg(config, "General"); if (cfgfonts.readEntry("dontChangeAASettings", true)) { - setAntiAliasing(1); //AASystem + setAntiAliasing(true); //AASystem + m_state.antiAliasingHasLocalConfig = false; } else if (cg.readEntry("XftAntialias", true)) { - setAntiAliasing(0); //AAEnabled + setAntiAliasing(true); //AAEnabled + m_state.antiAliasingHasLocalConfig = xft.antiAliasingHasLocalConfig(); } else { - setAntiAliasing(2); //AADisabled + setAntiAliasing(false); //AADisabled + m_state.antiAliasingHasLocalConfig = xft.antiAliasingHasLocalConfig(); } - m_antiAliasingOriginal = m_antiAliasing; + m_originalState.antiAliasing = m_state.antiAliasing; + m_originalState.antiAliasingHasLocalConfig = m_state.antiAliasingHasLocalConfig; } bool FontAASettings::save(KXftConfig::AntiAliasing::State aaState) @@ -201,13 +206,13 @@ KConfigGroup grp(&kglobals, "General"); xft.setAntiAliasing(aaState); - if (m_exclude) { - xft.setExcludeRange(m_excludeFrom, m_excludeTo); + if (m_state.exclude) { + xft.setExcludeRange(m_state.excludeFrom, m_state.excludeTo); } else { xft.setExcludeRange(0, 0); } - KXftConfig::SubPixel::Type spType = (KXftConfig::SubPixel::Type)m_subPixelCurrentIndex; + KXftConfig::SubPixel::Type spType = (KXftConfig::SubPixel::Type)m_state.subPixel; xft.setSubPixelType(spType); grp.writeEntry("XftSubPixel", KXftConfig::toStr(spType)); @@ -218,7 +223,7 @@ } bool mod = false; - KXftConfig::Hint::Style hStyle = (KXftConfig::Hint::Style)m_hintingCurrentIndex; + KXftConfig::Hint::Style hStyle = (KXftConfig::Hint::Style)m_state.hinting; xft.setHintStyle(hStyle); @@ -244,17 +249,17 @@ KConfigGroup cfgfonts(&_cfgfonts, "General"); if (KWindowSystem::isPlatformWayland()) { - cfgfonts.writeEntry("forceFontDPIWayland", m_dpi); + cfgfonts.writeEntry("forceFontDPIWayland", m_state.dpi); } else { - cfgfonts.writeEntry("forceFontDPI", m_dpi); + cfgfonts.writeEntry("forceFontDPI", m_state.dpi); } cfgfonts.sync(); #if HAVE_X11 // if the setting is reset in the module, remove the dpi value, // otherwise don't explicitly remove it and leave any possible system-wide value - if (m_dpi == 0 && m_dpiOriginal != 0 && !KWindowSystem::isPlatformWayland()) { + if (m_state.dpi == 0 && m_originalState.dpi != 0 && !KWindowSystem::isPlatformWayland()) { QProcess proc; proc.setProcessChannelMode(QProcess::ForwardedChannels); proc.start("xrdb", QStringList() << "-quiet" << "-remove" << "-nocpp"); @@ -272,41 +277,42 @@ // fontconfig setup may be much more complex than this module can provide. // TODO: With AASystem the changes already made by this module should be reverted somehow. #if defined(HAVE_FONTCONFIG) && defined (HAVE_X11) - if (mod || (m_antiAliasing != m_antiAliasingOriginal) || m_dpi != m_dpiOriginal) { + if (mod || (m_state.antiAliasing != m_originalState.antiAliasing) || m_state.dpi != m_originalState.dpi) { KMessageBox::information(0, i18n( "

Some changes such as anti-aliasing or DPI will only affect newly started applications.

" ), i18n("Font Settings Changed"), "FontSettingsChanged"); - m_antiAliasingOriginal = m_antiAliasing; - m_dpiOriginal = m_dpi; + m_originalState.antiAliasing = m_state.antiAliasing; + m_originalState.dpi = m_state.dpi; } #else #if HAVE_X11 - if (m_dpi != m_dpiOriginal) { + if (m_state.dpi != m_originalState.dpi) { KMessageBox::information(0, i18n( "

Some changes such as DPI will only affect newly started applications.

" ), i18n("Font Settings Changed"), "FontSettingsChanged"); - m_dpiOriginal = m_dpi; + m_originalState.dpi = m_state.dpi; } #endif #endif - m_excludeToOriginal = m_excludeTo; - m_excludeFromOriginal = m_excludeFrom; + m_originalState.excludeTo = m_state.excludeTo; + m_originalState.excludeFrom = m_state.excludeFrom; - m_subPixelCurrentIndexOriginal = m_subPixelCurrentIndex; - m_hintingCurrentIndexOriginal = m_hintingCurrentIndex; + m_originalState.subPixel = m_state.subPixel; + m_originalState.hinting = m_state.hinting; return mod; } void FontAASettings::defaults() { setExcludeTo(15); setExcludeFrom(8); - setAntiAliasing(1); - m_antiAliasingOriginal = m_antiAliasing; + setAntiAliasing(true); + m_originalState.antiAliasing = m_state.antiAliasing; + m_state.antiAliasingHasLocalConfig = false; setDpi(0); setSubPixelCurrentIndex(KXftConfig::SubPixel::NotSet); setHintingCurrentIndex(KXftConfig::Hint::NotSet); @@ -316,117 +322,117 @@ void FontAASettings::setExclude(bool exclude) { - if (exclude == m_exclude) { + if (exclude == m_state.exclude) { return; } - m_exclude = exclude; + m_state.exclude = exclude; emit excludeChanged(); } bool FontAASettings::exclude() const { - return m_exclude; + return m_state.exclude; } void FontAASettings::setExcludeTo(const int &excludeTo) { - if (m_excludeTo == excludeTo) { + if (m_state.excludeTo == excludeTo) { return; } - m_excludeTo = excludeTo; + m_state.excludeTo = excludeTo; emit excludeToChanged(); } int FontAASettings::excludeTo() const { - return m_excludeTo; + return m_state.excludeTo; } void FontAASettings::setExcludeFrom(const int &excludeTo) { - if (m_excludeFrom == excludeTo) { + if (m_state.excludeFrom == excludeTo) { return; } - m_excludeFrom = excludeTo; + m_state.excludeFrom = excludeTo; emit excludeToChanged(); } int FontAASettings::excludeFrom() const { - return m_excludeFrom; + return m_state.excludeFrom; } -void FontAASettings::setAntiAliasing(const int &antiAliasing) +void FontAASettings::setAntiAliasing(bool antiAliasing) { - if (m_antiAliasing == antiAliasing) { + if (m_state.antiAliasing == antiAliasing) { return; } - m_antiAliasing = antiAliasing; + m_state.antiAliasing = antiAliasing; emit aliasingChanged(); } -int FontAASettings::antiAliasing() const +bool FontAASettings::antiAliasing() const { - return m_antiAliasing; + return m_state.antiAliasing; +} + +bool FontAASettings::antiAliasingNeedsSave() const +{ + return m_state.antiAliasingHasLocalConfig || (m_state.antiAliasing != m_originalState.antiAliasing); } void FontAASettings::setDpi(const int &dpi) { - if (m_dpi == dpi) { + if (m_state.dpi == dpi) { return; } - m_dpi = dpi; + m_state.dpi = dpi; emit dpiChanged(); } int FontAASettings::dpi() const { - return m_dpi; + return m_state.dpi; } void FontAASettings::setSubPixelCurrentIndex(int idx) { - if (m_subPixelCurrentIndex == idx) { + if (m_state.subPixel == idx) { return; } - m_subPixelCurrentIndex = idx; + m_state.subPixel = idx; emit subPixelCurrentIndexChanged(); } int FontAASettings::subPixelCurrentIndex() { - return m_subPixelCurrentIndex; + return m_state.subPixel; } void FontAASettings::setHintingCurrentIndex(int idx) { - if (m_hintingCurrentIndex == idx) { + if (m_state.hinting == idx) { return; } - m_hintingCurrentIndex = idx; + m_state.hinting = idx; emit hintingCurrentIndexChanged(); } int FontAASettings::hintingCurrentIndex() { - return m_hintingCurrentIndex; + return m_state.hinting; } bool FontAASettings::needsSave() const { - return m_excludeTo != m_excludeToOriginal - || m_excludeFrom != m_excludeFromOriginal - || m_antiAliasing != m_antiAliasingOriginal - || m_dpi != m_dpiOriginal - || m_subPixelCurrentIndex != m_subPixelCurrentIndexOriginal - || m_hintingCurrentIndex != m_hintingCurrentIndexOriginal; + return m_state != m_originalState; } @@ -450,6 +456,8 @@ connect(m_fontAASettings, &FontAASettings::subPixelCurrentIndexChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::hintingCurrentIndexChanged, this, updateState); + connect(m_fontAASettings, &FontAASettings::excludeChanged, this, updateState); + connect(m_fontAASettings, &FontAASettings::excludeFromChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::excludeToChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::antiAliasingChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::aliasingChanged, this, updateState); @@ -539,7 +547,10 @@ KConfig _cfgfonts("kcmfonts"); KConfigGroup cfgfonts(&_cfgfonts, "General"); - FontAASettings::AASetting aaSetting = (FontAASettings::AASetting)m_fontAASettings->antiAliasing(); + FontAASettings::AASetting aaSetting = FontAASettings::AASystem; + if (m_fontAASettings->antiAliasingNeedsSave()) { + aaSetting = m_fontAASettings->antiAliasing() ? FontAASettings::AAEnabled : FontAASettings::AADisabled; + } cfgfonts.writeEntry("dontChangeAASettings", aaSetting == FontAASettings::AASystem); if (aaSetting == FontAASettings::AAEnabled) { @@ -707,5 +718,29 @@ return font; } +bool FontAASettings::State::operator==(const State& other) const +{ + if ( + exclude != other.exclude + || antiAliasing != other.antiAliasing + || dpi != other.dpi + || subPixel != other.subPixel + || hinting != other.hinting + ) { + return false; + } + + if (exclude && (excludeFrom != other.excludeFrom || excludeTo != other.excludeTo)) { + return false; + } + + return true; +} + +bool FontAASettings::State::operator!=(const State& other) const +{ + return !(*this == other); +} + #include "fonts.moc" diff --git a/kcms/fonts/kxftconfig.h b/kcms/fonts/kxftconfig.h --- a/kcms/fonts/kxftconfig.h +++ b/kcms/fonts/kxftconfig.h @@ -27,6 +27,7 @@ #include #include +#include class KXftConfig { @@ -156,6 +157,7 @@ void setHintStyle(Hint::Style style); void setAntiAliasing(AntiAliasing::State state); AntiAliasing::State getAntiAliasing() const; + bool antiAliasingHasLocalConfig() const; bool changed() { return m_madeChanges; @@ -168,22 +170,27 @@ private: + bool parseConfigFile(const QString& filename); void readContents(); void applySubPixelType(); void applyHintStyle(); void applyAntiAliasing(); void setHinting(bool set); void applyHinting(); void applyExcludeRange(bool pixel); + QString getConfigFile(); private: + + QStringList m_globalFiles; SubPixel m_subPixel; Exclude m_excludeRange, m_excludePixelRange; Hint m_hint; Hinting m_hinting; AntiAliasing m_antiAliasing; + bool m_antiAliasingHasLocalConfig; QDomDocument m_doc; QString m_file; bool m_madeChanges; diff --git a/kcms/fonts/kxftconfig.cpp b/kcms/fonts/kxftconfig.cpp --- a/kcms/fonts/kxftconfig.cpp +++ b/kcms/fonts/kxftconfig.cpp @@ -117,49 +117,6 @@ return !item.isNull() && 0 == KDE_lstat(QFile::encodeName(item), &info) ? info.st_mtime : 0; } -// -// Obtain location of config file to use. -QString getConfigFile() -{ - FcStrList *list = FcConfigGetConfigFiles(FcConfigGetCurrent()); - QStringList files; - FcChar8 *file; - QString home(dirSyntax(QDir::homePath())); - - while ((file = FcStrListNext(list))) { - QString f((const char *)file); - - if (fExists(f) && 0 == f.indexOf(home)) { - files.append(f); - } - } - FcStrListDone(list); - - // - // Go through list of files, looking for the preferred one... - if (files.count()) { - QStringList::const_iterator it(files.begin()), - end(files.end()); - - for (; it != end; ++it) - if (-1 != (*it).indexOf(QRegExp("/\\.?fonts\\.conf$"))) { - return *it; - } - return files.front(); // Just return the 1st one... - } else { // Hmmm... no known files? - if (FcGetVersion() >= 21000) { - QString targetPath(KGlobal::dirs()->localxdgconfdir() + "fontconfig"); - QDir target(targetPath); - if (!target.exists()) { - target.mkpath(targetPath); - } - return targetPath + "/fonts.conf"; - } else { - return home + "/.fonts.conf"; - } - } -} - static QString getEntry(QDomElement element, const char *type, unsigned int numAttributes, ...) { if (numAttributes == element.attributes().length()) { @@ -238,6 +195,53 @@ { } +// +// Obtain location of config file to use. +QString KXftConfig::getConfigFile() +{ + FcStrList *list = FcConfigGetConfigFiles(FcConfigGetCurrent()); + QStringList localFiles; + FcChar8 *file; + QString home(dirSyntax(QDir::homePath())); + + m_globalFiles.clear(); + + while ((file = FcStrListNext(list))) { + QString f((const char *)file); + + if (fExists(f) && 0 == f.indexOf(home)) { + localFiles.append(f); + } else { + m_globalFiles.append(f); + } + } + FcStrListDone(list); + + // + // Go through list of localFiles, looking for the preferred one... + if (localFiles.count()) { + QStringList::const_iterator it(localFiles.begin()), + end(localFiles.end()); + + for (; it != end; ++it) + if (-1 != (*it).indexOf(QRegExp("/\\.?fonts\\.conf$"))) { + return *it; + } + return localFiles.front(); // Just return the 1st one... + } else { // Hmmm... no known localFiles? + if (FcGetVersion() >= 21000) { + QString targetPath(KGlobal::dirs()->localxdgconfdir() + "fontconfig"); + QDir target(targetPath); + if (!target.exists()) { + target.mkpath(targetPath); + } + return targetPath + "/fonts.conf"; + } else { + return home + "/.fonts.conf"; + } + } +} + bool KXftConfig::reset() { bool ok = false; @@ -249,45 +253,23 @@ m_excludePixelRange.reset(); m_subPixel.reset(); m_antiAliasing.reset(); + m_antiAliasingHasLocalConfig = false; - QFile f(m_file); - - if (f.open(QIODevice::ReadOnly)) { - m_time = getTimeStamp(m_file); - ok = true; - m_doc.clear(); - - if (m_doc.setContent(&f)) { - readContents(); - } - f.close(); - } else { - ok = !fExists(m_file) && dWritable(getDir(m_file)); - } - - if (m_doc.documentElement().isNull()) { - m_doc.appendChild(m_doc.createElement("fontconfig")); + QStringList::const_iterator it(m_globalFiles.begin()), + end(m_globalFiles.end()); + for (; it != end; ++it) { + ok |= parseConfigFile(*it); } - - if (ok) { - // - // Check exclude range values - i.e. size and pixel size... - // If "size" range is set, ensure "pixelsize" matches... - if (!equal(0, m_excludeRange.from) || !equal(0, m_excludeRange.to)) { - double pFrom = (double)point2Pixel(m_excludeRange.from), - pTo = (double)point2Pixel(m_excludeRange.to); - - if (!equal(pFrom, m_excludePixelRange.from) || !equal(pTo, m_excludePixelRange.to)) { - m_excludePixelRange.from = pFrom; - m_excludePixelRange.to = pTo; - m_madeChanges = true; - } - } else if (!equal(0, m_excludePixelRange.from) || !equal(0, m_excludePixelRange.to)) { - // "pixelsize" set, but not "size" !!! - m_excludeRange.from = (int)pixel2Point(m_excludePixelRange.from); - m_excludeRange.to = (int)pixel2Point(m_excludePixelRange.to); - m_madeChanges = true; - } + + AntiAliasing globalAntialiasing = m_antiAliasing; + m_antiAliasing.state = AntiAliasing::NotSet; + + ok |= parseConfigFile(m_file); + + if (m_antiAliasing.state == AntiAliasing::NotSet) { + m_antiAliasing = globalAntialiasing; + } else { + m_antiAliasingHasLocalConfig = true; } return ok; @@ -518,48 +500,122 @@ } } +bool KXftConfig::parseConfigFile(const QString& filename) +{ + bool ok = false; + + QFile f(filename); + + if (f.open(QIODevice::ReadOnly)) { + m_time = getTimeStamp(filename); + ok = true; + m_doc.clear(); + + if (m_doc.setContent(&f)) { + readContents(); + } + f.close(); + } else { + ok = !fExists(filename) && dWritable(getDir(filename)); + } + + if (m_doc.documentElement().isNull()) { + m_doc.appendChild(m_doc.createElement("fontconfig")); + } + + if (ok) { + // + // Check exclude range values - i.e. size and pixel size... + // If "size" range is set, ensure "pixelsize" matches... + if (!equal(0, m_excludeRange.from) || !equal(0, m_excludeRange.to)) { + double pFrom = (double)point2Pixel(m_excludeRange.from), + pTo = (double)point2Pixel(m_excludeRange.to); + + if (!equal(pFrom, m_excludePixelRange.from) || !equal(pTo, m_excludePixelRange.to)) { + m_excludePixelRange.from = pFrom; + m_excludePixelRange.to = pTo; + m_madeChanges = true; + } + } else if (!equal(0, m_excludePixelRange.from) || !equal(0, m_excludePixelRange.to)) { + // "pixelsize" set, but not "size" !!! + m_excludeRange.from = (int)pixel2Point(m_excludePixelRange.from); + m_excludeRange.to = (int)pixel2Point(m_excludePixelRange.to); + m_madeChanges = true; + } + } + + return ok; +} + void KXftConfig::readContents() { QDomNode n = m_doc.documentElement().firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); - + if (!e.isNull()) { if ("match" == e.tagName()) { QString str; + + int childNodesCount = e.childNodes().count(); + QDomNode en = e.firstChild(); + while (!en.isNull()) { + if (en.isComment()) { + childNodesCount--; + } + en = en.nextSibling(); + } - switch (e.childNodes().count()) { + switch (childNodesCount) { case 1: - if ("font" == e.attribute("target")) { - QDomElement ene = e.firstChild().toElement(); - - if (!ene.isNull() && "edit" == ene.tagName()) { - if (!(str = getEntry(ene, "const", 2, "name", "rgba", "mode", - "assign")).isNull()) { - m_subPixel.node = n; - m_subPixel.type = strToType(str.toLatin1()); - } else if (!(str = getEntry(ene, "const", 2, "name", "hintstyle", "mode", - "assign")).isNull()) { - m_hint.node = n; - m_hint.style = strToStyle(str.toLatin1()); - } else if (!(str = getEntry(ene, "bool", 2, "name", "hinting", "mode", - "assign")).isNull()) { - m_hinting.node = n; - m_hinting.set = str.toLower() != "false"; - } else if (!(str = getEntry(ene, "bool", 2, "name", "antialias", "mode", - "assign")).isNull()) { - m_antiAliasing.node = n; - m_antiAliasing.state = str.toLower() != "false" ? - AntiAliasing::Enabled : AntiAliasing::Disabled; + if ("font" == e.attribute("target") || "pattern" == e.attribute("target")) { + QDomNode en = e.firstChild(); + while (!en.isNull()) { + QDomElement ene = en.toElement(); + + while (ene.isComment()) { + ene = ene.nextSiblingElement(); } + + if (!ene.isNull() && "edit" == ene.tagName()) { + if (!(str = getEntry(ene, "const", 2, "name", "rgba", "mode", + "assign")).isNull() + || (m_subPixel.type == SubPixel::NotSet && !(str = getEntry(ene, "const", 2, "name", "rgba", "mode", + "append")).isNull())) { + m_subPixel.node = n; + m_subPixel.type = strToType(str.toLatin1()); + } else if (!(str = getEntry(ene, "const", 2, "name", "hintstyle", "mode", + "assign")).isNull() + || (m_hint.style == Hint::NotSet && !(str = getEntry(ene, "const", 2, "name", "hintstyle", "mode", + "append")).isNull())) { + m_hint.node = n; + m_hint.style = strToStyle(str.toLatin1()); + } else if (!(str = getEntry(ene, "bool", 2, "name", "hinting", "mode", + "assign")).isNull()) { + m_hinting.node = n; + m_hinting.set = str.toLower() != "false"; + } else if (!(str = getEntry(ene, "bool", 2, "name", "antialias", "mode", + "assign")).isNull() + || (m_antiAliasing.state == AntiAliasing::NotSet && !(str = getEntry(ene, "bool", 2, "name", "antialias", "mode", + "append")).isNull())) { + m_antiAliasing.node = n; + m_antiAliasing.state = str.toLower() != "false" ? + AntiAliasing::Enabled : AntiAliasing::Disabled; + } + } + + en = en.nextSibling(); } } break; case 3: // CPD: Is target "font" or "pattern" ???? if ("font" == e.attribute("target")) { bool foundFalse = false; QDomNode en = e.firstChild(); + while (en.isComment()) { + en = en.nextSibling(); + } QString family; double from = -1.0, to = -1.0, @@ -775,6 +831,11 @@ } } +bool KXftConfig::antiAliasingHasLocalConfig() const +{ + return m_antiAliasingHasLocalConfig; +} + KXftConfig::AntiAliasing::State KXftConfig::getAntiAliasing() const { return m_antiAliasing.state; diff --git a/kcms/fonts/package/contents/ui/main.qml b/kcms/fonts/package/contents/ui/main.qml --- a/kcms/fonts/package/contents/ui/main.qml +++ b/kcms/fonts/package/contents/ui/main.qml @@ -31,7 +31,7 @@ Kirigami.FormLayout { id: formLayout - readonly property int maxImplicitWidth: Math.max(adjustAllFontsButton.implicitWidth, Math.max(antiAliasingComboBox.implicitWidth, Math.max(excludeField.implicitWidth, Math.max(subPixelCombo.implicitWidth, hintingCombo.implicitWidth)))) + readonly property int maxImplicitWidth: Math.max(adjustAllFontsButton.implicitWidth, excludeField.implicitWidth, subPixelCombo.implicitWidth, hintingCombo.implicitWidth) QtControls.Button { id: adjustAllFontsButton @@ -77,30 +77,28 @@ Kirigami.FormData.isSection: true } - QtControls.ComboBox { - id: antiAliasingComboBox - Layout.preferredWidth: formLayout.maxImplicitWidth - Kirigami.FormData.label: i18n("Use anti-aliasing:") - - model: [i18n("Enabled"), i18n("Vendor Default"), i18n("Disabled")] - - currentIndex: kcm.fontAASettings.antiAliasing - onCurrentIndexChanged: kcm.fontAASettings.antiAliasing = antiAliasingComboBox.currentIndex + QtControls.CheckBox { + id: antiAliasingCheckBox + checked: kcm.fontAASettings.antiAliasing + onCheckedChanged: kcm.fontAASettings.antiAliasing = checked + Kirigami.FormData.label: i18n("Anti-Aliasing:") + text: i18n("Use anti-aliasing") + Layout.fillWidth: true } QtControls.CheckBox { id: excludeCheckBox checked: kcm.fontAASettings.exclude onCheckedChanged: kcm.fontAASettings.exclude = checked; text: i18n("Exclude range from anti-aliasing") Layout.fillWidth: true - enabled: antiAliasingComboBox.currentIndex == 0 + enabled: antiAliasingCheckBox.checked } RowLayout { id: excludeField Layout.preferredWidth: formLayout.maxImplicitWidth - enabled: antiAliasingComboBox.currentIndex == 0 + enabled: antiAliasingCheckBox.checked QtControls.SpinBox { id: excludeFromSpinBox stepSize: 1 @@ -138,7 +136,7 @@ onCurrentIndexChanged: kcm.fontAASettings.subPixelCurrentIndex = currentIndex; model: kcm.fontAASettings.subPixelOptionsModel textRole: "display" - enabled: antiAliasingComboBox.currentIndex == 0 + enabled: antiAliasingCheckBox.checked popup.height: popup.implicitHeight delegate: QtControls.ItemDelegate { id: subPixelDelegate @@ -175,7 +173,7 @@ onCurrentTextChanged: kcm.fontAASettings.hintingCurrentIndex = currentIndex; model: kcm.fontAASettings.hintingOptionsModel textRole: "display" - enabled: antiAliasingComboBox.currentIndex == 0 + enabled: antiAliasingCheckBox.checked popup.height: popup.implicitHeight delegate: QtControls.ItemDelegate { id: hintingDelegate