Home > Guide veloci, programmazione > Guida Gtk+ a puntate ( IV parte )

Guida Gtk+ a puntate ( IV parte )

Inizia la quarta puntata, preparatevi i pop corn, lattine di opencola ( :) ), compilatori, shell e tutto il resto. Oggi finiremo la terza puntata che avevo lasciato in sospeso altrimenti diventava poi troppo lunga.

Mettetevi comodi, e iniziamo!

Ora che abbiamo spiegato un po’ le basi, vediamo come risolvere il problema di prima: il programma che non si chiude dopo aver clickato sul pulsante di chiusura, e giacché ci siamo miglioriamo un po’ l’hello world inserendo un pulsantino e collegandoci un evento :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <gtk/gtk.h>
 
int i = 0;
 
static void
button_func (GtkWidget * widget)
{
  switch (i)
  {
    case 0:
      g_print ("E' la prima volta che clicki :)\n");
      break;
    case 1:
    case 2:
    case 3:
      g_print ("Ci prendi la mano a clickare eh?\n");
      break;
    default:
      g_print ("Ok, basta. Torna a studiar le gtk ;)\n");
      break;
  }
 
  i++;
}
 
int
main (int argc, char *argv[])
{
  GtkWidget *window, *button;
 
  gtk_init (&argc, &argv);
 
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size (GTK_WINDOW (window), 250, 250);
  gtk_window_set_title (GTK_WINDOW (window), "Ciao Mondo delle Gtk+!");
  gtk_widget_show (window);
 
  button = gtk_button_new_with_label ("Clickami!");
  gtk_container_add (GTK_CONTAINER (window), button);
  gtk_widget_show (button);
 
  g_signal_connect (G_OBJECT (window), "delete_event",
                    G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect (G_OBJECT (button), "clicked",
                    G_CALLBACK (button_func), NULL);
 
  gtk_main ();
  return 0;
}

Dunque, analizziamo un attimo le nuove funzioni, quella più importante e una delle più usate in un programma che utilizza le Gtk+ è g_signal_connect il cui prototipo è:

gulong g_signal_connect (gpointer object, const gchar *signal_name,                                           
                   GCallback handler, gpointer data); 

Ovvero, riceve come primo parametro l’oggetto ( GObject ) a cui collegare il segnale, come secondo parametro il tipo di evento da intercettare ( gli eventi intercettabili cambiano da widget a widget ), come terzo la funzione da chiamare una volta che si verifica l’evento e infine un eventuale parametro da passarci, il parametro deve essere convertito in gpointer ( che equivale al void * ).
Una particolarità della funzione che verrà collegata è che può essere di qualunque tipo, accettare ciò che si vuole e ritornare ciò che vuole. Nel caso però si volesse ottenere nella funzione chiamata il parametro passato e il widget collegato solitamente si utilizza questo prototipo:

gpointer funzione_chiamata (GtkWidget *widget, gpointer data);

In widget sarà l’elemento a cui è collegata la funzione, e in data il parametro passato.

Andando avanti possiamo vedere oltre al classico bottone creato, una funzione particolare, gtk_container_add.

Le Gtk+ hanno una struttura di tipo gerarchico fatta ad esempio in questo modo:

uto-ger.png

Ora, questa gerarchia è messa un po’ così per far intuire meglio, quella vera delle Gtk+ la potete consultare qui.

Nel caso del nostro script noi abbiamo la finestra che oltre che una finestra è anche un contenitore e quindi al suo interno ci inseriamo direttamente il pulsante che, come si potrà vedere, si espanderà per tutta la dimensione del contenitore, per limitare la sua dimensione potevamo avvalerci o di una tabella o box, nel caso fossero stati presenti più elementi, oppure della funzione gtk_widget_set_usize che forza un widget ad avere esattamente la dimensione scelta. I parametri di quest’ultima funzione sono simili a quelli di gtk_window_set_default_size solo che il primo elemento al posto di essere una GtkWindow è un GtkWidget, quindi nella stragrande maggior parte dei casi non c’è bisogno di eseguire alcun cast.
Per finire quindi, abbiamo visto la funzione gtk_main_quit, che termina l’applicazione gtk ed esce dal programma.

Fine Quarta Putanta
Nella prossima puntata inizieremo ad andare più in profondità studiando i vari tipi di finestre, adesso abbiamo solo dato uno sguardo generale. Bye ;)

  1. luky
    1 giugno 2009 a 12:55 | #1

    ciao! è da un pò k studio gtk su windows ma ti volevo kiedere 1 cs anzi 2: a k serve static void?? 2. xk si dv mettere xforza int argc, char *argv[] e &arc, &argv??? spero k qnd avrai 1 pò di tmp mi risp grz mille. PS: lo so k dovrei saperlo studiando il c ma nn mi ricordo…….

  2. 1 giugno 2009 a 14:27 | #2

    1) Con l’attributo static si informa il compilatore che quella funzione è privata di quel file e quindi non può essere richiamata da altri file .c .

    2) argc ( il numero di parametri passati al programma ) e argv ( l’array di stringhe contenente i parametri ) servono per la funzione gtk_init () che inizializza l’ambiente gtk+ e fa un breve parsing dei parametri alla ricerca delle opzioni private delle gtk+ che sono le seguenti:

    Opzioni Gtk+:

    –class=CLASSE Classe del programma come usato dal window manager
    –name=NOME Nome del programma come usato dal window manager
    –display=DISPLAY Display X da usare
    –screen=SCHERMO Schermo X da usare
    –sync Rende le chiamate a X sincrone
    –gtk-module=MODULI Carica i moduli GTK+ addizionali
    –g-fatal-warnings Rende tutti i warning critici
    –gdk-debug=FLAG Flag Gdk di debug da attivare
    –gdk-no-debug=FLAG Flag Gdk di debug da disattivare
    –no-xshm Non usare le estensioni di X per la memoria condivisa
    –gxid_host=HOST
    –gxid_port=PORTA
    –xim-preedit=STILE
    –xim-status=STILE
    –gtk-debug=FLAG Flag Gtk+ di debug da attivare
    –gtk-no-debug=FLAG Flag Gtk+ di debug da disattivare

    P.s.: Potresti evitare di scrivere abbreviato :) ?

  3. cesk0
    23 agosto 2009 a 13:52 | #3

    ciao, volevo farti i complimenti per questa guida :D è da poco che ho iniziato a leggerla ma già mi appassiona :D è davvero fatta bene. Riguardo a questa IV parte l’unica cosa che non ho capito è “Nel caso però si volesse ottenere nella funzione chiamata il parametro passato e il widget collegato solitamente si utilizza questo prototipo: gpointer funzione_chiamata (GtkWidget *widget, gpointer data);”. Ciao e continua così ;)

  4. 28 agosto 2009 a 22:52 | #4

    Vuol dire che ad esempio se si vuol collegare una funzione al click del mouse su un pulsante e a questa funzione vuoi passare sia il widget del pulsante sia magari una stringa da scrivere nel terminale devi dargli questa definizione:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    gpointer click_button (GtkWidget *widget, gpointer data)
    {
     /* gpointer = void *
      *
      * widget: il widget del pulsante
      * data: convertendola nel tipo originario ( ad esempio in char * ) si
      *       ottiene la stringa passata come parametro.
      */
    }
  5. DarkSider
    26 luglio 2011 a 11:49 | #5

    Ciao sto seguendo questa guida e devo dire che è fantastica, però non capisco una cosa cosa serve nella riga 6 lo script: (GtkWidget * widget) ?

  1. Nessun trackback ancora...
Custom Avatars For Comments