
我正在創建一個應用程式想要安裝一個圖示對於特定於應用程式的擴充功能 ( .crystalopen
),其方式不僅適用於 Ubuntu/GNOME,而且適用可移植到其他桌面環境就像 KDE 一樣。
該應用程式會自行安裝到~/.local/bin
(而不是安裝到/usr/bin
),因此不需要 root 權限。因此我想要這個圖標安裝在~/.local/
如果可能的話。
我嘗試過的
我註冊 MIME 類型( application/vnd.crystal-opener
).crystalopen
透過建立application-vnd.crystal-opener.xml
如下所示的擴充功能來進行擴充:
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="application/vnd.crystal-opener">
<comment>Crystal Opener</comment>
<glob pattern="*.crystalopen"/>
</mime-type>
</mime-info>
並安裝它:
$ xdg-mime install --mode user application-vnd.crystal-opener.xml
其中內部:
- 將其複製到
~/.local/share/mime/packages
,根據需要建立任何中間目錄;和 - 運行
update-mime-database ~/.local/share/mime/
更新~/.local/share/mime/mime.cache
。
我驗證 MIME 類型是否已註冊透過建立一個具有檔案副檔名的非空1檔案並查詢其 MIME 類型:
$ echo OPEN > OPEN.crystalopen
$ xdg-mime query filetype OPEN.crystalopen
application/vnd.crystal-opener
或等效的(在 GNOME 上):
$ gio info OPEN.crystalopen | grep standard::content-type
standard::content-type: application/vnd.crystal-opener
我建立一個圖標圖像使用 MIME 類型的正確檔案名稱application-vnd.crystal-opener.svg
:
<svg height="128" width="128">
<ellipse cx="43" cy="32" rx="32" ry="32" style="fill:red" />
<ellipse cx="84" cy="32" rx="32" ry="32" style="fill:green" />
</svg>
這圖標主題規範說我應該能夠在所有其他主題繼承的“hicolor”主題中安裝這樣的映像。但這似乎不起作用。特別是如果我執行以下操作:
$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/hicolor/scalable/mimetypes
$ sudo update-icon-caches /usr/share/icons/*
那麼「檔案」應用程式中的檔案圖示OPEN.crystalopen
不會變更為新影像。
也許文件應用程式沒有正確實現主題繼承?2
相反,我確定哪個特定主題是系統的預設主題並在那裡安裝圖標,這感覺不太可靠或便攜:
- 我確定係統預設主題的候選者透過尋找常見 MIME 類型的圖標,例如
text/html
:
$ find /usr/share/icons -name 'text-html.*'
/usr/share/icons/Yaru/... (10 lines)
/usr/share/icons/HighContrast/... (1 line)
/usr/share/icons/Humanity/... (7 lines)
最後竟然
Humanity
成為了這個系統(Ubuntu 23)的系統預設主題。首先,我嘗試將圖示安裝到電腦範圍的主題目錄:
$ sudo cp application-vnd.crystal-opener.svg /usr/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/*
- 這有效,成功地將“文件”應用程式中文件的圖標更新
OPEN.crystalopen
為新圖像。 - 然而我想要安裝到使用者的主題目錄而不是到機器範圍的主題目錄,所以我這樣做:
$ mkdir -p ~/.local/share/icons/Humanity/mimes/256
$ cp application-vnd.crystal-opener.svg ~/.local/share/icons/Humanity/mimes/256
$ sudo update-icon-caches /usr/share/icons/* # not sufficient to update: ~/.local/share/icons/*
- 這也有效,成功地將“文件”應用程式中的文件圖示更新
OPEN.crystalopen
為新圖像。 (儘管不幸的是,sudo
需要更新電腦範圍的圖示快取才能使圖示在下次登出和登入之前立即顯示。)
大問題
如何將圖標安裝到用戶主題目錄,以便文件應用程式中相關文件的圖標以可靠且便攜的方式更新為新圖像不僅可以在 GNOME 中使用,還可以在 KDE 和其他桌面環境中使用?
特別是,是否可以將圖示安裝到~/.local/share/icons/hicolor
文件中記錄的主題圖標主題規範總是可用的?
1空文件通常會被識別為 MIME 類型,application/x-zerosize
而不是註冊的任何新的自訂 MIME 類型。
2 “Nautilus 不遵守[主題]繼承規則”根據https://askubuntu.com/a/752316/1724736
答案1
由於主題之間的圖標繼承似乎無法正常工作,我只是編寫了一個腳本來安裝我的應用程式圖標全部系統上的主題。凌亂但有效。
請參見124 行自訂安裝程式碼我曾經實現過這個目標。