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 範例
新增與更新 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皆有):
- 移除 Desktop-file 時,不會移除 Menu-file 中的 include 內容。
- 即使 Submenu 下仍有其他 Desktop-file ,它還是會移除 Directory-file 。 與文件說明不符: A submenu and the associated directory file is only removed when the submenu no longer contains any menu entries.
- 移除 Directory-file 時,不會移除對應的 Menu-file。所以選單上仍然會出現這個 Submenu 與 include 的 Desktop,並顯示未經 Directory-file 修飾的名稱。