Strumenti Utente

Strumenti Sito


Barra laterale

programmazione:gio:gresource

Gresource

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.

File xml

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>

Generiamo il file delle risorse

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

Sorgente che usera' le risorse

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;
}

Il makefile

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

Mostrare un'immagine contenuta nelle risorse

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;
}

Il makefile

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

programmazione/gio/gresource.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)