Linux修复启动器中的图标显示

Linux 是开源系统,所以无法指望它能像 Windows 或 Mac 系统一样面面俱到。在使用过程中,自定义一些配置也是经常遇到的。本文记录: 如何修复 Gnome 菜单中有的启动器对应的图标无法正常显示的问题。

系统中存在相关图标的情况

图标的默认安装位置为/usr/share/icons/, 例如 ArchLinux (2024-11-28)系统中,Open JDK java的图标就无法正常显示,查询启动器文件

/usr/share/applications/java-java-openjdk.desktop
1
2
3
4
5
6
7
8
9
10
11
12
[Desktop Entry]
Name=OpenJDK Java 23 Runtime
Name[fi]=OpenJDK Java 23 - ajonaikainen ympäristö
Comment=OpenJDK Java 23 Runtime
Comment[fi]=OpenJDK Java 23 - ajonaikainen ympäristö
Keywords=java;runtime
Exec=/usr/lib/jvm/java-23-openjdk/bin/java -jar
Terminal=false
Type=Application
Icon=java23-openjdk
MimeType=application/x-java-archive;application/java-archive;application/x-jar;
NoDisplay=true

既然其图标无法正常显示,则表明系统中并没有安装java23-openjdk图标。于是查询系统中安装的相关图标:

1
2
3
4
5
ls -R /usr/share/icons/ |grep java
>
java-openjdk
java-openjdk
java-openjdk

这表明系统中安装的图标为java-openjdk, 因此修改java-java-openjdk.desktop文件中的Icon

1
Icon=java-openjdk

如何指定图标路径

默认情况下,应用程序应该按照以下顺序查找:$HOME/.icons(为了向后兼容性),$XDG_DATA_DIRS/icons/usr/share/pixmaps。应用程序可以进一步将自己的图标目录添加到此列表中,用户可以以应用程序/桌面特定的方式扩展或更改列表。在这些目录中,每个主题都存储为子目录。通过具有相同名称的子目录,可以将主题分布在多个基本目录中。这样,用户可以扩展和覆盖系统主题。 为了给第三方应用程序提供安装其图标的位置,始终应存在一个名为hicolor的主题。hicolor主题的数据可在以下网址下载:http://www.freedesktop.org/software/icon-theme。实现必须在当前主题中找不到图标时查找hicolor主题。 每个主题都存储为基本目录的子目录。主题的内部名称是子目录的名称,尽管由主题指定的用户可见名称可能不同。因此,主题名称区分大小写,并且仅限于ASCII字符。主题名称也不能包含逗号或空格。 在至少一个主题目录中,必须存在一个名为index.theme的文件,描述主题的属性。按顺序搜索基本目录时,使用找到的第一个index.theme文件。该文件描述了主题的一般属性。 在主题目录中还有一组包含图像文件的子目录。每个目录包含为特定名义图标大小设计的图标,如index.theme文件所述。子目录允许多级深入,例如主题hicolor中的子目录48x48/apps将位于$basedir/hicolor/48x48/apps。 图像文件必须是以下类型之一:PNGXPMSVG,并且扩展名必须为.png.xpm.svg(小写)。对于SVG文件的支持是可选的。不支持SVG的实现应该忽略任何.svg文件。除此之外,对于每个文件可能还有一个包含额外图标数据的附加文件。它的基本名称应与图像文件相同,扩展名为.icon。例如,如果图标文件名为mime_source_c.png,则相应的文件名将为mime_source_c.icon。 完整的规格比这个要详尽得多,但关键是:有一些设定的目录,你只需将图标放入其中,桌面就能找到它们。哪种最适合你取决于你的问题和耐心.

注意:有的文章中说“如果你把图标放在/usr/share/icons/(系统范围)或者你的个人目录~/.icons中,那么在.desktop文件中只需要使用图标文件名而不需要扩展名”。而我的系统中有一个应用Singular, 系统默认将其图标放置在了/usr/share/icons/Singular.png, 但是在文件/usr/share/applications/Singular.desktop中直接写为Icon=Singular,而系统并没有识别出来,于是修改为绝对路径Icon=/usr/share/icons/Singular.png后成功识别。修改完图标后,运行 gtk-update-icon-cache -f -t <图标主题路径>,系统会立刻检测到该图标。

参考文章