最近更新: 2010-07-06

XDG規範概念說明

近年的 Linux 桌面環境,處理桌面應用程式選單與項目,依循 FreeDesktop 規格:

XDG Menu 支援樹狀選單結構 (menu tree),樹狀選單的每個節點,都允許包含多個分類項目(category)。選單的葉子則是應用軟體(application),它們與分類項目連結。選單結構描述於 .menu 文件中,選單內容描述於 .directory 文件,應用軟體的內容描述於 .desktop 文件。

使用關係: .menu -> .directory -> .desktop

符號定義
.menu:
  • $XDG_CONFIG_DIRS=/etc/xdg
  • $XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu
    main application menu layout.
  • $XDG_CONFIG_DIRS/menus/applications-merged/*.menu
    third parties may add new <Menu> files in this location to create their own sub-menus.
  • $HOME/.config/menus/applications-merged/*.menu
.directory:
  • $XDG_DATA_DIRS=/usr/share
  • $XDG_DATA_DIRS/desktop-directories/
  • $HOME/.local/share/desktop-directories/
.desktop:
  • $XDG_DATA_DIRS=/usr/share
  • $XDG_DATA_DIRS/applications/
  • $HOME/.local/share/applications/
文件結構與內容
.menu 描述選單結構:
    \-+menu1\categories:a,b
     |      +submenu1-1\categories:c
     |
     +memu2\categories:d
     |
     +menu3\categories:c,e
.directory 描述選單內容:

menu1.directory:

[Desktop Entry]
Name=附屬應用軟體
Type=Directory

submenu1-1.directory:

[Desktop Entry]
Name=附屬遊戲
Type=Directory

menu2.directory:

[Desktop Entry]
Name=系統管理
Type=Directory

menu3.directory:

[Desktop Entry]
Name=遊戲
Type=Directory
.desktop 描述應用軟體內容:

xterm.desktop

[Desktop Entry]
Name=終端機
Type=Application
Categories=a;d

gedit.desktop

[Desktop Entry]
Name=文字編輯
Type=Application
Categories=b

mine.desktop

[Desktop Entry]
Name=踩地雷
Type=Application
Categories=c

wow.desktop

[Desktop Entry]
Name=山口山
Type=Application
Categories=e

輪廓

    xterm.desktop: {
      Name: 終端機
      Categories: a,d
    }
    gedit.desktop: {
      Name: 文字編輯
      Categories: b
    }
    mine.desktop: {
      Name: 踩地雷
      Categories: c
    }
    wow.desktop: {
      Name: 山口山
      Categories: e
    }

結構與內容結合後,呈現在 user 面前的將是:

    \-+附屬應用軟體\終端機
     |             +文字編輯
     |             +附屬遊戲\踩地雷
     |
     +系統管理\終端機
     |
     +遊戲\踩地雷
          +山口山
相關工具:
xdg-desktop-menu
xdg-desktop-menu install directory-file desktop-file

xdg-desktop-menu install --mode user directory-file desktop-file

# 大批處理
xdg-desktop-menu install --noupdate directory-file desktop-file
xdg-desktop-menu install --noupdate directory-file desktop-file
xdg-desktop-menu install --forceupdate
update-desktop-database

從 xdg-desktop-menu 的源碼來看,只有安裝 system 項目(system mode)才會呼叫 update-desktop-database。

PyXDG

http://www.freedesktop.org/wiki/Software/pyxdg

客製化部署方式:
利用 xdg-desktop-database ,安裝共同項目。
  • Directory-file 將被複製到 /usr/local/share/desktop-directories
  • Desktop-file 將被複製到 /usr/local/share/applications
  • 在 /etc/xdg/menus/applications-merged 目錄中,產生對應 Directory-file 的 Menu-file,使用 <include> 標記 Desktop-file 。
利用 xdg-desktop-database ,安裝個別使用者項目。
  • Directory-file 將被複製到 $HOME/.local/share/desktop-directories
  • Desktop-file 將被複製到 $HOME/.local/share/applications
  • 在 $HOME/.config/menus/applications-merged 目錄中,產生對應 Directory-file 的 Menu-file,使用 <include> 標記 Desktop-file 。

採用上述處理策略時,Desktop-file 中的 Categories 無作用。 Submenu 的應用程式項目將完全依據 Menu-file 的 <include> 清單。

單一 Menu-file 範例
<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
    "http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">
<!-- Do not edit manually - generated and managed by xdg-desktop-menu -->
<Menu>
    <Name>Applications</Name>
    <Menu>
        <Name>menu1</Name>
        <Directory>menu1.directory</Directory>
        <Include>
            <Filename>xterm.desktop</Filename>
            <Filename>gedit.desktop</Filename>
        </Include>
    </Menu>
</Menu>
新增與更新 Menu-file 內容時有 bug。

更新 Submenu 的顯示文字時,有時顯示的是 Menu-file 的 Name 內容, 而忽略 Directory-file 中的 Name 欄位(與本地化文字)。 可能是 race-condition,參考: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=365902

In my opinion, the issue is a race-condition between menu-xdg writing the new menus and gnome-panel reading it. Since updating the menus is something that will occur independently of menu-xdg, gnome-panel should be made more robust.

xdg-desktop-menu 在 uninstall 時有些疏失(Moblin與UNR皆有):

  1. 移除 Desktop-file 時,不會移除 Menu-file 中的 include 內容。
  2. 即使 Submenu 下仍有其他 Desktop-file ,它還是會移除 Directory-file 。 與文件說明不符: A submenu and the associated directory file is only removed when the submenu no longer contains any menu entries.
  3. 移除 Directory-file 時,不會移除對應的 Menu-file。所以選單上仍然會出現這個 Submenu 與 include 的 Desktop,並顯示未經 Directory-file 修飾的名稱。
樂多舊網址: http://blog.roodo.com/rocksaying/archives/12889415.html