Autore: Fabio Di Matteo
Ultima revisione: 19/03/2015 - 16:39
Gresource permette di includere risorse(immagini, video, testo, xml e ogni altro tipo di file) all'interno del nostro progetto gtk. Ovvero includere tutte le risorse dentro il nostro binario.
Per prima cosa dobbiamo creare un file xml con l'elenco e le opzioni per i file che vogliamo includere nel nostro file di risorse. Successivamente il file di risorse verra' inglobato (in fase di linking) al nostro binario.
Questo file contiene l'elenco e le opzioni per i file che vogliamo includere nel nostro file di risorse.
risorse.xml
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/org/myapp/risorse"> <file>foto.jpg</file> <file>faccia.png</file> <file compressed="true">documento.html</file> <file preprocess="xml-stripblanks">mygui.xml</file> </gresource> </gresources>
Il comando seguente genera un file sorgente C con dentro le nostre risorse. In seguito verra' indicato nel makefile per essere incluso nell'eseguibile.
glib-compile-resources --generate-source risorse.xml
Il seguente sorgente non fara' altro che estrarre alcuni file dal file delle risorse sul desktop.
main.c
#include <gio/gio.h> int main (int argc, char **argv) { //Inizializzo i tipi di glib //g_type_init(); //(deprecato, solo per le vecchie versioni di glib) //Una varibile per gli eventuali errori GError *error=NULL; //Uri del Gfile sorgente(mySRC) e uri del Gfile di destinazione (myDEST) GFile* mySRC = g_file_new_for_uri("resource:///org/myapp/risorse/faccia.png"); GFile* myDEST = g_file_new_for_uri("file:///home/fabio/Desktop/faccia.png"); //Copio il file con questa semplice funzione g_file_copy (mySRC, myDEST, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error); //Verifico se ci sono stati errori e stampo dei messaggi if (error!=NULL) { g_error("Attenzione errore nella copia: %s\n",error->message); }else{ g_print("Copia eseguita correttamente.\n") ; } return 0; }
Si presti attenzione alla riga 5. Abbiamo incluso il file risorse.c
con le risorse trasformate in sorgente C.
CPP = gcc OPTS = `pkg-config --cflags --libs gio-2.0` all: $(CPP) risorse.c main.c -o gio-resource $(OPTS) clean: rm gio-resource
Di seguito il codice gtk+3 per mostrare un'immagine contenuta dentro le nostre risorse.
#include <gio/gio.h> #include <gtk/gtk.h> int main (int argc, char **argv) { //Inizializzo i tipi di glib (deprecato con gtk3) //g_type_init(); GtkWidget *window; GtkWidget *myimage; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (window, "delete_event", gtk_main_quit, NULL); myimage=gtk_image_new_from_resource ("/org/myapp/risorse/faccia.png"); gtk_container_add (GTK_CONTAINER (window), myimage); gtk_widget_show (myimage); gtk_widget_show (window); gtk_main (); return 0; }
Come si puo' vedere stiamo usando gio-2 e gtk+-3. Per il resto è uguale al primo makefile.
CPP = gcc OPTS = `pkg-config --cflags --libs gio-2.0 gtk+-3.0` all: $(CPP) risorse.c main.c -o gtk-resource $(OPTS) clean: rm gtk-resource
Il nostro wiki installa solamente cookie tecnici necessari al funzionamento della piattaforma "Dokuwiki". Niente analitics, statistiche, tracciamenti o altro.