1 /****************************************************************************
3 ** Copyright (C) 2012 Takumi Asaki
4 ** All rights reserved.
5 ** Contact: Takumi Asaki (takumi.asaki@gmail.com)
7 ** This file is part of the fontmanager application.
9 ** You may use this file under the terms of the BSD license as follows:
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
14 ** * Redistributions of source code must retain the above copyright
15 ** notice, this list of conditions and the following disclaimer.
16 ** * Redistributions in binary form must reproduce the above copyright
17 ** notice, this list of conditions and the following disclaimer in
18 ** the documentation and/or other materials provided with the
20 ** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
21 ** the names of its contributors may be used to endorse or promote
22 ** products derived from this software without specific prior written
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
37 ****************************************************************************/
39 #include "fontconfigmanager.h"
41 #include "fontconfigdefs.h"
42 #include "installedfontinfo.h"
43 #include "fontsconfigproperties.h"
45 #include "fontsconf.h"
50 #include <QXmlStreamReader>
53 #include <QFontMetrics>
54 #include <QFontDatabase>
56 #include <QTextStream>
58 #undef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
60 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
64 #define FCBIN_PATH "/usr/bin/"
65 #define FCCACHE_COMMAND "fc-cache"
66 #define FCCACHE_OPTION "-v"
67 #define FCLIST_COMMAND "fc-list"
68 #define FCLIST_OPTION "-v"
70 FontConfigManager::FontConfigManager(QObject *parent) :
71 QObject(parent), mLang("en"), mLocalFontsConf(0)
73 connect(this, SIGNAL(localFontsConfPathChanged()), SIGNAL(localFontsConfExistsChanged()));
74 // connect(this, SIGNAL(localFontsConfPathChanged()), SIGNAL(fontsConfUpdated()));
76 mLocalFontsConf = new FontsConf(this);
77 mSystemLocalConf = new FontsConf(this);
79 QStringList cjkConflicts;
80 cjkConflicts << "ja" << "ko" << "zh-cn" << "zh-hk" << "zh-mo" << "zh-sg" << "zh-tw";
81 mConflictFonts << cjkConflicts;
83 mSystemLocalConf->load("/etc/fonts/local.conf");
87 QString FontConfigManager::currentLanguage() const
92 void FontConfigManager::setCurrentLanguage(const QString &lang)
97 QString FontConfigManager::localFontPath() const
99 return mLocalFontPath;
102 void FontConfigManager::setLocalFontPath(const QString &path)
104 mLocalFontPath = path;
107 QString FontConfigManager::localFontsConfPath() const
109 return mLocalFontsConfPath;
112 void FontConfigManager::setLocalFontsConfPath(const QString &path)
114 if (mLocalFontsConfPath != path) {
115 mLocalFontsConfPath = path;
116 emit localFontsConfPathChanged();
120 bool FontConfigManager::localFontsConfExists() const
122 return QFile::exists(mLocalFontsConfPath);
125 bool FontConfigManager::hasUnknownConfig() const
127 if (!mLocalFontsConf)
129 return mLocalFontsConf->hasUnknownConfig();
132 bool FontConfigManager::fontsConfModified() const
134 if (!mLocalFontsConf)
136 return mLocalFontsConf->modified();
139 bool FontConfigManager::isEmptyLocalFontsConf() const
141 return !mLocalFontsConf || mLocalFontsConf->isEmpty();
144 QStringList FontConfigManager::fontCount(const QString &fontpath) const
146 QStringList fontList;
147 foreach (InstalledFontInfo *info, mFcListInfo) {
148 if (info->file() == fontpath)
149 fontList << info->localefamily();
154 InstalledFontInfo *FontConfigManager::fontInfo(const QString &family, const QString &fullname) const
156 InstalledFontInfo *info = 0;
157 foreach (info, mFcListInfo) {
158 if (info->family().contains(family)) {
159 if (fullname.isEmpty())
161 if (info->fullname().contains(fullname))
168 InstalledFontInfo *FontConfigManager::fontInfo(int index) const
170 if (index >= 0 && index < mFcListInfo.count())
171 return mFcListInfo.at(index);
175 int FontConfigManager::count() const
177 return mFcListInfo.count();
180 void FontConfigManager::appendFontProperty(FontsConfigProperties *prop, const QStringList &familyList)
182 if (!mLocalFontsConf)
185 QStringList preferedFamilies(mLocalFontsConf->preferFamily());
186 preferedFamilies << prop->preferFamilies();
187 preferedFamilies.removeDuplicates();
188 foreach (const QString &family, preferedFamilies) {
189 if (prop->preferFamilies().contains(family)) {
190 if (familyList.isEmpty())
191 mLocalFontsConf->appendPreferFamilyFor(family, prop->family());
193 foreach (const QString &f, familyList)
194 mLocalFontsConf->appendPreferFamilyFor(family, f);
196 if (familyList.isEmpty())
197 mLocalFontsConf->removePreferFamilyFor(family, prop->family());
199 foreach (const QString &f, familyList)
200 mLocalFontsConf->removePreferFamilyFor(family, f);
204 QStringList keys = FontsConf::configKeys();
205 foreach (const QString &key, keys) {
206 if (prop->configValue(key) == FontsConfigProperties::Default) {
207 if (familyList.isEmpty())
208 mLocalFontsConf->unsetMatchEditValueFor(key, prop->family());
210 foreach (const QString &f, familyList)
211 mLocalFontsConf->unsetMatchEditValueFor(key, f);
213 if (familyList.isEmpty())
214 mLocalFontsConf->setMatchEditValueFor(key, prop->family(), (prop->configValue(key) == FontsConfigProperties::True));
216 foreach (const QString &f, familyList)
217 mLocalFontsConf->setMatchEditValueFor(key, f, (prop->configValue(key) == FontsConfigProperties::True));
221 emit fontsConfUpdated();
224 void FontConfigManager::appendFontProperty(InstalledFontInfo *fontInfo)
226 QStringList familyList;
227 familyList << fontInfo->enfamily();
228 appendFontProperty(fontInfo->fontProperty(), familyList);
231 FontsConfigProperties *FontConfigManager::fontProperty(const QString &family, const QStringList &familyList) const
233 FontsConfigProperties *prop = new FontsConfigProperties(family);
234 QStringList families;
235 QStringList preferedFamilies = mLocalFontsConf->preferFamily();
236 foreach (const QString &key, preferedFamilies) {
237 families = mLocalFontsConf->preferFamilyFor(key);
238 if (families.contains(family))
239 prop->addPreferFamily(key);
240 foreach (const QString &f, familyList) {
241 if (families.contains(f))
242 prop->addPreferFamily(key);
246 QStringList keys = FontsConf::configKeys();
247 foreach (const QString &key, keys) {
248 QString val = mLocalFontsConf->matchEditValueFor(key, prop->family());
249 if (!val.isEmpty()) {
250 prop->setConfigValue(key, (QVariant(val).toBool() ? FontsConfigProperties::True : FontsConfigProperties::False));
253 foreach (const QString &f, familyList) {
254 mLocalFontsConf->matchEditValueFor(key, f);
255 if (!val.isEmpty()) {
256 prop->setConfigValue(key, (QVariant(val).toBool() ? FontsConfigProperties::True : FontsConfigProperties::False));
265 FontsConfigProperties *FontConfigManager::fontProperty(InstalledFontInfo *fontInfo) const
267 return fontProperty(fontInfo->enfamily(), fontInfo->family());
270 QString FontConfigManager::localFontsConf() const
272 QFile fp(mLocalFontsConfPath);
277 if (!fp.open(QIODevice::ReadOnly))
281 ts.setCodec("UTF-8");
282 QString buf = ts.readAll();
289 QStringList FontConfigManager::preferFamilyFor(const QString &family) const
291 return mLocalFontsConf->preferFamilyFor(family);
294 QStringList FontConfigManager::acceptFamilyFor(const QString &family) const
296 return mLocalFontsConf->acceptFamilyFor(family);
299 QStringList FontConfigManager::prependFamilyFor(const QString &family) const
301 return mLocalFontsConf->prependFamilyFor(family);
304 QStringList FontConfigManager::appendFamilyFor(const QString &family) const
306 return mLocalFontsConf->appendFamilyFor(family);
309 bool FontConfigManager::isConflict(const QString &family, const QStringList &lang) const
311 InstalledFontInfo *info = fontInfo(family);
315 QList<int> confListIndex;
316 for (int i = 0; i < mConflictFonts.count(); i++) {
317 const QStringList list(mConflictFonts.at(i));
318 foreach (const QString &f, list) {
319 if (lang.contains(f)) {
320 if (!confListIndex.contains(i))
327 if (confListIndex.isEmpty())
330 foreach (int i, confListIndex) {
331 QStringList confList = mConflictFonts.at(confListIndex.at(i));
332 foreach (const QString &f, confList) {
333 if (info->lang().contains(f)) {
342 QStringList FontConfigManager::systemPreferFamilyFor(const QString &family) const
344 return mSystemLocalConf->preferFamilyFor(family);
347 void FontConfigManager::importSystemSettings(const QString &family)
349 QStringList systemFamilyList = systemPreferFamilyFor(family);
351 QStringList installedFontLang;
352 foreach (InstalledFontInfo *info, mFcListInfo) {
353 if (info->systemFont())
355 installedFontLang << info->lang();
357 installedFontLang.sort();
358 installedFontLang.removeDuplicates();
360 emit startUpdateFontsConfig();
361 foreach (const QString &f, systemFamilyList) {
362 InstalledFontInfo *info = fontInfo(f);
366 if (isConflict(f, installedFontLang))
367 mLocalFontsConf->appendAcceptFamilyFor(family, f);
369 mLocalFontsConf->appendPrependFamilyFor(family, f);
371 emit endUpdateFontsConfig();
373 if (mLocalFontsConf->modified()) {
374 emit fontsConfUpdated();
378 void FontConfigManager::createRecommendedSettings()
380 QList<InstalledFontInfo*> sansSerifFonts;
381 QList<InstalledFontInfo*> serifFonts;
382 QList<InstalledFontInfo*> monospaceFonts;
383 QList<InstalledFontInfo*> monospaceSansSerifFonts;
384 QList<InstalledFontInfo*> monospaceSerifFonts;
385 QList<InstalledFontInfo*> unknownFonts;
387 foreach (InstalledFontInfo *info, mFcListInfo) {
388 if (info->systemFont())
390 if (maybeMonospaceFont(info)) {
391 if (maybeSansSerifFont(info))
392 monospaceSansSerifFonts << info;
393 else if (maybeSerifFont(info))
394 monospaceSerifFonts << info;
396 monospaceFonts << info;
397 } else if (maybeSansSerifFont(info))
398 sansSerifFonts << info;
399 else if (maybeSerifFont(info))
402 unknownFonts << info;
405 emit startUpdateFontsConfig();
408 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
410 foreach (InstalledFontInfo *info, monospaceFonts)
411 f << info->localefamily();
412 qDebug() << "Mono:" << f;
414 foreach (InstalledFontInfo *info, monospaceSansSerifFonts)
415 f << info->localefamily();
416 qDebug() << "Mono(Sans Serif):" << f;
418 foreach (InstalledFontInfo *info, monospaceSerifFonts)
419 f << info->localefamily();
420 qDebug() << "Mono(Serif):" << f;
422 foreach (InstalledFontInfo *info, sansSerifFonts)
423 f << info->localefamily();
424 qDebug() << "Sans Serif:" << f;
426 foreach (InstalledFontInfo *info, serifFonts)
427 f << info->localefamily();
428 qDebug() << "Serif:" << f;
430 foreach (InstalledFontInfo *info, unknownFonts)
431 f << info->localefamily();
432 qDebug() << "Unknown:" << f;
435 if (monospaceFonts.count())
436 foreach (InstalledFontInfo *info, monospaceFonts) {
437 addPreferFamily(MONOSPACE_DEF, info->enfamily());
439 else if (monospaceSansSerifFonts.count())
440 foreach (InstalledFontInfo *info, monospaceSansSerifFonts) {
441 addPreferFamily(MONOSPACE_DEF, info->enfamily());
443 else if (monospaceSerifFonts.count())
444 foreach (InstalledFontInfo *info, monospaceSerifFonts) {
445 addPreferFamily(MONOSPACE_DEF, info->enfamily());
448 if (sansSerifFonts.count())
449 foreach (InstalledFontInfo *info, sansSerifFonts) {
450 addPreferFamily(SANSSERIF_DEF, info->enfamily());
451 addPreferFamily(SYSTEM_DEF, info->enfamily());
453 else if (monospaceSansSerifFonts.count())
454 foreach (InstalledFontInfo *info, monospaceSansSerifFonts) {
455 addPreferFamily(SANSSERIF_DEF, info->enfamily());
456 addPreferFamily(SYSTEM_DEF, info->enfamily());
458 else if (unknownFonts.count())
459 foreach (InstalledFontInfo *info, unknownFonts) {
460 addPreferFamily(SANSSERIF_DEF, info->enfamily());
461 addPreferFamily(SYSTEM_DEF, info->enfamily());
463 else if (monospaceFonts.count())
464 foreach (InstalledFontInfo *info, monospaceFonts) {
465 addPreferFamily(SANSSERIF_DEF, info->enfamily());
466 addPreferFamily(SYSTEM_DEF, info->enfamily());
469 if (serifFonts.count())
470 foreach (InstalledFontInfo *info, serifFonts) {
471 addPreferFamily(SERIF_DEF, info->enfamily());
473 else if (monospaceSerifFonts.count())
474 foreach (InstalledFontInfo *info, monospaceSerifFonts) {
475 addPreferFamily(SANSSERIF_DEF, info->enfamily());
477 else if (unknownFonts.count())
478 foreach (InstalledFontInfo *info, unknownFonts) {
479 addPreferFamily(SERIF_DEF, info->enfamily());
481 else if (monospaceFonts.count())
482 foreach (InstalledFontInfo *info, monospaceFonts) {
483 addPreferFamily(SERIF_DEF, info->enfamily());
486 foreach (const QString &f, FontsConf::genericFamilies())
487 importSystemSettings(f);
488 emit endUpdateFontsConfig();
490 emit fontsConfUpdated();
493 QStringList FontConfigManager::installableFamily(const QString &family, bool localOnly)
495 QStringList installedFont;
496 installedFont << prependFamilyFor(family);
497 installedFont << appendFamilyFor(family);
498 installedFont << preferFamilyFor(family);
499 installedFont << acceptFamilyFor(family);
501 QStringList familyList;
502 foreach (InstalledFontInfo *info, mFcListInfo) {
503 if (localOnly && info->systemFont())
506 foreach (const QString &f, info->family()) {
507 if (installedFont.contains(f)) {
513 familyList << info->localefamily();
516 familyList.removeDuplicates();
521 QString FontConfigManager::localeFamily(const QString &family) const
523 if (mEnLocaleFontMap.contains(family))
524 return mEnLocaleFontMap.value(family);
528 bool FontConfigManager::maybeSansSerifFont(InstalledFontInfo *info) const
530 foreach (const QString &f, info->family()) {
531 if (f.contains("gothic", Qt::CaseInsensitive) ||
532 f.contains("arial", Qt::CaseInsensitive) ||
533 f.contains("helvetica", Qt::CaseInsensitive) ||
534 f.contains("verdana", Qt::CaseInsensitive) ||
535 f.contains("sans", Qt::CaseInsensitive))
541 bool FontConfigManager::maybeSerifFont(InstalledFontInfo *info) const
543 foreach (const QString &f, info->family()) {
544 if (f.contains("mincho", Qt::CaseInsensitive) ||
545 f.contains("times", Qt::CaseInsensitive) ||
546 (f.contains("serif", Qt::CaseInsensitive) && !f.contains("sans", Qt::CaseInsensitive)))
552 #define DEFAULT_POINTSIZE 24
554 bool FontConfigManager::maybeMonospaceFont(InstalledFontInfo *info) const
557 QFont font = font4info(info, DEFAULT_POINTSIZE);
558 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
559 qDebug() << "0 - FontConfigManager::maybeMonospaceFont(" << info->enfamily() << info->enstyle() << point << ")" << font.family() << font.exactMatch();
561 if (!font.exactMatch() || font.family() != info->enfamily()) {
562 fontId = QFontDatabase::addApplicationFont(info->file());
563 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
564 qDebug() << "\tfontId:" << fontId << info->file();
567 font = font4info(info, DEFAULT_POINTSIZE);
568 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
569 qDebug() << "1 - FontConfigManager::maybeMonospaceFont(" << info->enfamily() << info->enstyle() << point << ")" << font.family() << font.exactMatch();
571 if (!font.exactMatch() || font.family() != info->enfamily()) {
572 font = QFont(info->enfamily());
573 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
574 qDebug() << "2 - FontConfigManager::maybeMonospaceFont(" << info->enfamily() << info->enstyle() << point << ")" << font.family() << font.exactMatch();
579 bool isFixed = false;
580 if (font.exactMatch()) {
582 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
583 qDebug() << "\tfixedPitch:" << fi.fixedPitch();
585 if (fi.fixedPitch()) {
588 QFontMetrics fm(font);
589 int w = fm.width(QLatin1Char('A'));
590 #ifdef FONTMANAGER_DEBUG_RECOMMENDED_SETTINGS
591 qDebug() << "\twidth:" << w << fm.width(QLatin1Char('i')) << fm.width(QLatin1Char('X'));
593 if (fm.width(QLatin1Char('i')) == w && fm.width(QLatin1Char('X')) == w) {
599 QFontDatabase::removeApplicationFont(fontId);
602 foreach (const QString &f, info->family()) {
603 if (f.contains("courier", Qt::CaseInsensitive) ||
604 f.contains("mono", Qt::CaseInsensitive))
610 QFont FontConfigManager::font4info(InstalledFontInfo *info, int pointSize) const
613 int point = pointSize;
614 if (!fdb.isScalable(info->enfamily(), info->enstyle())) {
615 QList<int> points = fdb.pointSizes(info->enfamily(), info->enstyle());
616 if (points.count() > 0)
617 point = points.first();
619 QFont font = fdb.font(info->enfamily(), info->enstyle(), point);
623 void FontConfigManager::runFcCache()
625 QProcess *proc = new QProcess(this);
626 connect(proc, SIGNAL(finished(int)), SIGNAL(fcCacheFinished()));
627 connect(proc, SIGNAL(finished(int)), proc, SLOT(deleteLater()));
628 proc->start(FCBIN_PATH FCCACHE_COMMAND, QStringList() << FCCACHE_OPTION);
631 void FontConfigManager::readFcList()
633 QProcess *proc = new QProcess(this);
634 proc->start(FCBIN_PATH FCLIST_COMMAND, QStringList() << FCLIST_OPTION);
635 if (!proc->waitForStarted())
638 if (!proc->waitForFinished())
641 qDeleteAll(mFcListInfo);
643 mEnLocaleFontMap.clear();
645 QByteArray buf = proc->readAllStandardOutput();
646 QByteArray errbuf = proc->readAllStandardError();
647 if (!errbuf.isEmpty())
648 qWarning("%s", errbuf.constData());
649 Q_ASSERT(errbuf.isEmpty());
651 static QByteArray emptyLine("\n");
652 QBuffer buffer(&buf);
654 buffer.open(QIODevice::ReadOnly);
655 Q_ASSERT(buffer.isOpen());
656 while (!buffer.atEnd()) {
657 QByteArray linebuf = buffer.readLine();
658 if (linebuf.isEmpty() || linebuf == emptyLine) {
659 if (!fibuf.isEmpty()) {
660 InstalledFontInfo *info = new InstalledFontInfo(fibuf, mLocalFontPath, this);
661 info->setLocale(mLang);
662 if (info->isValid()) {
663 mFcListInfo.append(info);
664 mEnLocaleFontMap.insert(info->enfamily(), info->localefamily());
665 info->setFontProperty(fontProperty(info));
674 Q_ASSERT(fibuf.isEmpty());
677 qSort(mFcListInfo.begin(), mFcListInfo.end(), InstalledFontInfo::compare);
679 emit fontListUpdated();
684 void FontConfigManager::readFontsConf()
686 mLocalFontsConf->load(mLocalFontsConfPath);
687 emit fontsConfUpdated();
690 void FontConfigManager::saveFontsConf()
692 if (!mLocalFontsConf || mLocalFontsConfPath.isEmpty())
695 bool check = localFontsConfExists();
696 if (isEmptyLocalFontsConf()) {
698 QFile::remove(mLocalFontsConfPath);
699 emit localFontsConfExistsChanged();
702 mLocalFontsConf->save(mLocalFontsConfPath);
704 emit localFontsConfExistsChanged();
708 void FontConfigManager::backupFontsConf(const QString &filepath)
710 if (filepath.isEmpty() || isEmptyLocalFontsConf())
712 mLocalFontsConf->save(filepath);
715 void FontConfigManager::restoreFontsConf(const QString &filepath)
717 if (filepath.isEmpty() || !QFile::exists(filepath))
719 FontsConf *restoredConf = new FontsConf(this);
720 restoredConf->load(filepath);
721 if (restoredConf->isValid()) {
722 mLocalFontsConf->copy(restoredConf);
723 emit fontsConfUpdated();
728 void FontConfigManager::resetFontsConf()
730 if (!mLocalFontsConf)
732 mLocalFontsConf->initFontsConf();
733 emit fontsConfUpdated();
736 void FontConfigManager::addPreferFamily(const QString &family, const QString &value)
738 mLocalFontsConf->appendPreferFamilyFor(family, value);
739 emit fontsConfUpdated();
742 void FontConfigManager::addAcceptFamily(const QString &family, const QString &value)
744 mLocalFontsConf->appendAcceptFamilyFor(family, value);
745 emit fontsConfUpdated();
748 void FontConfigManager::addPrependFamily(const QString &family, const QString &value)
750 mLocalFontsConf->appendPrependFamilyFor(family, value);
751 emit fontsConfUpdated();
754 void FontConfigManager::addAppendFamily(const QString &family, const QString &value)
756 mLocalFontsConf->appendAppendFamilyFor(family, value);
757 emit fontsConfUpdated();
760 void FontConfigManager::insertPreferFamily(const QString &family, const QString &value, int index)
762 mLocalFontsConf->insertPreferFamilyFor(family, value, index);
763 emit fontsConfUpdated();
766 void FontConfigManager::insertAcceptFamily(const QString &family, const QString &value, int index)
768 mLocalFontsConf->insertAcceptFamilyFor(family, value, index);
769 emit fontsConfUpdated();
772 void FontConfigManager::insertPrependFamily(const QString &family, const QString &value, int index)
774 mLocalFontsConf->insertPrependFamilyFor(family, value, index);
775 emit fontsConfUpdated();
778 void FontConfigManager::insertAppendFamily(const QString &family, const QString &value, int index)
780 mLocalFontsConf->insertAppendFamilyFor(family, value, index);
781 emit fontsConfUpdated();
784 void FontConfigManager::removePreferFamily(const QString &family, const QString &value)
786 mLocalFontsConf->removePreferFamilyFor(family, value);
787 emit fontsConfUpdated();
790 void FontConfigManager::removeAcceptFamily(const QString &family, const QString &value)
792 mLocalFontsConf->removeAcceptFamilyFor(family, value);
793 emit fontsConfUpdated();
796 void FontConfigManager::removePrependFamily(const QString &family, const QString &value)
798 mLocalFontsConf->removePrependFamilyFor(family, value);
799 emit fontsConfUpdated();
802 void FontConfigManager::removeAppendFamily(const QString &family, const QString &value)
804 mLocalFontsConf->removeAppendFamilyFor(family, value);
805 emit fontsConfUpdated();