deepin-terminal不能使用部分字体,导致用户安装字体无法使用。
结论:源码分析得出,setting程序挑选字体时只挑选等宽字体可供设置
源码dbusmanager给出获取系统字体方法callAppearanceFont
https://gitee.com/linuxdeepin/deepin-terminal/blob/5.4.36/src/main/dbusmanager.h
// deepin Appearance
#define APPEARANCESERVICE "com.deepin.daemon.Appearance"
#define APPEARANCEPATH "/com/deepin/daemon/Appearance"
https://gitee.com/linuxdeepin/deepin-terminal/blob/5.4.36/src/main/dbusmanager.cpp
FontDataListDBusManager::callAppearanceFont(QStringfontType)
{
FontDataListrList;
QDBusMessagemsg=
QDBusMessage::createMethodCall(APPEARANCESERVICE,APPEARANCEPATH,APPEARANCESERVICE,"List");
msg<<fontType;
QDBusMessageresponse=QDBusConnection::sessionBus().call(msg);
if(QDBusMessage::ReplyMessage==response.type()){
qInfo()<<"call List Success!";
QList<QVariant>list=response.arguments();
QStringfonts=list.value(list.count()-1).toString();
// 原本的返回值为QDBusPendingReply<QString> => QString
fonts.replace("[","");
fonts.replace("]","");
fonts.replace("\"","");
// 用逗号分隔
QStringListfontList=fonts.split(",");
rList=callAppearanceFont(fontList,fontType);
}else{
qInfo()<<"call List Fail!"<<response.errorMessage();
}
源码settings给出获取系统等宽字体monospacefont
https://gitee.com/linuxdeepin/deepin-terminal/blob/5.4.36/src/settings/settings.cpp
QPair<QWidget*,QWidget*>Settings::createFontComBoBoxHandle(QObject*obj)
{
autooption=qobject_cast<DTK_CORE_NAMESPACE::DSettingsOption*>(obj);
/******** Modify by ut001000 renfeixiang 2020-06-15:修改 comboBox修改成成员变量,修改DBUS获取失败场景,设置成系统默认等宽字体 Begin***************/
comboBox=newDComboBox;
comboBox->setObjectName("SettingsFontFamilyComboBox");//Add by ut001000 renfeixiang 2020-08-14
QPair<QWidget*,QWidget*>optionWidget=
DSettingsWidgetFactory::createStandardItem(QByteArray(),option,comboBox);
FontDataListWhitelist=DBusManager::callAppearanceFont("monospacefont");
std::sort(Whitelist.begin(),Whitelist.end(),[=](constFontData&str1,constFontData&str2){
QCollatorqc;
returnqc.compare(str1.value,str2.value)<0;
});
qInfo()<<"createFontComBoBoxHandle get system monospacefont";
if(Whitelist.size()<=0){
//一般不会走这个分支,除非DBUS出现问题
qInfo()<<"DBusManager::callAppearanceFont failed, get control font failed.";
//DBUS获取字体失败后,设置系统默认的等宽字体
QStringListfontlist;
fontlist<<"Courier 10 Pitch"<<"DejaVu Sans Mono"<<"Liberation Mono"
<<"Noto Mono"<<"Noto Sans Mono"<<"Noto Sans Mono CJK JP"
<<"Noto Sans Mono CJK KR"<<"Noto Sans Mono CJK SC"
<<"Noto Sans Mono CJK TC";
Whitelist.appendValues(fontlist);
https://blog.csdn.net/arv002/article/details/125271709
使用qdbus工具验证主程序方法:
#qdbus --literal com.deepin.daemon.Appearance /com/deepin/daemon/Appearance List "monospacefont"
"["Courier 10 Pitch","DejaVu Sans Mono","Liberation Mono","Nimbus Mono PS","Noto Mono","Noto Sans Mono","Noto Sans Mono CJK HK","Noto Sans Mono CJK JP","Noto Sans Mono CJK KR","Noto Sans Mono CJK SC","Noto Sans Mono CJK TC"]"