/** * cra_plugin_process_filename: */ static gboolean cra_plugin_process_filename (CraPlugin *plugin, CraPackage *pkg, const gchar *filename, GList **apps, const gchar *tmpdir, GError **error) { const gchar *key; gboolean ret; _cleanup_free_ gchar *app_id = NULL; _cleanup_free_ gchar *full_filename = NULL; _cleanup_free_ gchar *icon_filename = NULL; _cleanup_object_unref_ CraApp *app = NULL; _cleanup_object_unref_ GdkPixbuf *pixbuf = NULL; /* create app */ app_id = g_path_get_basename (filename); app = cra_app_new (pkg, app_id); full_filename = g_build_filename (tmpdir, filename, NULL); ret = as_app_parse_file (AS_APP (app), full_filename, AS_APP_PARSE_FLAG_USE_HEURISTICS, error); if (!ret) return FALSE; /* NoDisplay requires AppData */ if (as_app_get_metadata_item (AS_APP (app), "NoDisplay") != NULL) cra_app_add_requires_appdata (app, "NoDisplay=true"); /* Settings or DesktopSettings requires AppData */ if (as_app_has_category (AS_APP (app), "Settings")) cra_app_add_requires_appdata (app, "Category=Settings"); if (as_app_has_category (AS_APP (app), "DesktopSettings")) cra_app_add_requires_appdata (app, "Category=DesktopSettings"); /* is the icon a stock-icon-name? */ key = as_app_get_icon (AS_APP (app)); if (key != NULL) { if (as_app_get_icon_kind (AS_APP (app)) == AS_ICON_KIND_STOCK) { cra_package_log (pkg, CRA_PACKAGE_LOG_LEVEL_DEBUG, "using stock icon %s", key); } else { /* is icon XPM or GIF */ if (g_str_has_suffix (key, ".xpm")) cra_app_add_veto (app, "Uses XPM icon: %s", key); else if (g_str_has_suffix (key, ".gif")) cra_app_add_veto (app, "Uses GIF icon: %s", key); else if (g_str_has_suffix (key, ".ico")) cra_app_add_veto (app, "Uses ICO icon: %s", key); /* find icon */ pixbuf = cra_app_find_icon (tmpdir, key, error); if (pixbuf == NULL) return FALSE; /* save in target directory */ icon_filename = g_strdup_printf ("%s.png", as_app_get_id (AS_APP (app))); as_app_set_icon (AS_APP (app), icon_filename, -1); as_app_set_icon_kind (AS_APP (app), AS_ICON_KIND_CACHED); cra_app_set_pixbuf (app, pixbuf); } } /* add */ cra_plugin_add_app (apps, app); return TRUE; }
/** * cra_plugin_process_app: */ gboolean cra_plugin_process_app (CraPlugin *plugin, CraPackage *pkg, CraApp *app, const gchar *tmpdir, GError **error) { const gchar *tmp; AsRelease *release; gchar **deps; gchar **filelist; GPtrArray *releases; guint i; guint secs; guint days; /* add extra categories */ tmp = as_app_get_id (AS_APP (app)); if (g_strcmp0 (tmp, "0install") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "alacarte") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "deja-dup") == 0) as_app_add_category (AS_APP (app), "Utility", -1); if (g_strcmp0 (tmp, "gddccontrol") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "nautilus") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "pessulus") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "pmdefaults") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "fwfstab") == 0) as_app_add_category (AS_APP (app), "System", -1); /* add extra project groups */ if (g_strcmp0 (tmp, "nemo") == 0) as_app_set_project_group (AS_APP (app), "Cinnamon", -1); if (g_strcmp0 (tmp, "xfdashboard") == 0) as_app_set_project_group (AS_APP (app), "XFCE", -1); /* use the URL to guess the project group */ tmp = cra_package_get_url (pkg); if (as_app_get_project_group (AS_APP (app)) == NULL && tmp != NULL) { tmp = cra_glob_value_search (plugin->priv->project_groups, tmp); if (tmp != NULL) as_app_set_project_group (AS_APP (app), tmp, -1); } /* use summary to guess the project group */ tmp = as_app_get_comment (AS_APP (app), NULL); if (tmp != NULL && g_strstr_len (tmp, -1, "for KDE") != NULL) as_app_set_project_group (AS_APP (app), "KDE", -1); /* look for any installed docs */ filelist = cra_package_get_filelist (pkg); for (i = 0; filelist[i] != NULL; i++) { if (g_str_has_prefix (filelist[i], "/usr/share/help/")) { as_app_add_metadata (AS_APP (app), "X-Kudo-InstallsUserDocs", "", -1); break; } } /* look for a shell search provider */ for (i = 0; filelist[i] != NULL; i++) { if (g_str_has_prefix (filelist[i], "/usr/share/gnome-shell/search-providers/")) { as_app_add_metadata (AS_APP (app), "X-Kudo-SearchProvider", "", -1); break; } } /* look for a modern toolkit */ deps = cra_package_get_deps (pkg); for (i = 0; deps != NULL && deps[i] != NULL; i++) { if (g_strcmp0 (deps[i], "libgtk-3.so.0") == 0) { as_app_add_metadata (AS_APP (app), "X-Kudo-GTK3", "", -1); break; } if (g_strcmp0 (deps[i], "libQt5Core.so.5") == 0) { as_app_add_metadata (AS_APP (app), "X-Kudo-QT5", "", -1); break; } } /* look for ancient toolkits */ for (i = 0; deps != NULL && deps[i] != NULL; i++) { if (g_strcmp0 (deps[i], "libgtk-1.2.so.0") == 0) { cra_app_add_veto (app, "Uses obsolete GTK1 toolkit"); break; } if (g_strcmp0 (deps[i], "libqt-mt.so.3") == 0) { cra_app_add_veto (app, "Uses obsolete QT3 toolkit"); break; } if (g_strcmp0 (deps[i], "liblcms.so.1") == 0) { cra_app_add_veto (app, "Uses obsolete LCMS library"); break; } if (g_strcmp0 (deps[i], "libelektra.so.4") == 0) { cra_app_add_veto (app, "Uses obsolete Elektra library"); break; } if (g_strcmp0 (deps[i], "libXt.so.6") == 0) { cra_app_add_requires_appdata (app, "Uses obsolete X11 toolkit"); break; } if (g_strcmp0 (deps[i], "wine-core") == 0) { cra_app_add_requires_appdata (app, "Uses wine"); break; } } /* has the application been updated in the last year */ releases = as_app_get_releases (AS_APP (app)); for (i = 0; i < releases->len; i++) { release = g_ptr_array_index (releases, i); secs = (g_get_real_time () / G_USEC_PER_SEC) - as_release_get_timestamp (release); days = secs / (60 * 60 * 24); if (days < 365) { as_app_add_metadata (AS_APP (app), "X-Kudo-RecentRelease", "", -1); break; } } /* has there been no upstream version recently */ if (releases->len > 0 && as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_DESKTOP) { release = g_ptr_array_index (releases, 0); secs = (g_get_real_time () / G_USEC_PER_SEC) - as_release_get_timestamp (release); days = secs / (60 * 60 * 24); /* this is just too old for us to care about */ if (days > 365 * 10) { cra_app_add_veto (app, "Dead upstream for %i years", secs / (60 * 60 * 24 * 365)); } /* we need AppData if the app needs saving */ else if (days > 365 * 5) { cra_app_add_requires_appdata (app, "Dead upstream for > %i years", 5); } } /* do any extra screenshots exist */ tmp = cra_package_get_config (pkg, "ScreenshotsExtra"); if (tmp != NULL) { _cleanup_free_ gchar *dirname = NULL; dirname = g_build_filename (tmp, as_app_get_id (AS_APP (app)), NULL); if (g_file_test (dirname, G_FILE_TEST_EXISTS)) { if (!cra_plugin_hardcoded_add_screenshots (app, dirname, error)) return FALSE; } } /* a ConsoleOnly category means we require AppData */ if (as_app_has_category (AS_APP(app), "ConsoleOnly")) cra_app_add_requires_appdata (app, "ConsoleOnly"); /* no categories means we require AppData */ if (as_app_get_categories(AS_APP(app))->len == 0) cra_app_add_requires_appdata (app, "no Categories"); return TRUE; }
/** * asb_plugin_process_app: */ gboolean asb_plugin_process_app (AsbPlugin *plugin, AsbPackage *pkg, AsbApp *app, const gchar *tmpdir, GError **error) { const gchar *tmp; AsRelease *release; GPtrArray *deps; gchar **filelist; GPtrArray *releases; guint i; gint64 secs; guint days; /* add extra categories */ tmp = as_app_get_id (AS_APP (app)); if (g_strcmp0 (tmp, "0install.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "alacarte.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "deja-dup.desktop") == 0) as_app_add_category (AS_APP (app), "Utility", -1); if (g_strcmp0 (tmp, "gddccontrol.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "nautilus.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "pessulus.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "pmdefaults.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "fwfstab.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "bmpanel2cfg.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "wallpapoz.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); if (g_strcmp0 (tmp, "superkaramba.desktop") == 0) as_app_add_category (AS_APP (app), "System", -1); /* add extra project groups */ if (g_strcmp0 (tmp, "nemo.desktop") == 0) as_app_set_project_group (AS_APP (app), "Cinnamon", -1); if (g_strcmp0 (tmp, "xfdashboard.desktop") == 0) as_app_set_project_group (AS_APP (app), "XFCE", -1); /* use the URL to guess the project group */ tmp = asb_package_get_url (pkg); if (as_app_get_project_group (AS_APP (app)) == NULL && tmp != NULL) { tmp = asb_glob_value_search (plugin->priv->project_groups, tmp); if (tmp != NULL) as_app_set_project_group (AS_APP (app), tmp, -1); } /* use summary to guess the project group */ tmp = as_app_get_comment (AS_APP (app), NULL); if (tmp != NULL && g_strstr_len (tmp, -1, "for KDE") != NULL) as_app_set_project_group (AS_APP (app), "KDE", -1); /* look for any installed docs */ filelist = asb_package_get_filelist (pkg); for (i = 0; filelist[i] != NULL; i++) { if (asb_plugin_match_glob ("/usr/share/help/*", filelist[i])) { as_app_add_kudo_kind (AS_APP (app), AS_KUDO_KIND_USER_DOCS); break; } } /* look for a shell search provider */ for (i = 0; filelist[i] != NULL; i++) { if (asb_plugin_match_glob ("/usr/share/gnome-shell/search-providers/*", filelist[i])) { as_app_add_kudo_kind (AS_APP (app), AS_KUDO_KIND_SEARCH_PROVIDER); break; } } /* look for a high contrast icon */ for (i = 0; filelist[i] != NULL; i++) { if (asb_plugin_match_glob ("/usr/share/icons/HighContrast/*", filelist[i])) { as_app_add_kudo_kind (AS_APP (app), AS_KUDO_KIND_HIGH_CONTRAST); break; } if (asb_plugin_match_glob ("/usr/share/icons/hicolor/symbolic/apps/*.svg", filelist[i])) { as_app_add_kudo_kind (AS_APP (app), AS_KUDO_KIND_HIGH_CONTRAST); break; } } /* look for a modern toolkit */ deps = asb_package_get_deps (pkg); for (i = 0; i < deps->len; i++) { tmp = g_ptr_array_index (deps, i); if (g_strcmp0 (tmp, "libgtk-3.so.0") == 0 || g_strcmp0 (tmp, "libQt5Core.so.5") == 0) { as_app_add_kudo_kind (AS_APP (app), AS_KUDO_KIND_MODERN_TOOLKIT); break; } } /* look for ancient toolkits */ for (i = 0; i < deps->len; i++) { tmp = g_ptr_array_index (deps, i); if (g_strcmp0 (tmp, "libgtk-1.2.so.0") == 0) { as_app_add_veto (AS_APP (app), "Uses obsolete GTK1 toolkit"); break; } if (g_strcmp0 (tmp, "libglib-1.2.so.0") == 0) { as_app_add_veto (AS_APP (app), "Uses obsolete GLib library"); break; } if (g_strcmp0 (tmp, "libqt-mt.so.3") == 0) { as_app_add_veto (AS_APP (app), "Uses obsolete QT3 toolkit"); break; } if (g_strcmp0 (tmp, "liblcms.so.1") == 0) { as_app_add_veto (AS_APP (app), "Uses obsolete LCMS library"); break; } if (g_strcmp0 (tmp, "libelektra.so.4") == 0) { as_app_add_veto (AS_APP (app), "Uses obsolete Elektra library"); break; } if (g_strcmp0 (tmp, "libXt.so.6") == 0) { asb_app_add_requires_appdata (app, "Uses obsolete X11 toolkit"); break; } if (g_strcmp0 (tmp, "Xvfb") == 0) { asb_app_add_requires_appdata (app, "Uses obsolete Xvfb"); break; } if (g_strcmp0 (tmp, "wine-core") == 0) { asb_app_add_requires_appdata (app, "Uses wine"); break; } } /* has the application been updated in the last year */ releases = as_app_get_releases (AS_APP (app)); if (asb_context_get_api_version (plugin->ctx) < 0.8) { for (i = 0; i < releases->len; i++) { release = g_ptr_array_index (releases, i); secs = (g_get_real_time () / G_USEC_PER_SEC) - as_release_get_timestamp (release); days = secs / (60 * 60 * 24); if (secs > 0 && days < 365) { as_app_add_metadata (AS_APP (app), "X-Kudo-RecentRelease", "", -1); break; } } } /* has there been no upstream version recently */ if (releases->len > 0 && as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_DESKTOP) { release = g_ptr_array_index (releases, 0); secs = (g_get_real_time () / G_USEC_PER_SEC) - as_release_get_timestamp (release); days = secs / (60 * 60 * 24); /* we need AppData if the app needs saving */ if (secs > 0 && days > 365 * 5) { asb_app_add_requires_appdata (app, "Dead upstream for > %i years", 5); } } /* a ConsoleOnly category means we require AppData */ if (as_app_has_category (AS_APP(app), "ConsoleOnly")) asb_app_add_requires_appdata (app, "ConsoleOnly"); /* no categories means we require AppData */ if (as_app_get_id_kind (AS_APP (app)) == AS_ID_KIND_DESKTOP && as_app_get_categories(AS_APP(app))->len == 0) asb_app_add_requires_appdata (app, "no Categories"); return TRUE; }
static void gs_editor_refresh_details (GsEditor *self) { AsAppKind app_kind = AS_APP_KIND_UNKNOWN; GtkWidget *widget; const gchar *css = NULL; g_autoptr(GError) error = NULL; g_autoptr(GsApp) app = NULL; /* ignore changed events */ self->is_in_refresh = TRUE; /* create a GsApp for the AsApp */ if (self->selected_item != NULL) { app = gs_editor_convert_app (self, self->selected_item); g_debug ("refreshing details for %s", gs_app_get_id (app)); } /* get kind */ if (self->selected_item != NULL) app_kind = as_app_get_kind (self->selected_item); /* feature tiles */ if (app_kind != AS_APP_KIND_OS_UPGRADE) { if (self->selected_item != NULL) { gs_app_tile_set_app (GS_APP_TILE (self->featured_tile1), app); gtk_widget_set_sensitive (self->featured_tile1, TRUE); } else { gtk_widget_set_sensitive (self->featured_tile1, FALSE); } gtk_widget_set_visible (self->featured_tile1, TRUE); } else { gtk_widget_set_visible (self->featured_tile1, FALSE); } /* upgrade banner */ if (app_kind == AS_APP_KIND_OS_UPGRADE) { if (self->selected_item != NULL) { gs_upgrade_banner_set_app (GS_UPGRADE_BANNER (self->upgrade_banner), app); gtk_widget_set_sensitive (self->upgrade_banner, TRUE); } else { gtk_widget_set_sensitive (self->upgrade_banner, FALSE); } gtk_widget_set_visible (self->upgrade_banner, TRUE); } else { gtk_widget_set_visible (self->upgrade_banner, FALSE); } /* name */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "box_name")); if (self->selected_item != NULL) { const gchar *tmp; gtk_widget_set_visible (widget, app_kind == AS_APP_KIND_OS_UPGRADE); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "entry_name")); tmp = as_app_get_name (self->selected_item, NULL); if (tmp != NULL) gtk_entry_set_text (GTK_ENTRY (widget), tmp); } else { gtk_widget_set_visible (widget, FALSE); } /* summary */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "box_summary")); if (self->selected_item != NULL) { const gchar *tmp; gtk_widget_set_visible (widget, app_kind == AS_APP_KIND_OS_UPGRADE); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "entry_summary")); tmp = as_app_get_comment (self->selected_item, NULL); if (tmp != NULL) gtk_entry_set_text (GTK_ENTRY (widget), tmp); } else { gtk_widget_set_visible (widget, FALSE); } /* kudos */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "box_kudos")); if (self->selected_item != NULL) { gtk_widget_set_visible (widget, app_kind != AS_APP_KIND_OS_UPGRADE); } else { gtk_widget_set_visible (widget, TRUE); } /* category featured */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "checkbutton_category_featured")); if (self->selected_item != NULL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), as_app_has_category (self->selected_item, "Featured")); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_widget_set_sensitive (widget, FALSE); } /* kudo popular */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "checkbutton_editors_pick")); if (self->selected_item != NULL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), as_app_has_kudo (self->selected_item, "GnomeSoftware::popular")); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_widget_set_sensitive (widget, FALSE); } /* featured */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "textview_css")); if (self->selected_item != NULL) { GtkTextBuffer *buffer; GtkTextIter iter_end; GtkTextIter iter_start; g_autofree gchar *css_existing = NULL; if (app_kind == AS_APP_KIND_OS_UPGRADE) { css = as_app_get_metadata_item (self->selected_item, "GnomeSoftware::UpgradeBanner-css"); } else { css = as_app_get_metadata_item (self->selected_item, "GnomeSoftware::FeatureTile-css"); } if (css == NULL) css = ""; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); gtk_text_buffer_get_bounds (buffer, &iter_start, &iter_end); css_existing = gtk_text_buffer_get_text (buffer, &iter_start, &iter_end, FALSE); if (g_strcmp0 (css_existing, css) != 0) gtk_text_buffer_set_text (buffer, css, -1); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_widget_set_sensitive (widget, FALSE); } /* desktop ID */ widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "entry_desktop_id")); if (self->selected_item != NULL) { const gchar *id = as_app_get_id (self->selected_item); if (id == NULL) id = ""; gtk_entry_set_text (GTK_ENTRY (widget), id); gtk_widget_set_sensitive (widget, TRUE); } else { gtk_entry_set_text (GTK_ENTRY (widget), ""); gtk_widget_set_sensitive (widget, FALSE); } /* validate CSS */ if (css == NULL) { widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "label_infobar_css")); gtk_label_set_label (GTK_LABEL (widget), ""); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "infobar_css")); gtk_info_bar_set_message_type (GTK_INFO_BAR (widget), GTK_MESSAGE_OTHER); } else if (!gs_design_validate_css (self, css, &error)) { g_autofree gchar *msg = g_strdup (error->message); g_strdelimit (msg, "\n\r<>", '\0'); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "label_infobar_css")); gtk_label_set_label (GTK_LABEL (widget), msg); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "infobar_css")); gtk_info_bar_set_message_type (GTK_INFO_BAR (widget), GTK_MESSAGE_WARNING); } else { widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "label_infobar_css")); gtk_label_set_label (GTK_LABEL (widget), _("CSS validated OK!")); widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "infobar_css")); gtk_info_bar_set_message_type (GTK_INFO_BAR (widget), GTK_MESSAGE_OTHER); } /* do not ignore changed events */ self->is_in_refresh = FALSE; }
/** * asb_plugin_process_filename: */ static gboolean asb_plugin_process_filename (AsbPlugin *plugin, AsbPackage *pkg, const gchar *filename, GList **apps, const gchar *tmpdir, GError **error) { AsIcon *icon; AsAppParseFlags parse_flags = AS_APP_PARSE_FLAG_USE_HEURISTICS; gboolean ret; _cleanup_free_ gchar *app_id = NULL; _cleanup_free_ gchar *full_filename = NULL; _cleanup_object_unref_ AsbApp *app = NULL; _cleanup_object_unref_ GdkPixbuf *pixbuf = NULL; /* use GenericName fallback */ if (asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_USE_FALLBACKS)) parse_flags |= AS_APP_PARSE_FLAG_USE_FALLBACKS; /* create app */ app_id = g_path_get_basename (filename); app = asb_app_new (pkg, app_id); asb_app_set_hidpi_enabled (app, asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_HIDPI_ICONS)); full_filename = g_build_filename (tmpdir, filename, NULL); if (!as_app_parse_file (AS_APP (app), full_filename, parse_flags, error)) return FALSE; /* NoDisplay apps are never included */ if (as_app_get_metadata_item (AS_APP (app), "NoDisplay") != NULL) asb_app_add_requires_appdata (app, "NoDisplay=true"); /* Settings or DesktopSettings requires AppData */ if (!asb_context_get_flag (plugin->ctx, ASB_CONTEXT_FLAG_IGNORE_SETTINGS)) { if (as_app_has_category (AS_APP (app), "Settings")) asb_app_add_requires_appdata (app, "Category=Settings"); if (as_app_has_category (AS_APP (app), "DesktopSettings")) asb_app_add_requires_appdata (app, "Category=DesktopSettings"); } /* is the icon a stock-icon-name? */ icon = as_app_get_icon_default (AS_APP (app)); if (icon != NULL) { _cleanup_free_ gchar *key = NULL; key = g_strdup (as_icon_get_name (icon)); if (as_icon_get_kind (icon) == AS_ICON_KIND_STOCK) { asb_package_log (pkg, ASB_PACKAGE_LOG_LEVEL_DEBUG, "using stock icon %s", key); } else { _cleanup_error_free_ GError *error_local = NULL; g_ptr_array_set_size (as_app_get_icons (AS_APP (app)), 0); ret = asb_plugin_desktop_add_icons (plugin, app, tmpdir, key, &error_local); if (!ret) { as_app_add_veto (AS_APP (app), "%s", error_local->message); } } } /* add */ asb_plugin_add_app (apps, AS_APP (app)); return TRUE; }