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
很高兴从我的任何发行版进行测试。但因为我是用软呢帽写的:
$ 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 有线连接图标的内容。一些网上搜索让我找到了。我尝试在文本编辑器中打开它,看看我是否能弄清楚图标来自哪里...我承认我并不完全理解所使用的许多约定(包括 nix 如何将名称/标签解析为图标)文件路径),所以我本质上只是在寻找标签并希望它们与.
/usr/share/cinnamon/applets/[email protected]/applet.js
/usr/share/icons
我知道有单独的指示器图标小程序。我宁愿不使用这些。特别是当已经有一个图标时;似乎是多余的,浪费了有限的屏幕空间。
答案1
最后想通了!至少在某种程度上......还有更多我不完全理解的内容,这使得正确的最终颜色有点具有挑战性。但我能够进行更改并确认它可以在运行 Cinnamon 的 2 个不同发行版上运行:Fedora 33 和 Mint 19.3。如果其他有更好知识的人想要填补空白或发布更好的答案,那么请务必这样做。
警告:对于新手/技术背景较低的人来说,此过程可能过于先进。无需编程,但更多地针对高级用户/调整者。如果您接受风险并且不介意“使保修无效”;-) ...最后一部分包含我用来获取屏幕截图中的图标的命令。
我将限制这个答案,在 Cinnamon DE bc 上更改 Adwaita 图标主题的 NetworkManager 图标我很懒,不想测试所有的东西,小程序/状态/面板大小/图标主题的许多、许多、许多组合/桌面环境/版本/分辨率/发行版/等。
依赖项:
- ImageMagick 用于转换工具 (cli) 或 Pinta/Krita/Gimp/其他工具(如果你想在 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小程序,这是我在OP中提到的。如果您开始搜索图标,您将在其中看到大量针对所有各种 wifi 状态、离线/断开连接/连接状态以及设备类型(wifi、有线、VPN、蜂窝网络/宽带/其他)的图标名称。其他小程序可能会简单得多,但这取决于小程序。这个小程序的大部分基本图标名称都是在我的副本中从第 2205 行开始的函数中定义的。然后,您可以将它们插入上面提到的 python 脚本中以获取一些路径:。/usr/share/cinnamon/applets/[email protected]/applet.js
_updateIcon
get-icon-path.py network-vpn
现在还有另一部分让我困惑了很长一段时间。 Gnome/Gtk/Cinnamon 有 2 种基本类型的图标。有常规图标,也称为全彩图标和所谓的“符号”图标(通常是单色)。在很长一段时间里,我的印象是象征性的东西是 100% 的黑白,没有颜色,但事实并非如此。我还错误地认为,我能够获得彩色系统托盘图标的唯一方法是以某种方式潜入自定义 css 文件/javascript 调整的世界,以大量修改我的主题。我确信这会产生更好的结果,但我不想参加操作系统主题课程或以此为职业;我只是想改变一些基本颜色并转向更大更好的东西。因此,当您搜索图标时,您实际上会获得
get-icon-path.py network-vpn
AND的匹配项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
没有网络 VPN,您也可以调整其他图标之一的大小,将其放入相应的文件夹中,然后它就会被拾取。最后一个麻烦的部分,我仍然不完全理解的是最终显示的颜色是如何设置的。操作系统中似乎有一些中间样式正在改变我存储在 png 图标文件中的颜色,但它的计算似乎不像添加/减去一些偏移量那么简单。大多数情况下,我是通过反复试验才达到目前的水平的。
我的设置
我的系统设置/主题(仅供参考)
属性 | 软呢帽 33 | 完好 19.3 |
---|---|---|
肉桂版 | v4.8.6-1 | v4.4.8 |
网络管理器版本 | v1.26.6-1 | v1.10.14 |
主题: 窗口边框 | 薄荷色-Y-深色 | 薄荷-Y |
主题:图标 | 薄荷-Y-深-水色 | 薄荷-Y |
主题:控制 | 薄荷-Y-深-水色 | 薄荷-Y |
主题:鼠标指针 | 阿德维塔 | DMZ-白色 |
主题: 桌面 | 薄荷-Y-深-水色 | 薄荷色-Y-深色 |
您还会注意到,这些都在某个阶段继承自 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 系统。对于其他人,我将在下面概述我用于达到此目的的步骤,您可以自己进行实验。
png 文件中的 ImageMagick 颜色 | 显示图标的颜色(根据gpick) |
---|---|
深藏红花 #ff9933 | 深紫色#3d1660 |
浅蓝色#00fee1 | 浅橙色#c8995e |
红色#ff0000 | 中绿色#4e9a06 |
绿色#00ff00 | 橙色#f5793e |
蓝色#0000ff | 深红色#cc0000 |
黑色#000000 | 白色#ffffff |
白色#ffffff | 黑色的? #111647 |
黄色#ffff00 | 深紫色#441446 |
粉色#ff00ff | 中绿色 #1b9c08 |
谭? #0000ff | 深红色#cb9ae5 |
黄金(金) | 深紫色#452964 |
灰色(灰色) | 浅紫色#890ca7 |
绿色(绿色) | 淡橙色/粉色 #f9bb9e |
棕褐色(棕褐色) | 绿色#4ac21e |
棕色(棕色) | 金子? #827014 |
青色(青色) | 橙色#c27b40 |
洋红色(洋红色) | 绿色#1b9c08 |
黄绿色#beef00 | 紫色#713691 |
深紫色#441446 | 橙色#c19367 |
浅蓝色 #5294e2 | 浅绿色 #92b372 |
深粉色#441446 | 浅紫色#6253d2 |
浅紫色#6253d2 | 浅绿色#8ddb8f |
中蓝色#6689af | 亮绿色#8fe085 |
蓝绿色? #0f808f | 红色 #d22600 |
??? #ff0ff0 | 深绿色#1da30b |
??? #ff0f0f | 中蓝色#fa83ec |
??? #ff000a | 浅蓝色#c490fd |
??? #00f000 | 亮橙色#f58049 |
??? #000fff | 非常淡的淡蓝色#cbf9f5 |
从屏幕截图重新创建我的图标
这只是显示用于两个特定网络管理器图标的实际命令。这是在硬连线台式电脑上,所以我没有 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/图形会话才能进行查询。