====== Organizzare un progetto in C e Gtk+3 ====== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **// 27/04/2023 - 14:26 //** // // L'obbiettivo di questa piccola esperienza รจ cercare di rendere ordinato e leggibile il codice di un'applicazione gtk+.Alle volte il numero delle finestre cresce e il codice finisce per ingarbugliarsi un pochino. In pratica ho cercato di suddividere la logica della piccola applicazione in oggetto in piu' file. In modo tale da avere il codice di ogni finestra in un singolo file. Avremo nella nostra struttura del progetto principalmente 4 file (le finestre sono solo 2). Ovvero: ^file^descrizione^ |main.c|che conterra la main C | |globals.c|tutte le variabili globali. In questo caso il solo riferimento al puntatore del gtkBuilder| |win1.c|codice prima finestra| |win2.c|codice seconda finestra| ===== main.c ===== #include #include "globals.c" #include "win1.c" int main (int argc, char *argv[]) { gtk_init (&argc, &argv); initWindow1(); gtk_main (); return 0; } **initWindow1()** (contenuta in win1.c) disegna e inizializza la finestra principale. Analogamente per la seconda finestra abbiamo **initWindow2()** (contenuta in win2.c) ===== globals.c ===== GtkBuilder *xml; ===== win1.c ===== #include #include "globals.c" #include "win2.c" extern GtkBuilder *xml; void initWindow1() { GError* error = NULL; xml = gtk_builder_new (); if (!gtk_builder_add_from_resource (xml, "/org/myapp/res/gui.ui", &error)) { g_warning ("Couldn\'t load builder file: %s", error->message); g_error_free (error); } GObject* window1=gtk_builder_get_object (xml,"window1"); GObject* button12=gtk_builder_get_object (xml,"button12"); initWindow2(); g_signal_connect (button12, "clicked", G_CALLBACK (showWindow2),NULL); g_signal_connect (window1, "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_window_present(GTK_WINDOW(window1)); } ===== win2.c ===== #include #include "globals.c" extern GtkBuilder *xml; GObject* window2, *button2, *label1, *entry2; static void showWindow2(GtkWidget *widget,gpointer data) { gtk_window_present(GTK_WINDOW(window2)); } static void hideWindow2(GtkWidget *widget,gpointer data) { gtk_widget_hide(GTK_WIDGET(window2)); char* txt=g_strdup_printf("From second window: %s", gtk_entry_get_text(GTK_ENTRY(entry2))); gtk_label_set_text(GTK_LABEL(label1),txt); } void initWindow2() { window2=gtk_builder_get_object (xml,"window2"); button2=gtk_builder_get_object (xml,"button2"); label1=gtk_builder_get_object (xml,"label1"); entry2=gtk_builder_get_object (xml,"entry2"); g_signal_connect (window2, "delete-event", G_CALLBACK (hideWindow2), NULL); g_signal_connect (button2, "clicked", G_CALLBACK (hideWindow2), NULL); }