Scrivere un’applicazione in C con le GTK (Seconda parte)

Dopo una lunga attesa, ecco una nuova puntata del mio breve tutorial alla programmazione con le GTK+! Cercherò di offrirvi una panoramica sufficientemente completa sull’aspetto più importante della programmazione con le librerie GTK+: come associare delle funzioni (dette callbacks) agli eventi scatenati dai widget dell’interfaccia.

Innanzitutto ecco una schermata della nuova interfaccia della nostra piccola applicazione, sicuramente migliore di quella precedente:

La gestione degli eventi

Non mi dilungherò sulla “theory of signals and callbacks“, è un argomento molto complesso che esula dagli scopi di questo articolo, preferisco mostrare il funzionamento del sistema attraverso degli esempi pratici.

Nella funzione create_window(), all’interno del sorgente principale main.c, c’è una riga di codice, accompagnata da un commento che ne sottolinea, giustamente, l’importanza:

/* This is important */

glade_xml_signal_autoconnect (gxml);

Per capire il perchè di tale commento basta leggere cosa dice la documentazione a riguardo:

This function is a variation of glade_xml_signal_connect. It uses gmodule’s introspective features (by openning the module NULL) to look at the application’s symbol table. From here it tries to match the signal handler names given in the interface description with symbols in the application and connects the signals.

Libglade Reference Manual

Ciò significa che, mentre la funzione glade_xml_signal_connect() necessita di essere invocata per ogni evento, glade_xml_signal_autoconnect() rappresenta una soluzione automatica più elegante per legare tutti gli eventi scatenati da un widget ai gestori degli stessi.

Apriamo nuovamente il file dell’interfaccia e selezioniamo il pulsante «OK», dunque facciamo clic su «Proprietà»: in «Generale» e assegniamogli un nome secondo le nostre convenzioni preferite (io l’ho chiamato «button_ok»), infine apriamo la scheda «Segnali» e associamo al segnale «clicked» il nome di una callback che andremo a definire (il mio consiglio è di scegliere uno dei nomi presenti nell’elenco di default). Ecco una schermata:

Come assegnare la callback al segnale del widget

Ora possiamo definire il gestore nel file header callbacks.h:

void on_button_on_clicked(GtkWidget * widget, gpointer data);

Prima di implementare la funzione vi mostro quella che, solitamente, è una forma generic per le funzioni callback:

void callback_func( GtkWidget *widget,

… /* altri argomenti del segnale */

gpointer callback_data );

Il primo argomento è un puntatore al widget (finestra, pulsante, casella di testo, quello-che-è) responsabile dell’emissione del segnale (eggià, si dice proprio così…), l’ultimo è un puntatore alle informazioni passate in g_signal_connect() (se utilizzata).

Prestate attenzione al fatto che non tutte le callbacks hanno la stessa forma (i parametri dipendono dal tipo di segnale), alcune hanno delle forme molto differenti da quella mostrata nel precedente esempio.

Page 1 of 3 | Next page