Barra laterale

programmazione:gtk:organizzare_un_progetto_gtk

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:

filedescrizione
main.cche conterra la main C
globals.ctutte le variabili globali. In questo caso il solo riferimento al puntatore del gtkBuilder
win1.ccodice prima finestra
win2.ccodice seconda finestra

main.c

#include <gtk/gtk.h>                                                
 
#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 <gtk/gtk.h>    
#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 <gtk/gtk.h>    
#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);
 
}

programmazione/gtk/organizzare_un_progetto_gtk.txt · Ultima modifica: 28/04/2023 - 09:26 da Fabio Di Matteo