====== Distribuire applicazioni Gtk+-3.x con MSYS2 ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//10/02/2017 - 10:54//** \\ \\
[[http://www.msys2.org/|MSYS2]] è una distribuzione software e piattaforma di sviluppo per Windows. Tramite Msys2 è possibile installare su windows un'ambiente di "tipo Unix" con bash, gcc, e tutti gli altri strumenti e librerie tipiche di questo ambiente. \\
Sara' così abbastanza comodo fare il porting delle nostre applicazioni per GNU/Linux.
===== Installiamo le dipendenze =====
Avviamo dal menu di windows MSYS2 mingw 32 bit o 64 bit.
Per compilare le nostre applicazioni Gtk si devono installare le dipendenze necessarie su msys2. Per far questo si usa pacman:
pacman -S mingw-w64-i686-gtk3 make gcc
Fatto cio' dovremmo gia' avere tutto l'occorrente per compilare la nostra app.
===== La nostra applicazioni di prova =====
**main.c**
#include
void
info_message(GtkWidget *main_window,gchar* title, gchar *msg, gchar* winlabel)
{
GtkWidget *dialog;
title=g_strdup_printf("%s", title);
dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (main_window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
title);
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s",(gchar *)msg);
gtk_window_set_title(GTK_WINDOW(dialog),winlabel);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
gint
info_YesNo(GtkWidget *main_window,gchar* title, gchar *msg, gchar* winlabel)
{
GtkWidget *dialog;
gint result;
title=g_strdup_printf("%s", title);
dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (main_window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_YES_NO,
title);
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s",(gchar *)msg);
gtk_window_set_title(GTK_WINDOW(dialog),winlabel);
result = gtk_dialog_run (GTK_DIALOG (dialog));
switch (result)
{
case GTK_RESPONSE_YES:
result=GTK_RESPONSE_YES ;
break;
case GTK_RESPONSE_NO:
result=GTK_RESPONSE_NO ;
break;
default:
result=GTK_RESPONSE_DELETE_EVENT;
break;
}
gtk_widget_destroy (dialog);
return result;
}
void
err_message(GtkWidget *main_window,gchar* title, gchar *msg, gchar* winlabel)
{
GtkWidget *dialog;
title=g_strdup_printf("%s", title);
dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (main_window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,title);
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
"%s",(gchar *)msg);
gtk_window_set_title(GTK_WINDOW(dialog),winlabel);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
static void
print_hello (GtkWidget *widget,
gpointer data)
{
g_print ("Hello World\n");
gchar* txt="Buon giorno a tutti";
info_message(NULL,"Ciao",txt, "Ciao Mondo!");
}
static void
activate (GtkApplication *app,
gpointer user_data)
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *button_box;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
gtk_container_add (GTK_CONTAINER (window), button_box);
button = gtk_button_new_with_label ("Hello World");
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
//g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
gtk_container_add (GTK_CONTAINER (button_box), button);
gtk_widget_show_all (window);
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
**makefile**
all:
gcc -o TEST.exe main.c `pkg-config --cflags --libs gtk+-3.0` -mwindows -mms-bitfields
Adesso compiliamo con ''make'' ed eseguiamo con ./TEST
===== Distribuire il nostro programma =====
Per far si che il nostro programma si avvii' correttamente anche al di fuori di MSYS2 in computer dove non è mai stato installato MSYS2 doppiamo creare una cartella con dentro il nostro programma e tutte le dipendenze dello stesso.
Procediamo lanciando il comando
ldd TEST.exe
che mostrera' l'elenco delle librerie dinamiche alle quali è collegato il nostro eseguibile. Non ci resta che copiare tutte queste librerie ,escluse quelle contenute in /c/windows e altri percorsi esterni a MSYS2, nella nostra cartella. \\
Ecco come apparitra' la nostra cartella :
drwxr-xr-x 1 Admin 0 10 feb 08.37 etc
drwxr-xr-x 1 Admin 0 10 feb 09.20 share
-rwxr-xr-x 1 Admin 95046 10 feb 08.16 zlib1.dll
-rwxr-xr-x 1 Admin 59931 10 feb 08.33 TEST.exe
-rwxr-xr-x 1 Admin 110334 10 feb 08.25 msys-gcc_s-1.dll
-rwxr-xr-x 1 Admin 3432037 10 feb 08.26 msys-2.0.dll
-rwxr-xr-x 1 Admin 65181 10 feb 08.12 libwinpthread-1.dll
-rwxr-xr-x 1 Admin 1544989 10 feb 08.21 libstdc++-6.dll
-rwxr-xr-x 1 Admin 249805 10 feb 08.21 libpng16-16.dll
-rwxr-xr-x 1 Admin 706136 10 feb 08.22 libpixman-1-0.dll
-rwxr-xr-x 1 Admin 287661 10 feb 08.15 libpcre-1.dll
-rwxr-xr-x 1 Admin 101544 10 feb 08.24 libpangowin32-1.0-0.dll
-rwxr-xr-x 1 Admin 92019 10 feb 08.24 libpangoft2-1.0-0.dll
-rwxr-xr-x 1 Admin 64724 10 feb 08.24 libpangocairo-1.0-0.dll
-rwxr-xr-x 1 Admin 259014 10 feb 08.23 libpango-1.0-0.dll
-rwxr-xr-x 1 Admin 140201 10 feb 08.14 libintl-8.dll
-rwxr-xr-x 1 Admin 1055929 10 feb 08.14 libiconv-2.dll
-rwxr-xr-x 1 Admin 424567 10 feb 08.20 libharfbuzz-0.dll
-rwxr-xr-x 1 Admin 7358678 10 feb 08.17 libgtk-3-0.dll
-rwxr-xr-x 1 Admin 237080 10 feb 08.21 libgraphite2.dll
-rwxr-xr-x 1 Admin 337171 10 feb 08.15 libgobject-2.0-0.dll
-rwxr-xr-x 1 Admin 26562 10 feb 08.11 libgmodule-2.0-0.dll
-rwxr-xr-x 1 Admin 1222159 10 feb 08.11 libglib-2.0-0.dll
-rwxr-xr-x 1 Admin 1606715 10 feb 08.10 libgio-2.0-0.dll
-rwxr-xr-x 1 Admin 1258774 10 feb 08.17 libgdk-3-0.dll
-rwxr-xr-x 1 Admin 182124 10 feb 08.22 libgdk_pixbuf-2.0-0.dll
-rwxr-xr-x 1 Admin 122036 10 feb 08.14 libgcc_s_dw2-1.dll
-rwxr-xr-x 1 Admin 677515 10 feb 08.19 libfreetype-6.dll
-rwxr-xr-x 1 Admin 330911 10 feb 08.18 libfontconfig-1.dll
-rwxr-xr-x 1 Admin 34874 10 feb 08.16 libffi-6.dll
-rwxr-xr-x 1 Admin 172915 10 feb 08.19 libexpat-1.dll
-rwxr-xr-x 1 Admin 1687656 10 feb 08.22 libepoxy-0.dll
-rwxr-xr-x 1 Admin 34476 10 feb 08.18 libcairo-gobject-2.dll
-rwxr-xr-x 1 Admin 1083946 10 feb 08.18 libcairo-2.dll
-rwxr-xr-x 1 Admin 76571 10 feb 08.20 libbz2-1.dll
-rwxr-xr-x 1 Admin 142619 10 feb 08.25 libatk-1.0-0.dll
===== Copiare icone =====
Per rendere piu' accattivante la nostra applicazione possiamo copiare la cartella delle icone da **C:\msys32\mingw32\share\icons\Adwaita\** a ** [percorso di TEST.exe]\share\icons\ **
===== Abilitare i temi =====
Potremmo anche avere bisogno di abilitare i temi o magari aggiungerne altri. Per far cio' creiamo il file ** [percorso di TEST.exe]\etc\gtk-3.0\settings.ini **. Se vogliamo abilitare il tema built-in win32 basta aggiungere a settings il seguente contenuto:
[Settings]
gtk-theme-name=win32