/** * gs_plugin_refine_app_category: */ static void gs_plugin_refine_app_category (GsPlugin *plugin, GsApp *app, const MenuSpecData *cat) { const gchar *menu_path[] = { NULL, NULL, NULL }; const MenuSpecData *msdata; gboolean ret = FALSE; gchar *tmp; guint i; /* find a sub-level category the app has */ msdata = menu_spec_get_data (); for (i = 0; msdata[i].path != NULL; i++) { tmp = g_strstr_len (msdata[i].path, -1, "::"); if (tmp == NULL) continue; if (!g_str_has_prefix (msdata[i].path, cat->path)) continue; ret = gs_app_has_category (app, tmp + 2); if (ret) { g_autofree gchar *msgctxt = NULL; msgctxt = g_strdup_printf ("Menu subcategory of %s", cat->text); menu_path[1] = g_dpgettext2 (GETTEXT_PACKAGE, msgctxt, msdata[i].text); break; } } /* the top-level category always exists */ menu_path[0] = gettext (cat->text); gs_app_set_menu_path (app, (gchar **) menu_path); }
/** * gs_plugin_refine: */ gboolean gs_plugin_refine (GsPlugin *plugin, GList **list, GsPluginRefineFlags flags, GCancellable *cancellable, GError **error) { GList *l; GsApp *app; const gchar *EMPTY[] = { "", NULL }; /* nothing to do here */ if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_MENU_PATH) == 0) return TRUE; for (l = *list; l != NULL; l = l->next) { app = GS_APP (l->data); if (gs_app_get_menu_path (app) == NULL) { if (!gs_plugin_refine_app (plugin, app)) { /* don't keep searching for this */ gs_app_set_menu_path (app, (gchar **) EMPTY); } } } return TRUE; }
/* adds the menu-path for applications */ gboolean gs_plugin_refine_app (GsPlugin *plugin, GsApp *app, GsPluginRefineFlags flags, GCancellable *cancellable, GError **error) { const gchar *strv[] = { "", NULL, NULL }; const GsDesktopData *msdata; gboolean found = FALSE; guint i, j, k; /* nothing to do here */ if ((flags & GS_PLUGIN_REFINE_FLAGS_REQUIRE_MENU_PATH) == 0) return TRUE; if (gs_app_get_menu_path (app) != NULL) return TRUE; /* find a top level category the app has */ msdata = gs_desktop_get_data (); for (i = 0; !found && msdata[i].id != NULL; i++) { const GsDesktopData *data = &msdata[i]; for (j = 0; !found && data->mapping[j].id != NULL; j++) { const GsDesktopMap *map = &data->mapping[j]; if (g_strcmp0 (map->id, "all") == 0) continue; if (g_strcmp0 (map->id, "featured") == 0) continue; for (k = 0; !found && map->fdo_cats[k] != NULL; k++) { const gchar *tmp = msdata[i].mapping[j].fdo_cats[k]; if (_gs_app_has_desktop_group (app, tmp)) { strv[0] = msdata[i].name; strv[1] = msdata[i].mapping[j].name; found = TRUE; break; } } } } /* always set something to avoid keep searching for this */ gs_app_set_menu_path (app, (gchar **) strv); return TRUE; }