Linux Desktop Entry 檔案深入解析
[url]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/[/url]|
引數說明:[url]http://nesta2001zhang.iteye.com/blog/1320782[/url]
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 應用程式瀏覽器
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image001.png[/img]
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"檔案在檔案瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image003.png[/img]
關鍵字"GenericName":[可選]
該數值指定了相關應用程式的通用名稱。比如在清單1中關鍵字"GenericName"的數值是"User Tutorial"。開啟應用程式瀏覽器,就可以看見字串"User Tutorial"被顯示在圖示的右側,如圖3所示:
圖3 "cbt.desktop"檔案在應用程式瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image005.png[/img]
關鍵字"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中輸入該字串並按Enter鍵同樣可以啟動指定應用程式。
關鍵字"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"[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image007.png[/img] 。該圖片作為圖示的顯示效果如圖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"執行結果
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image009.png[/img]
5.1 建立"Type = Application"Desktop Entry檔案例項
假設系統指定圖示目錄下存有圖片檔案"gaim.png" 。如圖5所示編輯檔案"VisitDeveloperWorks-Application.desktop",並把結果存於"/usr/share/applications/"目錄下。
圖5 "VisitDeveloperWorks-Application.desktop"檔案內容
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image013.png[/img]
該檔案的核心內容是將應用程式圖示設定為"gaim.png"檔案,將Desktop Entry檔案的型別設定為"Application",並將應用程式所要執行的命令設定為"firefox http://www.ibm.com/developerworks"。編輯完成後,在檔案瀏覽器和應用程式瀏覽器下(如圖6所示)就可以看見該例項的顯示樣式。
圖6 "VisitDeveloperWorks-Application.desktop"檔案在應用程式瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image015.png[/img]
5.2 建立"Type = Link"Desktop Entry檔案例項
對上述"VisitDeveloperWorks-Application.desktop"檔案進行如圖7所示的修改,並將檔案更名為"VisitDeveloperWorks-Link.desktop",儲存於"/usr/share/applications/"目錄下。
圖7 "VisitDeveloperWorks-Link.desktop"檔案內容
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image017.png[/img]
該檔案的核心內容是將 Desktop Entry 檔案的型別設定為"Link",並將 Desktop Entry 檔案指向的 URL 設定為"http://www.ibm.com/developerworks"。編輯完成後,在檔案瀏覽器下(如圖8所示)就可以看見該例項的顯示樣式。值得注意的是,由於該例項並不是一個應用程式,因此在應用程式瀏覽器下是看不到相應快捷方式的。
圖8 "VisitDeveloperWorks-Link.desktop"檔案在檔案瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image019.png[/img]
回頁首
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.
引數說明:[url]http://nesta2001zhang.iteye.com/blog/1320782[/url]
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 應用程式瀏覽器
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image001.png[/img]
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"檔案在檔案瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image003.png[/img]
關鍵字"GenericName":[可選]
該數值指定了相關應用程式的通用名稱。比如在清單1中關鍵字"GenericName"的數值是"User Tutorial"。開啟應用程式瀏覽器,就可以看見字串"User Tutorial"被顯示在圖示的右側,如圖3所示:
圖3 "cbt.desktop"檔案在應用程式瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image005.png[/img]
關鍵字"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中輸入該字串並按Enter鍵同樣可以啟動指定應用程式。
關鍵字"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"[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image007.png[/img] 。該圖片作為圖示的顯示效果如圖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"執行結果
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image009.png[/img]
5.1 建立"Type = Application"Desktop Entry檔案例項
假設系統指定圖示目錄下存有圖片檔案"gaim.png" 。如圖5所示編輯檔案"VisitDeveloperWorks-Application.desktop",並把結果存於"/usr/share/applications/"目錄下。
圖5 "VisitDeveloperWorks-Application.desktop"檔案內容
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image013.png[/img]
該檔案的核心內容是將應用程式圖示設定為"gaim.png"檔案,將Desktop Entry檔案的型別設定為"Application",並將應用程式所要執行的命令設定為"firefox http://www.ibm.com/developerworks"。編輯完成後,在檔案瀏覽器和應用程式瀏覽器下(如圖6所示)就可以看見該例項的顯示樣式。
圖6 "VisitDeveloperWorks-Application.desktop"檔案在應用程式瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image015.png[/img]
5.2 建立"Type = Link"Desktop Entry檔案例項
對上述"VisitDeveloperWorks-Application.desktop"檔案進行如圖7所示的修改,並將檔案更名為"VisitDeveloperWorks-Link.desktop",儲存於"/usr/share/applications/"目錄下。
圖7 "VisitDeveloperWorks-Link.desktop"檔案內容
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image017.png[/img]
該檔案的核心內容是將 Desktop Entry 檔案的型別設定為"Link",並將 Desktop Entry 檔案指向的 URL 設定為"http://www.ibm.com/developerworks"。編輯完成後,在檔案瀏覽器下(如圖8所示)就可以看見該例項的顯示樣式。值得注意的是,由於該例項並不是一個應用程式,因此在應用程式瀏覽器下是看不到相應快捷方式的。
圖8 "VisitDeveloperWorks-Link.desktop"檔案在檔案瀏覽器中的顯示樣式
[img]http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/images/image019.png[/img]
回頁首
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.
相關文章
- 【JVM】深入解析class類檔案JVM
- linux proc 檔案系統下 entry 的解釋(轉)Linux
- 深入解析Class類檔案的結構
- JVM 深入學習:Java 解析 Class 檔案過程解析JVMJava
- 為你的 Linux 應用建立 .desktop 檔案Linux
- 表`t`的XDES Entry結構檔案分析
- Linux深入探索12-檔案系統Linux
- Apache Hudi核心之檔案標記機制深入解析Apache
- 詳細解析Linux /etc/passwd檔案Linux
- 深入解析 Spring 配置檔案:從基礎到高階Spring
- Python 高階程式設計:深入解析 CSV 檔案讀取Python程式設計
- 深入剖析PE檔案
- eml檔案解析
- Class檔案解析
- 《深入解析Oracle》第三章,引數及引數檔案Oracle
- 深入理解 ext4 等 Linux 檔案系統Linux
- Linux ALSA 音訊處理深入解析Linux音訊
- Linux 核心的軟中斷深入解析Linux
- jdom解析xml檔案XML
- java class檔案解析Java
- BVH檔案格式解析
- Nginx配置檔案解析Nginx
- GData解析XML檔案XML
- redis配置檔案解析Redis
- jquery 解析xml檔案jQueryXML
- oracle trace檔案解析Oracle
- ISO檔案解析(轉)
- Python 高階技巧:深入解析讀取 Excel 檔案的多種方法PythonExcel
- XML 檔案解析實踐 (DOM 解析)XML
- Java解析ELF檔案:ELF檔案格式規範Java
- Oracle引數檔案解析——引數解析Oracle
- 從 lsof 開始,深入理解 Linux 虛擬檔案系統Linux
- 深入理解linux系統下proc檔案系統內容Linux
- mybatis原始碼配置檔案解析之五:解析mappers標籤(解析XML對映檔案)MyBatis原始碼APPXML
- webpack打包bundle檔案解析Web
- java class 檔案格式解析Java
- c++ 解析yaml檔案C++YAML
- java解析yaml配置檔案JavaYAML