跳转至内容

图标

来自 ArchWiki

freedesktop 项目提供了图标主题规范 (Icon Theme Specification),该规范适用于大多数 Linux 桌面环境,并试图将大量图标在 icon-theme 中统一外观。Freedesktop 还提供了图标命名规范 (Icon Naming Specification),它为被认为会安装在任何系统上的图标定义了一套标准命名方案。默认主题 hicolor 应当包含所有这些图标。

安装

Icon themes

提示 建议安装 hicolor-icon-theme 软件包,因为许多程序会将图标存放在 /usr/share/icons/hicolor/ 中,且大多数其他图标主题都会继承 Hicolor 图标主题的图标。

通过软件包安装

手动设置

如果你找不到所需图标主题的软件包,则需要手动安装。

  • 首先,查找并下载你想要的图标包。可以从以下网站下载许多不同的图标主题:Opendesktop.orgXfce-look.org
  • 然后导航到包含图标包的目录并将其解压。例如:tar -xzf ~/Downloads/icon-pack.tar.gz
  • 将包含图标的解压文件夹移动至:
    • /usr/share/icons/(系统范围),或
    • ~/.icons/~/.local/share/icons/(仅限当前用户)。
  • 可选操作:在选择的目录上运行 gtk-update-icon-cache -f -t 以更新图标缓存。
  • 使用适用于你 桌面环境窗口管理器 的配置工具选择图标主题。
提示
  • 若要更新图标主题,可以通过 git clone theme_repository.git 将仓库克隆到另一个位置(例如 ~/Downloads/)。之后,根据你想让该主题在系统范围还是仅对当前用户可用,在上述路径之一中创建指向该克隆文件夹的符号链接。可以通过运行 ln -sf theme_path chosen_directory 来实现。然后,你可以偶尔在克隆仓库的目录中运行 git pull 来更新主题或检查更新。这样,无需重新下载、解压和移动主题即可轻松应用更新。
  • 或者,你也可以参考 #通过软件包安装 中链接的软件包 PKGBUILDs,自己创建软件包。另请参阅VCS 软件包指南

自定义

系统始终有一个处于激活状态的主题。对于 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 FilesThunar)可以为自定义位置(如 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

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.