图标
freedesktop 项目提供了图标主题规范 (Icon Theme Specification),该规范适用于大多数 Linux 桌面环境,并试图将大量图标在 icon-theme 中统一外观。Freedesktop 还提供了图标命名规范 (Icon Naming Specification),它为被认为会安装在任何系统上的图标定义了一套标准命名方案。默认主题 hicolor 应当包含所有这些图标。
安装
Icon themes
/usr/share/icons/hicolor/ 中,且大多数其他图标主题都会继承 Hicolor 图标主题的图标。通过软件包安装
手动设置
如果你找不到所需图标主题的软件包,则需要手动安装。
- 首先,查找并下载你想要的图标包。可以从以下网站下载许多不同的图标主题:Opendesktop.org 和 Xfce-look.org。
- 然后导航到包含图标包的目录并将其解压。例如:
tar -xzf ~/Downloads/icon-pack.tar.gz。 - 将包含图标的解压文件夹移动至:
/usr/share/icons/(系统范围),或~/.icons/或~/.local/share/icons/(仅限当前用户)。
- 可选操作:在选择的目录上运行
gtk-update-icon-cache -f -t以更新图标缓存。 - 使用适用于你 桌面环境 或 窗口管理器 的配置工具选择图标主题。
自定义
系统始终有一个处于激活状态的主题。对于 KDE,它被称为 "breeze";对于 Gnome,则被称为 "Adwaita"。但如果系统没有选择任何主题,规范规定 "hicolor" 即为主题。主题还可以有父主题;例如,"breeze-dark" 继承自 "breeze",这意味着任何它未定义过的图标都会在 "breeze" 中搜索。
图标通过短字符串命名,如 "checkmark"、"weather-snow-large" 或 "org.gnome.Showtime",由应用程序传递给系统以加载特定图标。在查找图标时,如果激活的主题中没有,则搜索其父主题;如果仍未找到,则搜索 "hicolor",因为它是所有主题的后备 (fallback)。此外,作为一种特殊情况,某些图标被命名为 "-symbolic";如果找不到,则移除 "-symbolic" 后再次搜索。
并非主题文件夹中的所有文件都是主题的一部分。图标主题由index.theme 文件定义;你可以在 /usr/share/icons/*/index.theme 查看示例。只有在该文件中提及的子文件夹才被视为主题的一部分。
子文件夹的作用是提供组织管理,在数字命名的文件夹中,则为不同的缩放级别提供不同的分辨率,例如
hicolor contents
/usr/share/icons/hicolor/
├── 1024x1024
├── 128x128
├── 16x16
├── 16x16@2
├── 192x192
├── 20x20
├── 22x22
├── 24x24
├── 24x24@2
├── 256x256
├── 32x32
├── 36x36
├── 40x40
├── 48x48
├── 512x512
├── 64x64
├── 72x72
├── 96x96
├── apps
├── icon-theme.cache
├── index.theme
├── scalable
| ├── actions
| ├── animations
| ├── apps
| ├── categories
| ├── devices
| ├── emblems
| ├── emotes
| ├── filesystems
| ├── intl
| ├── mimetypes
| ├── places
| ├── status
| ├── stock
└── symbolic
└── apps
但最终,图标处于一个扁平的命名空间中,第一个按名称匹配的图标将胜出。
令人困惑的是,这意味着查找图标时可能有多个存放位置,且并不完全相同;同时,许多位置不能存放图标,如果尝试在该位置查找将被静默忽略。例如
/usr/share/icons/Adwaita/symbolic/mimetypes/text-x-generic-symbolic.svg/usr/share/icons/hicolor/scalable/actions/text-x-generic-symbolic.svg
两者都是图标 'text-x-generic-symbolic',尽管一个位于 "Adwaita" 主题的 symbolic/mimetypes/ 下,而另一个位于 "hicolor" 主题的 scalable/actions/ 下。但是
/usr/share/icons/breeze/scalable/actions/text-x-generic-symbolic.svg
永远不会被任何人使用,因为 breeze/index.theme 没有将 scalable/actions 定义为自身的一部分。
图标与徽标
如果你推断出了想要自定义的图标名称,可以使用 xdg-icon-resource。这将调整图标大小并将其复制到 $HOME/.local/share/icons/。通过此方法,还可以添加自定义徽标。示例:
$ xdg-icon-resource install --size 128 --context emblems archuser-example.png # add as emblem $ xdg-icon-resource install --size 128 archuser-example.png # add as normal icon
这仅适用于光栅图标 (.png 和 .xpm)。对于矢量图形 (.svg),或者为了更好地理解运行机制,可以手动创建 ~/.local/share/icons 下的结构。要替换图标,请在 /usr/share/icons/ 中搜索;大多数图标位于 /usr/share/icons/hicolor 中,因为它是后备主题,也是应用程序倾向于安装图标的地方。一旦找到要替换的图像,例如 /usr/share/icons/hicolor/scalable/actions/xsi-edit-find-symbolic.svg,请创建本地版本,将 /usr/share/icons 替换为 ~/.local/share/icons。也就是说:
$ mkdir -p ~/.local/share/icons/hicolor/scalable/actions/ $ cp your-new-symbol.svg ~/.local/share/icons/hicolor/scalable/actions/xsi-edit-find-symbolic.svg
If you only have one then it does not matter which folder it is in, and your ~/.local copy will take precedence so long as it is one of the folders mentioned by the theme's icon.theme file.
根据使用该图标的应用程序的不同,每次更改后你可能需要注销才能应用新图标。
图标主题的文件命名极其精确,一旦出错,通常不会有任何反馈,只会导致图标没有改变,因此如果不起作用,请仔细检查拼写。
要调试当前系统加载的是哪个图标(至少是通过 Gtk 加载的情况下):
detect-icon.py
#!/usr/bin/env python3
import sys
import gi
gi.require_version('Gtk', '3.0');
from gi.repository import Gtk;
icon_theme = Gtk.IconTheme.get_default();
for icon_name in sys.argv[1:]:
icn = icon_theme.lookup_icon(icon_name, 48, 0)
if icn:
print(icn.get_filename())
else:
print('Icon Not Found')
MIME 类型图标
文件管理器不依赖于 file --mime 输出的传统 MIME 类型。相反,它们使用 /usr/share/mime/ 中的定义。根据在那里找到的定义命名图标并将其复制到 ~/.local/share/icons/,将导致文件管理器显示自定义的 MIME 类型图标。以下命令演示了为 KeePass 数据库文件 (.kdb) 创建自定义图标的方法:
$ sed -En 's/(.*)\/(.*)\:.*.kdb.*/\1-\2/p' /usr/share/mime/globs
application-x-keepass2
根据该输出重命名你的图标
$ xdg-icon-resource install --size 128 --context mimetypes application-x-keepass2.png
自定义主题
最后,如果你对主题做了大量修改,可以考虑将其打包成一个独立的主题。为此,创建一个文件夹并为其添加一个 index.theme 文件,使其 _继承_ 你正在自定义的主题;例如,要自定义 KDE 的默认暗色主题:
index.theme
[Icon Theme] Name=ICONPACK NAME Comment=ICONPACK DESCRIPTION Inherits=breeze-dark
按照上述原主题的结构,向其中添加图标。
你可以将主题放在 ~/.local/share/icons/$YOUR_THEME 下,之后它应该出现在桌面环境的外观设置选项中,或者将其压缩并分享给他人!
fstab / gvfs
根据此文档,使用 GVFS 的文件管理器(如 GNOME Files 或 Thunar)可以为自定义位置(如 NFS 共享)显示图标。你只需要在 /etc/fstab 中添加一些扩展挂载选项,并使用你所选图标主题支持的图标名称即可。
/etc/fstab
hostname:/ /mnt/ nfs4 defaults,_netdev,user,rw,exec,comment=x-gvfs-show,x-gvfs-name=Network%20Attached%20Storage,x-gvfs-icon=network-server,x-gvfs-symbolic-icon=network-server,timeo=14 0 0