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.");
      }
    }
  }
}