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: Creazione automatica dello scheletro per applicazioni gtkbuilder (in basso).
Come visto nell'articolo 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
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/org/myapp/res"> <file>gui.xml</file> </gresource> </gresources>
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 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
main.c
#include <gtk/gtk.h> //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; }
Il nostro wiki installa solamente cookie tecnici necessari al funzionamento della piattaforma "Dokuwiki". Niente analitics, statistiche, tracciamenti o altro.