sabato 9 novembre 2013

Tutorial GTK+ 3.0 - Parte 2 - Hello World!

Nella lunga tradizione dei linguaggi di programmazione e librerie, ecco a voi il famoso Hello World in GTK+:
#include <gtk/gtk.h>

/* Questa è una funzione di callback. Gli argomenti da riga di comando
 * vengono ignorati in questo esempio. Se ne parlerà più avanti di queste funzioni.
 */
static void print_hello (GtkWidget *widget, gpointer   data){
  g_print ("Hello World\n");
}

static gboolean on_delete_event (GtkWidget *widget, GdkEvent  *event, gpointer   data){
  /* Se il valore di ritorno è FALSE nel segnale "delete_event",
   * GTK lancierà il segnale "destroy". Ritornare TRUE vuol dire che
   * non vuoi che la finestra venga distrutta.
   *
   * Ciò è utile per chiedere all'utente 'sei sicuro di volere uscire?'
   */

  g_print ("Si è verificato l'evento \"delete\"\n");
  return TRUE;
}

int main (int   argc, char *argv[]){
  /* GtkWidget è il tipo base per tutti i widgets */
  GtkWidget *window;
  GtkWidget *button;

  /* Questa viene chiamata in tutti i programmi GTK. Gli argomenti 
   * vengono presi dalla linea di comando e resi disponibile per l'applicazione 
   */
  gtk_init (&argc, &argv);

  /* Crea una nuova finestra, e imposta il titolo */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Hello");

  /* Quando la finestra lancia il segnale "delete-event"(emesso 
   * dal GTK+ in risposta a un evento proveniente dal window manager,
   * solitamente cliccando il tasto "chiudi" della finestra), 
   * chiediamo a essa di eseguire la funzione on_delete_event() definita sopra.
   *
   * I dati passati alla funzione di callback sono NULL e sono ignorati
   * dalla funzione di callback.
   */
  g_signal_connect (window, "delete-event", G_CALLBACK (on_delete_event), NULL);

  /* Qui colleghiamo l'evento "destroy" alla funzone gtk_main_quit().
   *
   * Questo segnale viene emesso quando chiamiamo gtk_widget_destroy() sulla
   * finestra, o se ritorniamo FALSE nella funzione callback "delete_event".
   */
  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

  /* Imposta i bordi della finestra. */
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  /* Crea un tasto con la scritta "Hello World". */
  button = gtk_button_new_with_label ("Hello World");

  /* Quando il tasto riceve il segnale "clicked", esso chiamerà la
   * funzione print_hello() passando NULL come argomento.
   *
   * La funzione print_hello() è definita sopra.
   */
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);

  /* La funzione g_signal_connect_swapped() collegherà il segnale "clicked"
   * del tasto alla funzione gtk_widget_destroy(); invece di chiamarla 
   * direttamente usando il tasto come suo argomento, questa funzione manderà 
   * a essa gli argomenti user_data. Questo causerà la distruszione della 
   * finestra chiamando gtk_widget_destroy() sulla finestra.
   */
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);

  /* Questo "impacchetterà" il tasto nella finestra. GtkWindow eredita da  GtkBin,
   * il quale è uno speciale contenitore avente solamente un figlio
   */
  gtk_container_add (GTK_CONTAINER (window), button);

  /* Il passo finale è mostrare il widget appena creato... */
  gtk_widget_show (button);

  /* ...e la finestra */
  gtk_widget_show (window);

  /* Tutte le applicazioni GTK+ devono avere un gtk_main(). Il controllo finisce qui
   * e rimane in attesa di un qualche evento (come la pressione di un tasto
   * o un evento del mouse) fintantoché gtk_main_quit() viene invocato.
   */
  gtk_main ();

  return 0;
}
                              Parte 2 - Packing >>>

1 commento: