====== 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