查找/替換 NetworkManager 小程序圖示(在 Cinnamon DE 中)?
tl;dr - 我如何確定 NetworkManager 小程序使用哪些圖示,以便我可以用自定義圖示替換它們?
概括
我的主面板/工作列/系統托盤區域中有 NetworkManager 小程序(安裝作業系統時就在那裡),並添加了幾個 VPN 連接。連接一切正常,但我發現我不喜歡預設圖示,並希望將它們替換為在深色背景下更突出的圖示。我一直在嘗試查找正在使用的圖示但未成功,以便我可以用亮綠色(vpn)和洋紅色(有線/非vpn)的自定義圖示替換它。
這是我希望替換的預設圖示的螢幕截圖:
系統詳情
我有多個電腦/分區,並在幾個發行版上嘗試過。我在所有涉及的發行版上使用相同的主題設置和相同的 DE。
DE:Cinnamon(對所有人都一樣) 發行版:Fedora 33、LMDE-4、Linux Mint 19.3 主題:視窗邊框:Mint-Y Dark,圖示和桌面:Mint-Y Dark Aqua,滑鼠指針:Adwaita
很高興從我的任何發行版中進行測試。但因為我是從 Fedora 寫的:
$ uname -r 5.9.11-200.fc33.x86_64 $ dnf list NetworkManager|grep NetworkManager NetworkManager.x86_64 1:1.26.4-1.fc33 @updates $ dnf list cinn*|grep -P '^cinnamon\.x|menus\.x' cinnamon.x86_64 4.6.7-1.fc33 @anaconda cinnamon-menus.x86_64 4.6.1-2.fc33 @anaconda
需要任何其他資訊,請告訴我
到目前為止我嘗試過的
- 我知道大多數係統圖示都位於
/usr/share/icons
. 我在這裡打開了 nemo 文件管理器並手動環顧四周,試圖找到一個看起來相似的文件,但要麼我需要檢查我的眼睛,要麼我錯過了一些東西。裡面有很多圖片,所以即使更仔細地關注以“network*”或“nm-*”開頭的東西,我也很容易錯過它……- 使用上述方法,我以為我找到了它,
/usr/share/icons/Mint-Y/status/symbolic/status-nm-device-wired-secure-symbolic.svg
但是在將顏色程式碼編輯為綠色(sudo sed -Ei "s/(bebebe|d3dae3)/00994c/g" status-nm-device-wired-secure-symbolic.svg
)並重新啟動電腦後,小程序仍然具有舊顏色。仔細查看後,我注意到這個目錄不包含任何看起來像正常/非 vpn 有線連接圖示的東西。- 一些線上搜尋導致我
/usr/share/cinnamon/applets/network@cinnamon.org/applet.js
. 我嘗試在文本編輯器中打開它,看看我是否能弄清楚圖示的來源……我承認我並不完全理解很多使用的約定(包括 nix 如何將名稱/標籤解析為圖示文件路徑)所以我基本上只是在尋找標籤並希望它們與/usr/share/icons
.- 我知道有單獨的指示器圖示小程序。我寧願不使用這些。特別是當已經有一個圖示時;只是看起來多餘和浪費有限的螢幕空間。
終於想通了!至少在某種程度上……還有更多我不完全理解的內容,這使得正確的最終顏色有點挑戰。但我能夠進行更改並確認它適用於執行 Cinnamon 的 2 個不同發行版:Fedora 33 和 Mint 19.3。如果其他知識淵博的人想要填補空白或發布更好的答案,那麼請務必這樣做。
**警告:這個過程對於新手/技術背景低的人來說可能太先進了。無需程式,但更針對高級使用者/調整者。**如果您接受風險並且不介意“取消保修”;-) …最後一部分包含我用來獲取螢幕截圖中圖示的命令。
我將限制這個答案,更改 Cinnamon DE bc 上 Adwaita 圖示主題的 NetworkManager 圖示我很懶,不想測試 Applet/Status/Panel Size/Icon Theme 的許多、許多、許多組合/桌面環境/版本/解析度/發行版/等。
依賴項:
- ImageMagick 用於轉換工具 (cli) 或 Pinta/Krita/Gimp/whatever(如果你想在 gui 中進行)
- Gpick(可選,但方便發現顯示面板圖示的確切顏色)
概述:
- 您應該對圖示主題如何互動有一個基本的了解。需要注意的要點是 Linux/Gnome/GTK 遵循 freedesktop 標準,該標準檢查多個文件夾,然後從所有這些文件夾回退到多個主題。我不會在這裡深入探討,但這篇文章很好地涵蓋了它。
/usr/share/icons
出於我的目的,我們將只關注~/.local/share/icons
. 如果您知道您感興趣的圖示的名稱,您可以通過呼叫 GTK api 來查看系統如何將其解析為文件路徑。還有一些非常方便的 python 腳本將接受圖示名稱作為參數並為您執行此查找,您可以在這篇文章中找到- 包括我自己編寫的修改版本。- 現在您已經知道(至少在理論上)圖示在何處以及如何被拾取以及如何找到圖示的文件路徑,您需要知道小程序使用了哪些圖示名稱以及哪個小程序。這部分也有點難。基本上,這些都是在小程式碼中定義的。對於 Cinnamon DE,您可以在下面找到它的小程序
/usr/share/cinnamon/applets
,雖然它們是以 javascript 的形式編寫的,但文件有些過時且很難找到。但是,您實際上並不需要了解小程式碼的詳細資訊來查找圖示名稱。現在,您可能會看到一個名為的文件metadata.json
,其中包含一個圖示名稱,但在您興奮之前 - 這只是指定 Cinnamon Spices / Applet 下載 GUI 中使用的圖示 -不是小程序在系統托盤上實際使用的圖示。正如我所說,實際的圖示名稱將在小程序原始碼中定義。對於 Cinnamon 下的 NetworkManager 小程序,這是/usr/share/cinnamon/applets/network@cinnamon.org/applet.js
我在 OP 中提到的。如果您開始搜尋圖示,在此您將看到所有各種 wifi 狀態、離線/斷開/連接狀態和設備類型(wifi、有線、vpn、蜂窩網路/寬頻/其他)的大量圖示名稱。其他小程序可能會簡單得多,但這取決於小程序。這個小程序的大多數基本圖示名稱是_updateIcon
在我的副本中從第 2205 行開始的函式中定義的。然後,您可以將這些插入到上面提到的 python 腳本中以獲取一些路徑:get-icon-path.py network-vpn
.- 現在這是另一個讓我困惑了很長一段時間的部分。Gnome/Gtk/Cinnamon 有 2 種基本類型的圖示。有正常圖示,也稱為全彩圖示和所謂的“符號”圖示(通常是單色)。在很長一段時間裡,我的印像是象徵性的 100% 黑白,沒有顏色,但事實並非如此。我還錯誤地認為,我能夠獲得彩色系統托盤圖示的唯一方法是以某種方式潛入自定義 css 文件/javascript 調整的世界,以大量修改我的主題。我確信這會產生更好的結果,但我不想參加作業系統主題課程或以此為職業;我只是想改變一些基本的顏色,然後轉向更大更好的東西。因此,當您搜尋圖示時,
get-icon-path.py network-vpn
和get-icon-path.py network-vpn-symbolic
。我並不完全理解其中一個用於另一個的所有場景。我想我必須花一些時間來深入閱讀 freedesktop.org / Gnome 文件。但是對於我的更改,我自定義了network-vpn-symbolic
和network-wired-symbolic
圖示(以及一些中間/錯誤狀態)。- 確定要修改的確切圖示文件後,您可以繼續在
~/.local/share/icons/<theme>
. 在我的情況下<theme>
是Adwaita
. 此外,您的“面板設置”在這裡可能無關緊要:我說我的面板高度為“32”,符號圖示大小為“28px”(如果重要的話,我的解析度為 1920x1080)。我認為這會影響圖示大小並最終浪費大量時間尋找更大的圖示大小和可縮放的 svg 矢量圖像……但實際上證明這對我有用的是用於網路連接的 16x16 png 文件我一時興起把它扔進了文件夾。我還意識到,即使/usr/share/icons/Adwaita/16x16
沒有 network-vpn,您也可以調整其他圖示之一的大小,將其放置在相應的文件夾中,它將被拾取。- 最後一個麻煩的部分,我仍然不完全理解的是最終顯示的顏色是如何設置的。似乎作業系統中有一些中間樣式正在改變我儲存在 png 圖示文件中的顏色,但計算起來似乎不像添加/減去一些偏移量那麼簡單。大多數情況下,我是通過反複試驗得到的。
我的設置
我的系統設置/主題(供參考)
您還會注意到,這些都在某個階段或另一個階段從 Adwaita 繼承,這就是為什麼 Adwaita 是我所針對的最小公分母的原因。但是對於系統托盤,我認為它將基於您的圖示主題(未經驗證)。
$ cd /usr/share/icons $ grep Inherit Mint-Y-Dark-Aqua/index.theme Inherits=Mint-Y-Dark,Adwaita,gnome,hicolor $ grep Inherit Mint-Y-Dark/index.theme Inherits=Mint-Y,Adwaita,gnome,hicolor $ grep Inherit Mint-Y/index.theme Inherits=Adwaita,gnome,hicolor
顏色表
正如我提到的,我看到的最終圖示的顏色受到作業系統中某些其他樣式/主題的影響,我不知道如何訪問/需要更多的努力才能找到我希望花費的。對於像我這樣的其他懶人,這裡有一些值可能適用於大多數預設的 Cinnamon 系統。對於其他所有人,我將在下面概述我用來到達此處的步驟,您可以自己進行試驗。
從螢幕截圖重新創建我的圖示
這只是要顯示用於兩個特定網路管理器圖示的實際命令。這是在硬連線的台式電腦上,所以我沒有 wifi,我只關心我的 VPN 是否已連接或者我在沒有 VPN 的情況下線上。因為我已經介紹瞭如何在概覽中找到圖示,所以這裡只介紹如何重新創建我在上面的螢幕截圖中所做的事情。
如果您有其他圖示主題,
~/.local/share/icons
請重命名它,這樣您就不會在測試期間有額外的東西與之衝突。之後您可以將其移回/合併(我發生了這種情況,我花了一段時間才意識到發生了什麼):mv ~/.local/share/icons ~/.local/share/icons.$(date +'%Y-%m-%d-%H%M%S').bak
# create directories mkdir -p ~/.local/share/icons/Adwaita/16x16/devices; mkdir -p ~/.local/share/icons/Adwaita/16x16/status; # check what icons you have on your system # for python script, see linked post above get-icon-path.py network-vpn network-wired network-vpn-symbolic network-wired-symbolic # OR alternately, you could run something like # but this won't consider theme inheritance or user-folders find /usr/share/icons/Adwaita /usr/share/icons/gnome \( -iname '*network-vpn*.png' -o -iname '*network-wired*.png' \) -not \( -iname '*acquir*' -o -iregex '.*/legacy/.*' -o -iname '*route*' -o -iname '*offline*' -o -iname '*disconnected*' \)|sort; # recolor the default 16x16 network-wired icon cd ~/.local/share/icons/Adwaita/16x16/devices; f="/usr/share/icons/Adwaita/16x16/devices/network-wired-symbolic.symbolic.png"; c='cyan';convert "${f}" -fuzz 20% -fill ${c} +opaque none "$(basename "${f}")"; # no 16x16 icon is provided for network-vpn # so recolor and resize the 64x64 network-vpn icon cd ~/.local/share/icons/Adwaita/16x16/status; f="/usr/share/icons/Adwaita/64x64/status/network-vpn-symbolic.symbolic.png"; c='#6689af';convert "${f}" -resize 16x16 -fuzz 20% -fill ${c} +opaque none "$(basename "${f}")"; # restart cinnamon desktop (or alternately, just log out then back in) cinnamon --replace --clutter-display=:0 2> /dev/null &
更新:到目前為止,我已經在 2 個 Mint 19.3 實例和 1 個 Fedora 33 實例上執行上述命令,沒有問題。但是在我的第三次 Mint 19.3 實例中,我注意到上面列出的圖示(例如
network-vpn-symbolic.symbolic.png
,不存在但network-vpn.png
確實存在)。在這種情況下,建議使用我前面提到的 python 腳本並查找圖示名稱network-vpn
和network-vpn-symbolic
; 如果你有像徵性的使用,如果沒有使用正常的。如果你有一個 16x16 大小的預設圖示,那麼你可以使用第一個轉換命令(不帶 -resize);如果沒有,則選擇您擁有的最高解析度預設圖示(通常為 256 或 128 或 64)並使用第二個轉換命令(使用 -resize)。更新 2:另請注意,get-icon-path.py 腳本在 ssh 會話中無法正常工作(也可能在其他非圖形會話中)。我懷疑這是因為您需要一個 X11/圖形會話才能查詢。