`

Linux Desktop Entry 文件深入解析

 
阅读更多
http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/|

参数说明:http://nesta2001zhang.iteye.com/blog/1320782

1.Desktop Entry 文件标准简介
在 Windows 平台上,用户可以通过点击位于桌面或菜单上的快捷方式轻松打开目标应用程序。现代 Linux 桌面系统也提供了此项功能。目前,Linux KDE 和 Linux GNOME 桌面系统都使用 Desktop Entry 文件标准来描述程序启动配置信息。Desktop Entry 文件标准是由 FreeDesktop.org(http://freedesktop.org/wiki/) 制定的,目前最新的版本是"Desktop Entry Specification 1.0"[1]。
2.Desktop Entry文件

图1 Linux GNOME 应用程序浏览器


Desktop Entry 文件以".desktop"为后缀名。以 Linux GNOME 桌面系统为例,用户打开应用程序浏览器后(见图1)会看见很多应用程序快捷方式。事实上,每个应用程序快捷方式都和一个 Desktop Entry 文件相对应。这些 Desktop Entry 文件通常被存放在 /usr/share/applications/ /opt/gnome/share/applications/ 等目录下。从文件浏览器进入这些目录,点击相应的 Desktop Entry 文件同样可以启动相对应的应用程序。
假设当前"/usr/share/applications/"目录下有一文件"cbt.desktop",用任意文件编辑软件(如 vi 或 gedit)打开"cbt.desktop",将得到如下内容:

清单1 "cbt.desktop"文件内容

[Desktop Entry]
Version = 1.0
Encoding = UTF-8
Name = Quick Start Tour
GenericName = User Tutorial
Comment = Computer Based Training tutorial to \
     guide and help you learn how to use the Desktop
Exec =
gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.html
Icon = cbt
StartupNotify = true
Terminal = false
Type = Application
Categories = GNOME;Application;Documentation;
OnlyShowIn = GNOME;
X-SuSE-translate = true
Name[cs] = Rychlá prohlídka systému
Comment[cs] = V?ukov? program seznamující u?ivatele
       se základy pracovního prost?edí
GenericName[cs] = U?ivatelsk? tutoriál
Name[hu] = Rendszerbemutató
Comment[hu] = A munkaállomés használatát bemutató segédlet
GenericName[hu] = Felhasználói segédlet

本文将在下一节中结合上述"cbt.desktop"文件内容重点解析 Desktop Entry 的文件结构。读者可以从中深入领会上述各条语句的具体含义。
3.Desktop Entry 文件结构
Desktop Entry 文件通常以字符串"[Desktop Entry]"开始。由清单 1 可以得知,Desktop Entry 文件的内容是由若干{关键字,数值}配对的 Entry 组成的。例如,"Version"就是一个关键字,关键字"Version"对应的数值是"1.0"。Desktop Entry 文件标准定义了一系列标准关键字。标准关键字分为必选和可选两种:必选标准关键字必须在 .desktop 文件中被定义;而可选关键字则不必。以下是对重点关键字的解析。
关键字"Version":[可选] 该数值指定了当前 Desktop Entry 文件所遵循的 Desktop Entry 文件标准版本。
关键字"Encoding":[1.0 版本不推荐使用] 该数值指定了当前 Desktop Entry 文件中特定字符串所使用的编码方式。尽管Desktop Entry 文件标准 1.0 不再推荐使用该关键字,但由于历史原因该关键字仍然广泛出现在现有的 Desktop Entry 文件中。
关键字"Name":[必选]
该数值指定了相关应用程序的名称。比如在清单1中关键字"Name"的数值是"Quick Start Tour"。打开文件浏览器,进入"/usr/share/applications"目录,就可以看见"cbt.desktop"文件所定义的快捷方式的显示样式,如图2所示。其中,快捷方式的显示名称由关键字"Name"的数值所决定,快捷方式所使用的图标由下文中将要介绍的关键字"Icon"的数值来决定。当然,这些定义在应用程序浏览器中同样适用,请参考图3。

图2 "cbt.desktop"文件在文件浏览器中的显示样式


关键字"GenericName":[可选]
该数值指定了相关应用程序的通用名称。比如在清单1中关键字"GenericName"的数值是"User Tutorial"。打开应用程序浏览器,就可以看见字符串"User Tutorial"被显示在图标的右侧,如图3所示:


图3 "cbt.desktop"文件在应用程序浏览器中的显示样式


关键字"Comment":[可选]
该数值是对当前Desktop Entry的简单描述。
关键字"Type":[必选]
关键字"Type"定义了Desktop Entry文件的类型。常见的"Type"数值是"Application"和"Link"。"Type = Application"表示当前Desktop Entry文件指向了一个应用程序;而"Type = Link"表示当前Desktop Entry文件指向了一个URL (Uniform Resource Locator)。
关键字"Exec":[可选]
关键字"Exec"只有在"Type"类型是"Application"时才有意义。"Exec"的数值定义了启动指定应用程序所要执行的命令,在此命令是可以带参数的。在本例中,关键字"Exec"的数值是字符串"gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.html"。在shell中输入该字符串并按回车键同样可以启动指定应用程序。
关键字"URL":[可选]
关键字"URL"只有在"Type"类型是"Link"时才有意义。"URL"的数值定义了该Desktop Entry文件指向的URL。例如:

清单2 "Type = Link"类型Desktop Entry文件示例

Type = Link
URL = http://www.ibm.com/developerworks


双击含有上述内容的Desktop Entry文件将启动web浏览器,并打开指定网页"http://www.ibm.com/developerworks",运行结果请参考图4。
关键字"Icon":[可选]
该数值定义了当前Desktop Entry文件在应用程序浏览器或是在文件浏览器中所显示的图标。如果关键字"Icon"的数值是以绝对路径的格式给出,那么其数值所指定图标文件将被使用;反之,Linux系统将使用"Icon Theme Specification"[2]在系统指定图标目录下定位所需要使用的图标文件。比如在本例中关键字"Icon"的数值是"cbt",它实际对应着系统指定图标目录下的图片文件"cbt.png" 。该图片作为图标的显示效果如图2,图3所示。
关键字"StartupNotify":[可选]
关键字"StartupNotify"的数值是布尔值(true 或是 false)。该关键字只有在"Type"类型是"Application"时才有意义。其数值的含义由规范"Startup Notification Protocol Specifications"[3]定义,在此不再详述。
关键字"Terminal":[可选]
和"StartupNotify"一样,关键字"StartupNotify"的数值也是布尔值,并且该关键字只有在"Type"类型是"Application"时才有意义。其数值指出了相关应用程序(即关键字"Exec"的数值)是否需要在终端窗口中运行。本文将在下一节中给出关键字"Terminal"的具体使用方法。
关键字"Categories":[可选]
关键字"Categories"只有在"Type"类型是"Application"时才有意义。"Categories"的数值指出了相关应用程序在菜单中显示的类别。具体菜单分类由规范"Desktop Specification Menu"具体定义[4]。
关键字"OnlyShowIn"和"NotShowIn":[可选]
这两个关键字分别定义了当前Desktop Entry是否在特定Linux 桌面系统(例如:Linux GNOME 或 Linux KDE)下显示(由"OnlyShowIn"定义),或不显示(由"NotShowIn"定义)。具体定义请参考"Desktop Specification Menu"[4]。
关键字"X-SuSE-translate":[SUSE Linux特有]
关键字"X-SuSE-translate"是SUSE Linux(http://www.novell.com/linux/)特有的。"X-SuSE-translate"符合SUSE RPM Package风格。"X-SuSE-translate"数值表示是否要对关键字"Name"和"GenericName"进行翻译。详情请参考"SUSE Package Conventions"[5]。
本地化关键字"[LOCALE]"
根据"Desktop Entry Specification"规范[1],在关键字后加上字符串"[LOCALE]"就可以对该关键字进行特定的本地化定义。"LOCALE"的合法取值为:

LOCALE= lang_COUNTRY.ENCODING@MODIFIER


在此,域"_COUNTRY",".ENCODING"和"@MODIFIER"是可以被忽略的。当指定Desktop Entry文件被解析时,解析器应当根据当前POSIX locale来正确获取本地化的关键字数值。例如清单1就分别定义了在"cs"和"hu"语言环境下关键字"Name","Comment"和"GenericName"的不同数值。
其余关键字
除了上述在清单1中出现的关键字外,"Desktop Entry Specification"还定义了"Hidden","TryExec","MimeType"等可选关键字。用户可以根据需要进行选取。
回页首
4.分析运行 Desktop Entry 文件
Desktop Entry文件是一种常见的Linux文件格式,很多Linux程序需要对该种文件提供支持。在此,本文给出分析运行 Desktop Entry 文件的基本编成思路。
4.1 分析 Desktop Entry 文件内容
操作 Desktop Entry 文件的第一步是获取文件的内容。假设有一 Desktop Entry 文件,其路径信息存储在变量 pPath 中:
const char* pPath;
下列代码将把该文件内容读入内存"buffer"中。

清单3 读取 Desktop Entry 文件内容


int file_size = 0;
char *file_contents = NULL;
char *buffer = NULL;

if( eel_read_entire_file ( pPath, &file_size, &file_contents ) == GNOME_VFS_OK )
{
    buffer = (char *)g_realloc ( file_contents, file_size + 1 );
    buffer[file_size] = '\0';
}
else
{
    return 1;
}

获取 Desktop Entry 文件内容后,就可进一步分析文件内容。在此,分析的重点是获取关键字"Type","Exec"/"URL",以及"Terminal"的数值。首先定义结构 DestopEntryType:

清单4 DestopEntryType 结构定义

enum DestopEntryType
{
    Application, // Type = Application
    Link,             // Type = Link
    Unknown
};

下列程序将提取关键字"Type","Exec"/"URL"和"Terminal"的数值,并把这些数值分别存储在变量"type","uri"和"bTerminal"中。

清单5 获取关键字"Type","Exec"/"URL",以及"Terminal"数值
   

DestopEntryType type = Unknown;
char *uri = NULL;
bool bTerminal = false;

GnomeDesktopItem *desktop_file;

desktop_file = gnome_desktop_item_new_from_string( NULL, buffer, file_size,
(GnomeDesktopItemLoadFlags)0, NULL );
if ( !desktop_file )
{
    g_free( buffer );
    return 1;
}

const char *strType = gnome_desktop_item_get_string( desktop_file, "Type" );
if ( !strType )
{
    g_free( buffer );
    gnome_desktop_item_unref ( desktop_file );
    return 1;
}

if ( 0 == strcmp( strType, "Application" ) )    //type = Application
{
    const char *exec_str = gnome_desktop_item_get_string( desktop_file, "Exec" );
    if( !exec_str )
    {
        g_free( buffer );
        gnome_desktop_item_unref( desktop_file );
        return 1;
    }
   uri = g_strdup( exec_str );
    type = Application;

    const char *strTerminal = gnome_desktop_item_get_string( desktop_file, "Terminal" );
    if ( strTerminal )
    {
        if ( 0 == strcmp( "true", strTerminal ) )
            bTerminal = true;
        else
            bTerminal = false;
    }
}
else if(strcmp(strType, "Link") == 0)    //type = Link
{
    uri = g_strdup( gnome_desktop_item_get_string( desktop_file, "URL" ) );
    type = Link;
}

    g_free( buffer );
    gnome_desktop_item_unref( desktop_file );
   

4.2 运行"Type = Application"类型Desktop Entry文件
有了关键字"Type","Exec"和"Terminal"的数值,就可如下运行Desktop Entry文件。

清单6 运行"Type = Application"类型Desktop Entry文件


if ( type == Application )
{
    if( bTerminal )
        eel_gnome_open_terminal_on_screen( uri, NULL );
    else
        eel_gnome_shell_execute_on_screen( uri, NULL);
    g_free( uri );
    return 0;
}

4.3 运行"Type = Link"类型Desktop Entry文件
有了关键字"Type","URL"和"Terminal"的数值,就可如下运行Desktop Entry文件。

清单7 运行"Type = Link"类型Desktop Entry文件


if ( type == Link )
{
    gnome_url_show( uri, NULL );
    g_free( uri );
    return 0;
}

回页首
5.创建Desktop Entry文件实例
在这部分中,本文将给出创建Desktop Entry文件的两个具体实例。这两个实例的目标都是要创建自动访问IBM DeveloperWorks网站的快捷方式,具体运行结果如图4所示。这两个实例将使用不同的方法实现这一目标。第一个实例将创建的文件类型是"Application"的Desktop Entry文件"VisitDeveloperWorks-Application.desktop";第二个实例将创建的文件类型是"Link" 的Desktop Entry文件"VisitDeveloperWorks-Link.desktop"。

图4 "VisitDeveloperWorks-Application.desktop" / "VisitDeveloperWorks-Link.desktop"运行结果


5.1 创建"Type = Application"Desktop Entry文件实例
假设系统指定图标目录下存有图片文件"gaim.png" 。如图5所示编辑文件"VisitDeveloperWorks-Application.desktop",并把结果存于"/usr/share/applications/"目录下。

图5 "VisitDeveloperWorks-Application.desktop"文件内容


该文件的核心内容是将应用程序图标设置为"gaim.png"文件,将Desktop Entry文件的类型设置为"Application",并将应用程序所要执行的命令设置为"firefox http://www.ibm.com/developerworks"。编辑完成后,在文件浏览器和应用程序浏览器下(如图6所示)就可以看见该实例的显示样式。

图6 "VisitDeveloperWorks-Application.desktop"文件在应用程序浏览器中的显示样式


5.2 创建"Type = Link"Desktop Entry文件实例
对上述"VisitDeveloperWorks-Application.desktop"文件进行如图7所示的修改,并将文件更名为"VisitDeveloperWorks-Link.desktop",保存于"/usr/share/applications/"目录下。

图7 "VisitDeveloperWorks-Link.desktop"文件内容


该文件的核心内容是将 Desktop Entry 文件的类型设置为"Link",并将 Desktop Entry 文件指向的 URL 设置为"http://www.ibm.com/developerworks"。编辑完成后,在文件浏览器下(如图8所示)就可以看见该实例的显示样式。值得注意的是,由于该实例并不是一个应用程序,因此在应用程序浏览器下是看不到相应快捷方式的。

图8 "VisitDeveloperWorks-Link.desktop"文件在文件浏览器中的显示样式


回页首
6.结束语
Desktop Entry文件是Linux KDE 和Linux GNOME桌面系统中标准的程序启动配置描述方式。本文对该文件格式的定义和应用进行了深入的探讨。欲求更详细的使用和编程信息,请查找相关参考文献。

参考资料
[1] "Desktop Entry Specification"。

[2] "Icon Theme Specification"。

[3] "Startup Notification Protocol Specifications"。

[4] "Desktop Specification Menu"。

[5] "SUSE Package Conventions"。

关于作者
龚奕平,软件工程师,IBM 中国软件开发中心 WPLC 部。现主要从事 Notes Linux 产品的研究及开发。研究兴趣包括 Windows 应用程序跨平台移植、GDI 开发、网络设备开发和调度算法研究。联系方式:gongyp@cn.ibm.com.
分享到:
评论

相关推荐

    Linux下通过.desktop文件创建桌面程序图标(快捷方式)及文件编写

    `.desktop`文件遵循Free Desktop.org的Desktop Entry Specification,是Linux桌面环境(如GNOME、KDE等)中用来启动应用的标准方法。这些文件通常位于`~/.local/share/applications`或 `/usr/share/applications` ...

    Novell Linux Desktop Training

    根据给定文件的信息,我们可以提炼出关于“Novell Linux Desktop Training”的相关知识点。 ### Novell Linux Desktop Training #### 一、课程概述 本课程旨在提供关于Novell Linux桌面操作系统的全面培训,帮助...

    Red Flag Linux Desktop 5.0 手册

    Red Flag Linux Desktop 5.0 作为红旗的新一代操作系统,在硬件设备支持、系统安装、核心性能、桌 面环境设计等方面做出了较大改进,使之更加适用于政府、家庭、个人的办公、教育、开发、学习、娱乐 等方面的需求;...

    Red Flag Linux Desktop 6.0 用户手册

    ### Red Flag Linux Desktop 6.0 用户手册关键知识点解析 #### 一、版权与许可声明 - **版权保护**:Red Flag Linux Desktop 6.0 受版权法保护,遵循 GNU GPL 授权协议,允许使用、复制、发布及反编译,但需遵循...

    Linux下通过.desktop文件创建桌面程序图标(快捷方式)及文件编写 demo

    接下来,我们将深入探讨如何创建和编写`.desktop`文件,以及安装示例`install_demo`的详细步骤。 首先,我们需要了解`.desktop`文件的基本结构。一个标准的`.desktop`文件通常以`[Desktop Entry]`作为起始行,并...

    mac上Parallels Desktop安装kali linux 2020.2a并安装好Parallels Tools+Goo

    在Mac上使用Parallels Desktop (PD) 安装Kali Linux 2020.2a是一项常见的任务,尤其对于需要进行网络安全测试或开发的用户来说。Parallels Desktop是一款强大的虚拟化软件,它允许用户在Mac系统上运行多个操作系统,...

    红旗 Linux Desktop用户手册

    红旗 Linux Desktop用户手册

    GitHubDesktop-linux-2.6.6-linux1.deb

    适用于Ubuntu的Github desktop安装文件,deb安装。先运行如下:apt install gconf2 libappindicator1 gconf-service;之后双击下载好的deb文件,弹出安装界面,点击安装,在应用程序里面就可以打开Github desktop。...

    DesktopFileCreator:适用于 Linux 的 .desktop 文件创建器

    桌面文件创建器适用于 Linux 的非常简单的 .desktop 文件创建器。下载在此处最新版本。 将文件放在您想要的任何位置。 右键单击该文件并选择“属性”->“权限” 确保选中“执行”复选框。 双击要打开的文件。

    Red Flag Linux Desktop 6.0简明用户手册

    通过这本手册,读者可以系统地学习Red Flag Linux Desktop 6.0的基本操作,逐步熟悉Linux环境,为更深入的学习和使用打下坚实的基础。虽然现在Linux发行版已经发展到更高版本,但了解早期版本的操作系统可以帮助我们...

    NeoKylin Linux Desktop 6.0 SNMP编译安装及配置脚本

    NeoKylin Linux Desktop 6.0 SNMP编译安装及配置脚本 [root@localhost ~]# cat /etc/os-release NAME="NeoKylin Linux Desktop" VERSION="6.0" ID=neokylin VERSION_ID=6.0 PRETTY_NAME="NeoKylin Linux Desktop ...

    linux中redis安装包和redis-desktop-manager-0.9.3.817

    本文将详细讲解如何在Linux上安装Redis,包括Redis 4.0.2和5.0.0两个版本,以及如何配合使用Redis Desktop Manager进行图形化管理。 首先,我们来了解Redis的基本概念。Redis是一个基于内存的数据结构存储系统,...

    Linux Desktop Hacks 2005

    Linux Desktop Hacks 2005

    U盘安装RedFlag-Desktop-11.0红旗Linux系统

    3. 红旗Linux的ISO镜像文件,如RedFlag-Desktop-11.0-alpha-LiveCD-amd64-20220923.iso,可以在红旗Linux的官方社区下载。 接下来,按照以下步骤进行操作: 1. **制作U盘启动盘**: - 在Windows环境下解压UShenDu...

    Red Flag Linux Desktop 5.0用户手册.pdf

    ### Red Flag Linux Desktop 5.0 用户手册关键知识点解析 #### 一、安装章节关键知识点 **1.1 安装前的准备** - **备份数据**:在安装任何操作系统之前,都应备份重要的个人数据,以防安装过程中数据丢失。 - **...

    desktop-entry-editor:一个简单的GUI工具,用于创建和编辑桌面文件,专为Deepin设计

    桌面条目编辑器(从linuxdeepin / desktop-entry-editor分叉) | 英语 一个简单的GUI工具,用于创建和编辑桌面文件,专为Deepin设计。 依存关系 qt5-default qtcreator(推荐) libqt5core5a libqt5gui5 libqt5...

    linux上下传文件及桌面管理端

    5. **RDP(Remote Desktop Protocol)**: 虽然RDP主要与Windows系统相关,但也有适用于Linux的RDP服务器和客户端软件,如xrdp,使得用户能通过RDP协议远程连接到Linux桌面。 6. **桌面管理工具**: 例如NoMachine、...

    ArcGis9.3 desktop破解文件

    这是ArcGis9.3 desktop的破解文件,里面包含协议授权文件和破解文件。本文安装验证通过的

Global site tag (gtag.js) - Google Analytics