Indice

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: Creazione automatica dello scheletro per applicazioni gtkbuilder (in basso).

File per le risorse

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>

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