void ghb_load_icons() { #if GTK_CHECK_VERSION(3, 14, 0) ghb_icons_register_resource(); gtk_icon_theme_add_resource_path(gtk_icon_theme_get_default(), "/fr/handbrake/ghb/icons"); #else ghb_icons_register_resource(); GResource *icon_res = ghb_icons_get_resource(); char ** children = g_resource_enumerate_children(icon_res, "/fr/handbrake/ghb/icons/scalable/apps", 0, NULL); if (children == NULL) { g_warning("No icons in resources!"); return; } int ii; for (ii = 0; children[ii] != NULL; ii++) { char * path; path = g_strdup_printf("/fr/handbrake/ghb/icons/scalable/apps/%s", children[ii]); GBytes *gbytes = g_resource_lookup_data(icon_res, path, 0, NULL); gsize data_size; gconstpointer data = g_bytes_get_data(gbytes, &data_size); g_free(path); char *pos; char *name = g_strdup(children[ii]); pos = g_strstr_len(name, -1, "."); if (pos != NULL) *pos = '\0'; int jj; int sizes[] = {16, 22, 24, 32, 48, 64, 128, 256, 0}; for (jj = 0; sizes[jj]; jj++) { GdkPixbuf *pb; GInputStream *gis; int size; gis = g_memory_input_stream_new_from_data(data, data_size, NULL); pb = gdk_pixbuf_new_from_stream_at_scale(gis, sizes[jj], sizes[jj], TRUE, NULL, NULL); g_input_stream_close(gis, NULL, NULL); size = gdk_pixbuf_get_height(pb); gtk_icon_theme_add_builtin_icon(name, size, pb); g_object_unref(pb); } g_bytes_unref(gbytes); } g_strfreev(children); #endif }
/** * as_utils_is_desktop_environment: * @desktop: a desktop environment id. * * Searches the known list of desktop environments AppStream * knows about. * * Returns: %TRUE if the desktop-id is valid * * Since: 0.10.0 **/ gboolean as_utils_is_desktop_environment (const gchar *desktop) { g_autoptr(GBytes) data = NULL; g_autofree gchar *key = NULL; /* load the readonly data section and look for the TLD */ data = g_resource_lookup_data (as_get_resource (), "/org/freedesktop/appstream/desktop-environments.txt", G_RESOURCE_LOOKUP_FLAGS_NONE, NULL); if (data == NULL) return FALSE; key = g_strdup_printf ("\n%s\n", desktop); return g_strstr_len (g_bytes_get_data (data, NULL), -1, key) != NULL; }
static void extract_resource (GResource *resource, const gchar *path) { GBytes *bytes; bytes = g_resource_lookup_data (resource, path, 0, NULL); if (bytes != NULL) { gconstpointer data; gsize size, written; data = g_bytes_get_data (bytes, &size); written = fwrite (data, 1, size, stdout); if (written < size) g_printerr ("Data truncated\n"); g_bytes_unref (bytes); } }
/** * g_resources_lookup_data: * @path: A pathname inside the resource * @lookup_flags: A #GResourceLookupFlags * @error: return location for a #GError, or %NULL * * Looks for a file at the specified @path in the set of * globally registered resources and returns a #GBytes that * lets you directly access the data in memory. * * The data is always followed by a zero byte, so you * can safely use the data as a C string. However, that byte * is not included in the size of the GBytes. * * For uncompressed resource files this is a pointer directly into * the resource bundle, which is typically in some readonly data section * in the program binary. For compressed files we allocate memory on * the heap and automatically uncompress the data. * * @lookup_flags controls the behaviour of the lookup. * * Returns: (transfer full): #GBytes or %NULL on error. * Free the returned object with g_bytes_unref() * * Since: 2.32 **/ GBytes * g_resources_lookup_data (const gchar *path, GResourceLookupFlags lookup_flags, GError **error) { GBytes *res = NULL; GList *l; GBytes *data; register_lazy_static_resources (); g_rw_lock_reader_lock (&resources_lock); for (l = registered_resources; l != NULL; l = l->next) { GResource *r = l->data; GError *my_error = NULL; data = g_resource_lookup_data (r, path, lookup_flags, &my_error); if (data == NULL && g_error_matches (my_error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND)) { g_clear_error (&my_error); } else { if (data == NULL) g_propagate_error (error, my_error); res = data; break; } } if (l == NULL) g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, _("The resource at '%s' does not exist"), path); g_rw_lock_reader_unlock (&resources_lock); return res; }
/** * as_utils_is_category_id: * @category_name: an XDG category name, e.g. "ProjectManagement" * * Searches the known list of registered XDG category names. * See https://specifications.freedesktop.org/menu-spec/menu-spec-1.0.html#category-registry * for a reference. * * Returns: %TRUE if the category name is valid * * Since: 0.9.7 **/ gboolean as_utils_is_category_name (const gchar *category_name) { g_autoptr(GBytes) data = NULL; g_autofree gchar *key = NULL; /* custom spec-extensions are generally valid if prefixed correctly */ if (g_str_has_prefix (category_name, "X-")) return TRUE; /* load the readonly data section and look for the category name */ data = g_resource_lookup_data (as_get_resource (), "/org/freedesktop/appstream/xdg-category-names.txt", G_RESOURCE_LOOKUP_FLAGS_NONE, NULL); if (data == NULL) return FALSE; key = g_strdup_printf ("\n%s\n", category_name); return g_strstr_len (g_bytes_get_data (data, NULL), -1, key) != NULL; }
GtkBuilder* create_builder_or_die(const gchar * name) { guint res = 0; GError *error = NULL; const gchar *ghb_ui; gsize data_size; ghb_ui_register_resource(); GResource *ui_res = ghb_ui_get_resource(); GBytes *gbytes = g_resource_lookup_data(ui_res, "/org/handbrake/ui/ghb.ui", 0, NULL); ghb_ui = g_bytes_get_data(gbytes, &data_size); const gchar *markup = N_("<b><big>Unable to create %s.</big></b>\n" "\n" "Internal error. Could not parse UI description.\n" "%s"); g_debug("create_builder_or_die()\n"); GtkBuilder *xml = gtk_builder_new(); if (xml != NULL) res = gtk_builder_add_from_string(xml, ghb_ui, -1, &error); if (!xml || !res) { GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, gettext(markup), name, error->message); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); exit(EXIT_FAILURE); } return xml; }