Linux Desktop Entry 檔案深入解析

來源:互聯網
上載者:User

 

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

Desktop Entry 檔案是 Linux 案頭系統中用於描述程式啟動配置資訊的檔案。Desktop Entry 檔案實現了類似於 Windows 作業系統中捷徑的功能。本文詳細介紹了 Linux Desktop Entry 檔案的定義,編程和使用方式。讀者可以通過文章末尾的執行個體操作進一步加深對 Desktop Entry 檔案應用的領會。

在 Windows 平台上,使用者可以通過點擊位於案頭或菜單上的捷徑輕鬆開啟目標應用程式。現代 Linux 案頭系統也提供了此項功能。目前,Linux KDE 和 Linux GNOME 案頭系統都使用 Desktop Entry 檔案標準來描述程式啟動配置資訊。Desktop Entry 檔案標準是由 FreeDesktop.org(http://freedesktop.org/wiki/) 制定的,目前最新的版本是"Desktop Entry Specification 1.0"[1]。

 



回頁首

 


 

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.0Encoding = UTF-8Name = Quick Start TourGenericName = User TutorialComment = Computer Based Training tutorial to guide and help you learn how to use the Desktop|-------10--------20--------30--------40--------50--------60--------70--------80--------9||-------- XML error:  The previous line is longer than the max of 90 characters ---------|Exec = gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.htmlIcon = cbtStartupNotify = trueTerminal = falseType = ApplicationCategories = GNOME;Application;Documentation;OnlyShowIn = GNOME;X-SuSE-translate = trueName[cs] = Rychlá prohlídka systémuComment[cs] = V?ukov? program seznamující u?ivatele se základy pracovního prost?edíGenericName[cs] = U?ivatelsk? tutoriálName[hu] = RendszerbemutatóComment[hu] = A munkaállomés használatát bemutató segédletGenericName[hu] = Felhasználói segédlet

 

本文將在下一節中結合上述"cbt.desktop"檔案內容重點解析 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。 


     

  • 關鍵字"GenericName":[可選]
    該數值指定了相關應用程式的通用名稱。比如在清單1中關鍵字"GenericName"的數值是"User Tutorial"。開啟應用程式瀏覽器,就可以看見字串"User Tutorial"被顯示在表徵圖的右側,3所示:


     

  • 關鍵字"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 = LinkURL = 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"等可選關鍵字。使用者可以根據需要進行選取。

 



回頁首

 

Desktop Entry檔案是一種常見的Linux檔案格式,很多Linux程式需要對該種檔案提供支援。在此,本文給出分析運行 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 );    

 

有了關鍵字"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;}

 

有了關鍵字"Type","URL"和"Terminal"的數值,就可如下運行Desktop Entry檔案。

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

 



回頁首

 

在這部分中,本文將給出建立Desktop Entry檔案的兩個具體執行個體。這兩個執行個體的目標都是要建立自動訪問IBM DeveloperWorks網站的捷徑,具體運行結果4所示。這兩個執行個體將使用不同的方法實現這一目標。第一個執行個體將建立的檔案類型是"Application"的Desktop Entry檔案"VisitDeveloperWorks-Application.desktop";第二個執行個體將建立的檔案類型是"Link" 的Desktop Entry檔案"VisitDeveloperWorks-Link.desktop"。


 

假設系統指定表徵圖目錄下存有圖片檔案"gaim.png" 。5所示編輯檔案"VisitDeveloperWorks-Application.desktop",並把結果存於"/usr/share/applications/"目錄下。


 

該檔案的核心內容是將應用程式圖示設定為"gaim.png"檔案,將Desktop Entry檔案的類型設定為"Application",並將應用程式所要執行的命令設定為"firefox http://www.ibm.com/developerworks"。編輯完成後,在檔案瀏覽器和應用程式瀏覽器下(6所示)就可以看見該執行個體的顯示樣式。


 

對上述"VisitDeveloperWorks-Application.desktop"檔案進行7所示的修改,並將檔案更名為"VisitDeveloperWorks-Link.desktop",儲存於"/usr/share/applications/"目錄下。


 

該檔案的核心內容是將 Desktop Entry 檔案的類型設定為"Link",並將 Desktop Entry 檔案指向的 URL 設定為"http://www.ibm.com/developerworks"。編輯完成後,在檔案瀏覽器下(8所示)就可以看見該執行個體的顯示樣式。值得注意的是,由於該執行個體並不是一個應用程式,因此在應用程式瀏覽器下是看不到相應捷徑的。




回頁首

 

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.

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.