使用 DDesktopEntry 解析 desktop 文件
使用 DDesktopEntry 解析 desktop 文件
# Desktop 文件简介
# Desktop 文件为 Linux 下软件程序的 快捷方式
Desktop Entry
文件是Linux
桌面系统中用于描述程序启动配置信息的文件,它以.desktop
为后缀名,相当于Windows
系统下的桌面快捷方式。通常一个二进制可执行程序是一个没有后缀没有图标的文件,不可以随意移动。
因此很多Linux发行版都提供了启动器,便于集中管理应用程序。启动器本质是一个位于/usr/share/applications/路径下的目录。启动器目录中存放着很多.desktop文件,每个.desktop文件都是一个应用程序的入口,并且.desktop文件可以显示图标,对用户更加友好。
# Desktop 基本模板
[Desktop Entry]
Name=<应用程序名>
Type=Application
Exec=<应用程序完整路径>
Icon=<应用程序图标的完整路径>
- Name: desktop 文件最终显示的名称(一定要注意和 desktop 文件名的区别)
- Type: 用于指定 desktop 文件的类型(包括 3 种类型:Application、Link、Directory)
- Exec: 用于指定二进制可执行程序的完整路径
- Icon: 指定应用程序图标的完整路径(可以省略后缀名)。图标支持 png 格式、svg 格式等,图标的推荐尺寸为 128x128。
Categories | 分类 |
---|---|
Network | 网络应用 |
Chat | 社交沟通 |
Audio | 音乐欣赏 |
Video | 视频播放 |
Graphics | 图形图像 |
Office | 办公学习 |
Translation | 阅读翻译 |
Development | 编程开发 |
Utility | 系统管理 |
Other/非以上内容 | 其他 |
# uos 系统下使用的 desktop 文件
1.企业微信应用程序的 desktop 文件结构
[Desktop Entry]
Encoding=UTF-8
Type=Application
X-Created-By=Deepin WINE Team
Categories=chat;
Icon=com.qq.weixin.work.deepin
Exec="/opt/apps/com.qq.weixin.work.deepin/files/run.sh" -u %u
Name=WeChat Work
Name[zh_CN]=企业微信
Comment=Tencent WeChat Work Client on Deepin Wine
StartupWMClass=WXWork.exe
MimeType=
2.WPS 应用程序的 desktop 文件结构
[Desktop Entry]
Comment=Use WPS Writer to edit articles and reports.
Comment[zh_CN]=使用 WPS 文字编写报告,排版文章
Exec=/usr/bin/wps %f
GenericName=WPS Writer
GenericName[zh_CN]=WPS 文字
MimeType=application/wps-office.wps;application/wps-office.wpt;application/wps-office.wpso;application/wps-office.wpss;application/wps-office.doc;application/wps-office.dot;application/vnd.ms-word;application/msword;application/x-msword;application/msword-template;application/wps-office.docx;application/wps-office.dotx;application/rtf;application/vnd.ms-word.document.macroEnabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.document
Name=WPS Writer
Name[zh_CN]=WPS 文字
StartupNotify=false
Terminal=false
Type=Application
Categories=Office;WordProcessor;Qt;
X-DBUS-ServiceName=
X-DBUS-StartupType=
X-KDE-SubstituteUID=false
X-KDE-Username=
Icon=wps-office2019-wpsmain
InitialPreference=3
StartupWMClass=wps
# 参考资料
Desktop_entries (opens new window)
freedesktop.org网站 (opens new window)
# DDesktopEntry 使用介绍
# 使用 DDesktopEntry 所需环境
uos 系统下使用 apt 安装相关开发库即可,源码文件位于项目 dtkcore 下 ddesktopentry.cpp 文件中
sudo apt install -y libdtkcore5 安装后即可使用 DDesktopEntry 进行开发
sudo apt install -y libdtkcore5-dbgsym 安装后可以使用堆栈信息调试到 DDesktopEntry 源码
# 相关接口介绍
QString name() const; //获取 desktop 文件中 Name 字段的值
QString genericName() const; //获取 desktop 文件中 GenericName 字段的值
QString ddeDisplayName() const; //当 desktop 文件中 X-Deepin-Vendor 字段的值为 deepin 时, 返回 genericName();否则,返回 name()
QString comment() const; //获取 desktop 文件中 Comment 字段的值
QString stringValue(const QString &key, const QString §ion = "Desktop Entry",
const QString &defaultValue = QString()) const; //获取 desktop 文件中 指定的 ‘key’ 字段的值
bool setStringValue(const QString &value, const QString &key, const QString& section = "Desktop Entry"); //设置 desktop 文件中 指定的 ‘key’ 字段的值
# 使用代码范例
DDesktopEntry desktop(fileName); //指定需要解析的 desktop 文件名
m_name = desktop.name();
m_genericName = desktop.genericName();
if(desktop.contains("X-Deepin-AppID")){
m_deepinId = desktop.stringValue("X-Deepin-AppID",
"Desktop Entry",
settings.value("X-Deepin-AppID").toString());
}
if(desktop.contains("X-Deepin-Vendor")){
m_deepinVendor = desktop.stringValue("X-Deepin-Vendor",
"Desktop Entry",
settings.value("X-Deepin-Vendor").toString());
}
QString nLocalKey = QString("Name[%1]").arg(QLocale::system().name());
if (desktop.contains(nLocalKey)){
m_localName = desktop.stringValue(nLocalKey, "Desktop Entry", m_name);
}else{
m_localName = m_name;
}
# DDesktopEntry 获取指定格式的 key 的值
使用 DDesktopEntry 类可以获取指定格式的 key 的值,也可是给指定格式的 key 设置值。相关的接口:
获取
QString rawValue(const QString &key, const QString §ion = "Desktop Entry",
const QString &defaultValue = QString()) const;
QString stringValue(const QString &key, const QString §ion = "Desktop Entry",
const QString &defaultValue = QString()) const;
QString localizedValue(const QString &key, const QString &localeKey = "default",
const QString §ion = "Desktop Entry", const QString& defaultValue = QString()) const;
设置
bool setRawValue(const QString &value, const QString &key, const QString& section = "Desktop Entry");
bool setStringValue(const QString &value, const QString &key, const QString& section = "Desktop Entry");
bool setLocalizedValue(const QString &value, const QString& localeKey,
const QString &key, const QString& section = "Desktop Entry");
- rawValue:获取的是原始的 key 字段的值。比如 "key"为"Name" ,则去匹配 "Name"字段获取相应的值;遇到转义字符情况,匹配的是转义之后的字符 "key"。
- stringValue:和raw的区别在于,当遇到遇到转义字符情况,回去匹配转义之前的字符 "key",获取相应的值。
- localizedValue:可以和带有本地化格式的字符"key"匹配,获取相应的值。
针对转义字符转换前的字符匹配进行转换的函数(即把转义后的字符进行反向替换):
QString &DDesktopEntry::unescape(QString &str, bool unescapeSemicolons)
{
QHash<QChar,QChar> repl;
repl.insert(QLatin1Char('\\'), QLatin1Char('\\'));
repl.insert(QLatin1Char('s'), QLatin1Char(' '));
repl.insert(QLatin1Char('n'), QLatin1Char('\n'));
repl.insert(QLatin1Char('t'), QLatin1Char('\t'));
repl.insert(QLatin1Char('r'), QLatin1Char('\r'));
if (unescapeSemicolons) {
repl.insert(QLatin1Char(';'), QLatin1Char(';'));
}
return doUnescape(str, repl);
}
带有本地化的格式的匹配方式:比如在 desktop 文件的 "key" 字段为 "Name[zh_CN]",则可以使用 localizedValue() 函数去获取这个字段的值,传入的参数 "key" 为 "Name"即可。
帮助编辑此页 (opens new window)
上次更新: 12/17/2020, 2:23:36 AM