Linux Desktop Entry 文件深入解析

http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/|

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

1.DesktopEntry文件标准简介

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

2.DesktopEntry文件

图1LinuxGNOME应用程序浏览器

DesktopEntry文件以".desktop"为后缀名。以LinuxGNOME桌面系统为例,用户打开应用程序浏览器后(见图1)会看见很多应用程序快捷方式。事实上,每个应用程序快捷方式都和一个DesktopEntry文件相对应。这些DesktopEntry文件通常被存放在/usr/share/applications//opt/gnome/share/applications/等目录下。从文件浏览器进入这些目录,点击相应的DesktopEntry文件同样可以启动相对应的应用程序。

假设当前"/usr/share/applications/"目录下有一文件"cbt.desktop",用任意文件编辑软件(如vi或gedit)打开"cbt.desktop",将得到如下内容:

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

[DesktopEntry]

Version=1.0

Encoding=UTF-8

Name=QuickStartTour

GenericName=UserTutorial

Comment=ComputerBasedTrainingtutorialto\

guideandhelpyoulearnhowtousetheDesktop

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ídkasystému

Comment[cs]=V?ukov?programseznamujícíu?ivatele

sezákladypracovníhoprost?edí

GenericName[cs]=U?ivatelsk?tutoriál

Name[hu]=Rendszerbemutató

Comment[hu]=Amunkaálloméshasználatátbemutatósegédlet

GenericName[hu]=Felhasználóisegédlet

本文将在下一节中结合上述"cbt.desktop"文件内容重点解析DesktopEntry的文件结构。读者可以从中深入领会上述各条语句的具体含义。

3.DesktopEntry文件结构

DesktopEntry文件通常以字符串"[DesktopEntry]"开始。由清单1可以得知,DesktopEntry文件的内容是由若干{关键字,数值}配对的Entry组成的。例如,"Version"就是一个关键字,关键字"Version"对应的数值是"1.0"。DesktopEntry文件标准定义了一系列标准关键字。标准关键字分为必选和可选两种:必选标准关键字必须在.desktop文件中被定义;而可选关键字则不必。以下是对重点关键字的解析。

关键字"Version":[可选]该数值指定了当前DesktopEntry文件所遵循的DesktopEntry文件标准版本。

关键字"Encoding":[1.0版本不推荐使用]该数值指定了当前DesktopEntry文件中特定字符串所使用的编码方式。尽管DesktopEntry文件标准1.0不再推荐使用该关键字,但由于历史原因该关键字仍然广泛出现在现有的DesktopEntry文件中。

关键字"Name":[必选]

该数值指定了相关应用程序的名称。比如在清单1中关键字"Name"的数值是"QuickStartTour"。打开文件浏览器,进入"/usr/share/applications"目录,就可以看见"cbt.desktop"文件所定义的快捷方式的显示样式,如图2所示。其中,快捷方式的显示名称由关键字"Name"的数值所决定,快捷方式所使用的图标由下文中将要介绍的关键字"Icon"的数值来决定。当然,这些定义在应用程序浏览器中同样适用,请参考图3。

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

关键字"GenericName":[可选]

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

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

关键字"Comment":[可选]

该数值是对当前DesktopEntry的简单描述。

关键字"Type":[必选]

关键字"Type"定义了DesktopEntry文件的类型。常见的"Type"数值是"Application"和"Link"。"Type=Application"表示当前DesktopEntry文件指向了一个应用程序;而"Type=Link"表示当前DesktopEntry文件指向了一个URL(UniformResourceLocator)。

关键字"Exec":[可选]

关键字"Exec"只有在"Type"类型是"Application"时才有意义。"Exec"的数值定义了启动指定应用程序所要执行的命令,在此命令是可以带参数的。在本例中,关键字"Exec"的数值是字符串"gnome-open/usr/share/doc/manual/sled-gnome-cbt_en/index.html"。在shell中输入该字符串并按回车键同样可以启动指定应用程序。

关键字"URL":[可选]

关键字"URL"只有在"Type"类型是"Link"时才有意义。"URL"的数值定义了该DesktopEntry文件指向的URL。例如:

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

Type=Link

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

双击含有上述内容的DesktopEntry文件将启动web浏览器,并打开指定网页"http://www.ibm.com/developerworks",运行结果请参考图4。

关键字"Icon":[可选]

该数值定义了当前DesktopEntry文件在应用程序浏览器或是在文件浏览器中所显示的图标。如果关键字"Icon"的数值是以绝对路径的格式给出,那么其数值所指定图标文件将被使用;反之,Linux系统将使用"IconThemeSpecification"[2]在系统指定图标目录下定位所需要使用的图标文件。比如在本例中关键字"Icon"的数值是"cbt",它实际对应着系统指定图标目录下的图片文件"cbt.png"。该图片作为图标的显示效果如图2,图3所示。

关键字"StartupNotify":[可选]

关键字"StartupNotify"的数值是布尔值(true或是false)。该关键字只有在"Type"类型是"Application"时才有意义。其数值的含义由规范"StartupNotificationProtocolSpecifications"[3]定义,在此不再详述。

关键字"Terminal":[可选]

和"StartupNotify"一样,关键字"StartupNotify"的数值也是布尔值,并且该关键字只有在"Type"类型是"Application"时才有意义。其数值指出了相关应用程序(即关键字"Exec"的数值)是否需要在终端窗口中运行。本文将在下一节中给出关键字"Terminal"的具体使用方法。

关键字"Categories":[可选]

关键字"Categories"只有在"Type"类型是"Application"时才有意义。"Categories"的数值指出了相关应用程序在菜单中显示的类别。具体菜单分类由规范"DesktopSpecificationMenu"具体定义[4]。

关键字"OnlyShowIn"和"NotShowIn":[可选]

这两个关键字分别定义了当前DesktopEntry是否在特定Linux桌面系统(例如:LinuxGNOME或LinuxKDE)下显示(由"OnlyShowIn"定义),或不显示(由"NotShowIn"定义)。具体定义请参考"DesktopSpecificationMenu"[4]。

关键字"X-SuSE-translate":[SUSELinux特有]

关键字"X-SuSE-translate"是SUSELinux(http://www.novell.com/linux/)特有的。"X-SuSE-translate"符合SUSERPMPackage风格。"X-SuSE-translate"数值表示是否要对关键字"Name"和"GenericName"进行翻译。详情请参考"SUSEPackageConventions"[5]。

本地化关键字"[LOCALE]"

根据"DesktopEntrySpecification"规范[1],在关键字后加上字符串"[LOCALE]"就可以对该关键字进行特定的本地化定义。"LOCALE"的合法取值为:

LOCALE=lang_COUNTRY.ENCODING@MODIFIER

在此,域"_COUNTRY",".ENCODING"和"@MODIFIER"是可以被忽略的。当指定DesktopEntry文件被解析时,解析器应当根据当前POSIXlocale来正确获取本地化的关键字数值。例如清单1就分别定义了在"cs"和"hu"语言环境下关键字"Name","Comment"和"GenericName"的不同数值。

其余关键字

除了上述在清单1中出现的关键字外,"DesktopEntrySpecification"还定义了"Hidden","TryExec","MimeType"等可选关键字。用户可以根据需要进行选取。

回页首

4.分析运行DesktopEntry文件

DesktopEntry文件是一种常见的Linux文件格式,很多Linux程序需要对该种文件提供支持。在此,本文给出分析运行DesktopEntry文件的基本编成思路。

4.1分析DesktopEntry文件内容

操作DesktopEntry文件的第一步是获取文件的内容。假设有一DesktopEntry文件,其路径信息存储在变量pPath中:

constchar*pPath;

下列代码将把该文件内容读入内存"buffer"中。

清单3读取DesktopEntry文件内容

intfile_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

{

return1;

}

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

清单4DestopEntryType结构定义

enumDestopEntryType

{

Application,//Type=Application

Link,//Type=Link

Unknown

};

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

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

DestopEntryTypetype=Unknown;

char*uri=NULL;

boolbTerminal=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);

return1;

}

constchar*strType=gnome_desktop_item_get_string(desktop_file,"Type");

if(!strType)

{

g_free(buffer);

gnome_desktop_item_unref(desktop_file);

return1;

}

if(0==strcmp(strType,"Application"))//type=Application

{

constchar*exec_str=gnome_desktop_item_get_string(desktop_file,"Exec");

if(!exec_str)

{

g_free(buffer);

gnome_desktop_item_unref(desktop_file);

return1;

}

uri=g_strdup(exec_str);

type=Application;

constchar*strTerminal=gnome_desktop_item_get_string(desktop_file,"Terminal");

if(strTerminal)

{

if(0==strcmp("true",strTerminal))

bTerminal=true;

else

bTerminal=false;

}

}

elseif(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"类型DesktopEntry文件

有了关键字"Type","Exec"和"Terminal"的数值,就可如下运行DesktopEntry文件。

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

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);

return0;

}

4.3运行"Type=Link"类型DesktopEntry文件

有了关键字"Type","URL"和"Terminal"的数值,就可如下运行DesktopEntry文件。

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

if(type==Link)

{

gnome_url_show(uri,NULL);

g_free(uri);

return0;

}

回页首

5.创建DesktopEntry文件实例

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

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

5.1创建"Type=Application"DesktopEntry文件实例

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

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

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

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

5.2创建"Type=Link"DesktopEntry文件实例

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

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

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

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

回页首

6.结束语

DesktopEntry文件是LinuxKDE和LinuxGNOME桌面系统中标准的程序启动配置描述方式。本文对该文件格式的定义和应用进行了深入的探讨。欲求更详细的使用和编程信息,请查找相关参考文献。

参考资料

[1]"DesktopEntrySpecification"。

[2]"IconThemeSpecification"。

[3]"StartupNotificationProtocolSpecifications"。

[4]"DesktopSpecificationMenu"。

[5]"SUSEPackageConventions"。

关于作者

龚奕平,软件工程师,IBM中国软件开发中心WPLC部。现主要从事NotesLinux产品的研究及开发。研究兴趣包括Windows应用程序跨平台移植、GDI开发、网络设备开发和调度算法研究。联系方式:[email protected].