====== Mettere il file della gui creata con glade dentro l'eseguibile ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//28/05/2015 - 10:46//** \\ \\
Vedremo come creare un eseguibile gtk+2 con al suo interno anche il file di glade contenente xml per creare la nostra gui. Puo' essere utile nel caso volessimo distribuire il nostro eseguibile senza creare pacchetti di installazione. \\
Uno script che automatizza il tutto è disponibile qui: [[programmazione:gtk:creazione_scheletro_per_applicazioni_gtkbuilder]] (in basso). \\
===== File per le risorse =====
Come visto nell'articolo [[programmazione:gio:gresource]] per inglobare le nostre risorse all'interno dell'eseguibile abbiamo bisogno di un file che specifichi come creare il file delle risorse stesso. Dunque ecco il nostro: \\
**resource.xml**
gui.xml
===== Makefile =====
CPP = gcc
OPTS = `pkg-config --cflags --libs gio-2.0 gtk+-2.0 gmodule-2.0`
all:
glib-compile-resources --generate-source resource.xml
$(CPP) resource.c main.c -o main $(OPTS)
clean:
rm main
==== Makefile per windows ====
Makefile per la crosscompilazione windows. Installare MXE.
CPP = i686-pc-mingw32-gcc
OPTS = `i686-pc-mingw32-pkg-config --cflags --libs gio-2.0 gtk+-2.0 gmodule-2.0`
all:
glib-compile-resources --generate-source resource.xml
$(CPP) resource.c main.c -o main.exe $(OPTS)
strip main.exe
clean:
rm main.exe
===== Il codice =====
**main.c**
#include //includo le librerie gtk e glade.
GtkBuilder *xml; //questo è il puntatore al file xml che contiene l'interfaccia
GtkWidget *widget; //questa variabile serve per recuperare di volta in volta il
// widget (ovvero l'oggetto ) che vogliamo usare
void on_MainWindow_delete_event(GtkWidget *widget, gpointer user_data) //altra callback associata alla chiusura della
{ // finestra
gtk_main_quit();
}
int
main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
GError* error = NULL;
gchar* glade_file = g_build_filename(g_get_tmp_dir(),"gui.xml", NULL);;
// Copio il file dalla gui dalle risorse a una cartella temporanea
// (le gtk+2 non possono caricare direttamente il file).
GFile* mySRC = g_file_new_for_uri("resource:///org/myapp/res/gui.xml");
GFile* myDEST = g_file_new_for_path(glade_file);
g_file_copy (mySRC, myDEST, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error);
/*Infine carica come disolito il file dell'interfaccia */
xml = gtk_builder_new ();
if (!gtk_builder_add_from_file (xml, glade_file, &error))
{
g_warning ("Couldn't load builder file: %s", error->message);
g_error_free (error);
}
/* connette tutti gli eventi dei widget alle rispettive funzioni */
gtk_builder_connect_signals (xml, NULL);
/* Avvia il ciclo principale delle gtAvvia il ciclo principale delle gtk*/
gtk_main ();
return 0;
}