GLib,有没有可靠的方法来测试图标的存在? (伐拉)

时间:2015-11-27 14:54:40

标签: glib vala

通常情况下,我正在收集蒸汽游戏的信息,如果用户提出要求,它会创建游戏图标。因此可能会有像steam_icon_1524这样的游戏图标,但不是肯定的。

我如何测试图标是否可用?

1 个答案:

答案 0 :(得分:1)

这个答案可能不适用于蒸汽游戏,但你说它不是特定于蒸汽,所以耸肩

基本上,您只需拨打GLib.AppInfo.get_icon即可。如果没有图标,它将返回null。

要枚举已安装的应用程序,请使用GLib.AppInfo.get_all ()

在幕后,发生的事情是存储在$XDG_DATA_DIRS的applications /子目录中的* .desktop文件(如果没有设置则回退:" / usr / local / share /:/ usr /分享/")和$XDG_HOME_DATA_DIR(如果未设置则回退:"〜/ .local / share /")将被解析(有关文件格式的详细信息,请参阅Desktop Entry Specification )," Icon" key用于确定图标名称。

从技术上讲,这并不能完全告诉您图标是否与当前图标主题实际存在,只有当假设存在时才会存在。这就是Icon Theme Specification所在的位置。有几种实现方式,但由于您使用的是Vala,我会假设您正在使用GTK + ...

您可以使用Gtk.IconTheme.get_default获取主题,然后使用Gtk.IconTheme.lookup_by_gicon获取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.");
      }
    }
  }
}