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 文件中被定義;而可選關鍵字則不必。以下是對重點關鍵字的解析。
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"中。
清單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桌面系統中標准的程序啟動配置描述方式。本文對該文件格式的定義和應用進行了深入的探討。欲求更詳細的使用和編程信息,請查找相關參考文獻。
參考資料
關於作者
龔奕平,軟件工程師,IBM 中國軟件開發中心 WPLC 部。現主要從事 Notes Linux 產品的研究及開發。研究興趣包括 Windows 應用程序跨平台移植、GDI 開發、網絡設備開發和調度算法研究。聯系方式:[email protected].