简介: Desktop Entry 文件是 Linux 桌面系统中用于描述程序启动配置信息的文件。Desktop Entry 文件实现了类似于 Windows 操作系统中快捷方式的功能。本文详细介绍了 Linux Desktop Entry 文件的定义,编程和使用方式。读者可以通过文章末尾的实例操作进一步加深对 Desktop Entry 文件应用的领会。
本文的标签: linux, 桌面环境
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文件
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",将得到如下内容:
[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 文件中被定义;而可选关键字则不必。以下是对重点关键字的解析。
Type = Link URL = http://www.ibm.com/developerworks |
LOCALE= lang_COUNTRY.ENCODING@MODIFIER |
回页首
4.分析运行 Desktop Entry 文件
Desktop Entry文件是一种常见的Linux文件格式,很多Linux程序需要对该种文件提供支持。在此,本文给出分析运行 Desktop Entry 文件的基本编成思路。
4.1 分析 Desktop Entry 文件内容
操作 Desktop Entry 文件的第一步是获取文件的内容。假设有一 Desktop Entry 文件,其路径信息存储在变量 pPath 中:
const char* pPath;
下列代码将把该文件内容读入内存"buffer"中。
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:
enum DestopEntryType { Application, // Type = Application Link, // Type = Link Unknown }; |
下列程序将提取关键字"Type","Exec"/"URL"和"Terminal"的数值,并把这些数值分别存储在变量"type","uri"和"bTerminal"中。
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文件。
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文件。
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"。
5.1 创建"Type = Application"Desktop Entry文件实例
假设系统指定图标目录下存有图片文件"gaim.png" 。如图5所示编辑文件"VisitDeveloperWorks-Application.desktop",并把结果存于"/usr/share/applications/"目录下。
该文件的核心内容是将应用程序图标设置为"gaim.png"文件,将Desktop Entry文件的类型设置为"Application",并将应用程序所要执行的命令设置为"firefox http://www.ibm.com/developerworks"。编辑完成后,在文件浏览器和应用程序浏览器下(如图6所示)就可以看见该实例的 显示样式。
5.2 创建"Type = Link"Desktop Entry文件实例
对上述"VisitDeveloperWorks-Application.desktop"文件进行如图7所示的修改, 并将文件更名为"VisitDeveloperWorks-Link.desktop",保存于"/usr/share/applications/"目 录下。
该文件的核心内容是将 Desktop Entry 文件的类型设置为"Link",并将 Desktop Entry 文件指向的 URL 设置为"http://www.ibm.com/developerworks"。编辑完成后,在文件浏览器下(如图8所示)就可以看见该实例的显示样 式。值得注意的是,由于该实例并不是一个应用程序,因此在应用程序浏览器下是看不到相应快捷方式的。
回页首
6.结束语
Desktop Entry文件是Linux KDE 和Linux GNOME桌面系统中标准的程序启动配置描述方式。本文对该文件格式的定义和应用进行了深入的探讨。欲求更详细的使用和编程信息,请查找相关参考文献。
参考资料
关于作者
龚奕平,软件工程师,IBM 中国软件开发中心 WPLC 部。现主要从事 Notes Linux 产品的研究及开发。研究兴趣包括 Windows 应用程序跨平台移植、GDI 开发、网络设备开发和调度算法研究。联系方式:[email protected].