GLib,是否有可靠的方法来测试图标是否存在? (瓦拉)
GLib, is there a reliable way to test icons existence ? (Vala)
通常,我会收集 Steam 游戏的信息,如果用户要求,它会创建游戏图标。所以可能会有像 steam_icon_1524
这样的游戏图标,但不确定。
如何测试图标是否可用?
这个答案可能不适用于 Steam 游戏,但你说过它不是特定于 Steam 的,所以 耸耸肩。
基本上,你只需要调用GLib.AppInfo.get_icon。如果没有图标,它将return null。
要枚举您使用的已安装应用程序 GLib.AppInfo.get_all ()
。
在幕后,正在发生的是存储在 $XDG_DATA_DIRS
的 applications/ 子目录中的 *.desktop 文件(如果未设置则回退:“/usr/local/share/:/usr/share /") 和 $XDG_HOME_DATA_DIR
(如果未设置则回退:"~/.local/share/")被解析(有关文件格式的详细信息,请参阅 Desktop Entry Specification),并且 "Icon" 键用于确定图标名称。
从技术上讲,这并不能完全告诉您该图标在当前图标主题下是否实际存在,只有当它应该 存在时才行。这就是 Icon Theme Specification 的用武之地。有多种实现方式,但由于您使用的是 Vala,我假设您使用的是 GTK+...
您可以使用 Gtk.IconTheme.get_default to get the theme, then Gtk.IconTheme.lookup_by_gicon to get the Gtk.IconInfo(如果未找到则为 null)。
综上所述,这是一个列出所有已安装应用程序及其图标的快速程序:
private static void main (string[] args) {
Gtk.init (ref args);
unowned Gtk.IconTheme theme = Gtk.IconTheme.get_default ();
foreach (unowned GLib.AppInfo appinfo in GLib.AppInfo.get_all ()) {
GLib.Icon? icon = appinfo.get_icon ();
if (icon != null && icon is GLib.ThemedIcon) {
GLib.message ("%s: %s", appinfo.get_display_name (), icon.to_string ());
Gtk.IconInfo? iconinfo = theme.lookup_by_gicon (icon, 48, 0);
if (iconinfo != null) {
GLib.message (iconinfo.get_filename ());
} else {
GLib.message ("No icon.");
}
}
}
}
通常,我会收集 Steam 游戏的信息,如果用户要求,它会创建游戏图标。所以可能会有像 steam_icon_1524
这样的游戏图标,但不确定。
如何测试图标是否可用?
这个答案可能不适用于 Steam 游戏,但你说过它不是特定于 Steam 的,所以 耸耸肩。
基本上,你只需要调用GLib.AppInfo.get_icon。如果没有图标,它将return null。
要枚举您使用的已安装应用程序 GLib.AppInfo.get_all ()
。
在幕后,正在发生的是存储在 $XDG_DATA_DIRS
的 applications/ 子目录中的 *.desktop 文件(如果未设置则回退:“/usr/local/share/:/usr/share /") 和 $XDG_HOME_DATA_DIR
(如果未设置则回退:"~/.local/share/")被解析(有关文件格式的详细信息,请参阅 Desktop Entry Specification),并且 "Icon" 键用于确定图标名称。
从技术上讲,这并不能完全告诉您该图标在当前图标主题下是否实际存在,只有当它应该 存在时才行。这就是 Icon Theme Specification 的用武之地。有多种实现方式,但由于您使用的是 Vala,我假设您使用的是 GTK+...
您可以使用 Gtk.IconTheme.get_default to get the theme, then Gtk.IconTheme.lookup_by_gicon to get the Gtk.IconInfo(如果未找到则为 null)。
综上所述,这是一个列出所有已安装应用程序及其图标的快速程序:
private static void main (string[] args) {
Gtk.init (ref args);
unowned Gtk.IconTheme theme = Gtk.IconTheme.get_default ();
foreach (unowned GLib.AppInfo appinfo in GLib.AppInfo.get_all ()) {
GLib.Icon? icon = appinfo.get_icon ();
if (icon != null && icon is GLib.ThemedIcon) {
GLib.message ("%s: %s", appinfo.get_display_name (), icon.to_string ());
Gtk.IconInfo? iconinfo = theme.lookup_by_gicon (icon, 48, 0);
if (iconinfo != null) {
GLib.message (iconinfo.get_filename ());
} else {
GLib.message ("No icon.");
}
}
}
}