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

Guida Gtk+ a puntate ( VI parte )

Scusate innanzitutto per la sospensione, per così tanto tempo, della guida a puntate ma sono stato megaraffreddato e con la febbre sto fine\inizio settimana. Sono sicuro che le Gtk+ in futuro avranno anche qualche funzione per farmi stare meglio dato che già adesso implementano il mondo intero.

Dov’è che eravamo arrivati? Ah si, i dialoghi :) . Oggi vedremo le Finestre vere, quindi riprendete il vostro compilatore che stava ammuffendo, il vostro vim, geany, gedit, emacs, nano o quello che è e iniziamo.

Finestre

Una finestra è nella stragrande maggioranza dei casi, il widget di base in cui vengono inseriti altri widget. É un contenitore per un solo elemento, per questo più avanti troveremo le tabelle e i box che permettono di inserire, organizzare e tenere in ordine più widget. La loro creazione è molto semplice:

GtkWidget *window;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

Il parametro di gtk_window_new l’abbiamo già spiegato durante l’introduzione alle Gtk+ così come settare il titolo o la dimensione di default. Adesso vedremo come dare un’icona al programma. Ciò lo possiamo fare tramite la funzione gtk_window_set_icon_from_file nel seguente esempio vedremo come utilizzarla.

GtkWidget *window;
GError *error = NULL;
 
gboolean chk;window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
chk = gtk_window_set_icon_from_file (GTK_WINDOW(window), "myicon.png", &error);
 
if ( chk == FALSE ) {
     g_warning (error->message);
     g_error_free (error);
}

Abbiamo introdotto due nuovi tipi delle Glib: Gerror e gboolean. Il primo è una struttura organizzata in questo modo:

typedef struct {
     GQuark domain;
     gint code;
     gchar *message;
} GError;

In questo modo abbiamo in domain ( che è un GQuark, un tipo che equivale a unsigned long int ) l’indentificativo univoco del tipo di errore, in code il codice di errore, una sorta di variabile errno, e infine in message la stringa di errore “human-readable” ovvero visualizzabile direttamente come output.
Dopo aver caricato l’immagine, nell’if, troviamo la funzione g_warning sempre delle glib, ne esistono 5 di questo “tipo” con effetti diversi:

  1. g_message -> riporta semplici messaggi.
  2. g_warning -> riporta avvertimenti, ovvero errori non fatali per il proseguimento dell’applicazione.
  3. g_critical -> riporta avvertimenti, fatali per il proseguimento di alcune operazioni.
  4. g_error-> riporta errori, fatali per il proseguimento dell’applicazione. Dopo aver visualizzato il messaggio chiama la funzione abort () per terminare il programma.
  5. g_debug -> funzione per riportare messaggi riguardanti il debug dell’applicazione.

Una volta capito questo piccolo esempio andiamo a vedere come si può fare a settare un’immagine come icona del programma nel caso essa non sia un file ma sia memorizzata in qualche variabile all’interno del programma. Per fare questa operazione abbiamo bisogno della libreria GdkPixbuf sempre all’interno delle Gtk+ come sotto categoria della libreria Gdk.
Il formato più comune e semplice da utilizzare all’interno dell’applicazione è XPM. Un’icona ad esempio di una pagina in XPM può essere creata così:

static const char * xpm_data[] = {
"16 16 3 1",
"       c None",
".      c #000000",
"X      c #FFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "};

L’immagine è composta nella maniera seguente:

  •  Prima Riga:
    • Primo Numero: Larghezza
    • Secondo Numero: Altezza
    • Terzo Numero: Colori Immagine
    • Quarto Numero: Caratteri per Pixel
  • Seconda Riga:
    • Inizia la dichiarazione di tutti i colori nel formato carattere       c colore
  • Una volta finito di specificare i colori si può iniziare a disegnare

Alla fine della creazione dell’immagine, la si memorizza in una variabile GdkPixbuf * in questo modo:

GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data (xmp_data);

E infine la si setta come icona tramite la funzione gtk_window_set_icon che riceve come primo parametro la finestra a cui settare l’icona e come secondo parametro il GdkPixbuf con l’immagine.
Ultima cosa da dire su quest’argomento delle icone è che se si volesse settare un’icona univoca per tutte le finestre e dialoghi creati nel programma bisognerà usare la funzione gtk_set_default_icon_from_file o gtk_set_default_icon che funzionano esattamente come le funzioni che abbiamo visto tranne per il fatto che non richiedono la finestra come primo parametro.

Per finire con le finestre invece, vediamo come rendere una finestra modale, ovvero che forza il controllo sull’ultima finestra aperta. Abbiamo bisogno di sole due funzioni: gtk_window_set_transient_for e gtk_window_set_modal. La prima funzione serve a rendere “parenti” la finestra corrente con quella principale, riceve infatti come primo parametro la finestra corrente e come secondo quella principale. La seconda funzione invece abilita o disabilita ( dipendentemente dal secondo parametro ) il controllo forzato sulla finestra passata come primo parametro, per forzare il controllo bisognerà passare come secondo parametro TRUE altrimenti FALSE.

Fine Sesta Puntata
Bene, abbiamo recuperato il tempo perso con questa puntatona. Abbiamo pure introdotto le immagini XPM e il tipo GdkPixbuf.. direi che nella prossima puntata vedremo i Dialoghi di Informazione e poi ho finito di scopiazzare la guida che avevo scritto e dovrò iniziare a scriverla direttamente qui e quindi si potrebbe pensare di andare a vedere il tipo di finestra GtkAssistant… chissà. Buona notte, data l’ora e ciauz ;)

  1. Orazio
    7 maggio 2011 a 18:11 | #1

    Ciao hds619…premetto che sono alle prime armi con le librerie gtk…:)
    Ho un problema, nella finestra che creo lo sfondo non viene settato.Oltre a controllare che l’ immagine si trovi nella stessa cartella del codice sorgente non so che fare…potresti darmi qualche consiglio??

  2. Orazio
    7 maggio 2011 a 18:40 | #2

    @Orazio
    Risolto!!…mi è bastato modificare il tema…scegliendone uno che ha i tre tasti(riduci,tuttoschermo e chiudi) a destra, mentre il precedente avendoli a sinistra non permetteva la visualizzazione dell’ icona.
    Comunque nell’ altro commento avevo sbagliato scrivendo sfondo(intendevo icona).
    Ah dimenticavo…complimenti per l’ ottima guida!!! :)

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