GTK ha un suo modo di trattare le preferenze delle applicazioni, usando
i file rc. Questi possono essere usati per scegliere i colori di quasi tutti
i widget, e possono anche essere usati per inserire delle pixmap nello sfondo
di alcuni widget.
All'inizio della vostra applicazione dovrebbe esserci una chiamata a
void gtk_rc_parse (char *filename);
passando come parametro il nome del vostro file rc. Questo farà si che GTK
analizzi tale file e usi le impostazioni di stile per i tipi di widget ivi
definite.
Se si desidera avere un insieme speciale di widget che abbia uno stile diverso
dagli altri, o qualsiasi altra divisione logica dei widget, si chiami
passando un widget appena creato come primo argomento, e il nome che gli si
vuole dare come secondo. Questo consentirà di cambiare gli attributi di
questo widget per nome tramite il file rc.
allora a questo bottone viene dato il nome ``special button'' ed esso può essere
riferito per nome nel file rc come ``special button.GtkButton''. [<--- Verificatemi!]
Il seguente esempio di file rc imposta le proprietà della finestra principale,
e fa si che tutti i figli di questa finestra ereditino lo stile descritto
dallo stile ``main button''. Il codice usato nell'applicazione è:
Nell'esempio che segue viene illustrato il formato del file GTK. Si tratta
del file testgkrc dalla distribuzione del GTK, a cui sono stati aggiunti
vari commenti e varie cose. Potete includere questa spiegazione nella
vostra applicazione per consentire all'utente di personalizzarla finemente.
There are several directives to change the attributes of a widget.
Ci sono diverse direttive per cambiare gli attributi di un widget.
fg - Assegna il colore di primo piano di un widget.
bg - Assegna il colore di sfondo di un widget.
bg_pixmap - Inserisce nello sfondo di un widget una pixmap.
font - Sceglie il font da usarsi con il dato widget.
Inoltre ci sono diversi stati in cui può trovarsi un widget, e si possono
assegnare diversi colori, pixmap e font per ogni stato. Essi sono:
NORMAL - Lo stato normale di un widget, quando il mouse non si trova su
di esso, quando non è premuto, ecc.
PRELIGHT (evidenziato)- Quando il mouse si trova sopra al widget
verranno usati i colori assegnati per questo stato.
ACTIVE (attivo) - Quando il widget è premuto o cliccato esso sarà attivo,
e verranno usati gli attributi assegnati da questa etichetta.
INSENSITIVE (insensibile)- Quando un widget viene reso insensibile,
e non può essere attivato, prenderà questi attributi.
SELECTED (selezionato) - Quando un oggetto viene selezionato, prende
questi attributi.
Quando si usano le parole chiave ``fg'' e ``bg'' per assegnare i colori dei
widget il formato è:
fg[<STATE>] = { Rosso, Verde, Blu }
Dove STATE è uno degli stati visti prima (PRELIGHT, ACTIVE ecc.), e Rosso,
Verde e Blu sono valori nell'intervallo 0 - 1.0; { 1.0, 1.0, 1.0 } rappresenta
il bianco.
Devono essere in formato float, o verranno visti come 0, sicché un ``1'' diretto
non funziona, deve essere ``1.0''. Uno ``0'' diretto va invece bene, poiché poco
importa se non viene riconosciuto: valori non riconosciuti vengono considerati
0.
bg_pixmap è molto simile al precedente, tranne per i colori che vengono
sostituiti dal nome di un file.
pixmap_path è una lista di percorsi separati da ``:''. In questi percorsi vengono
cercate le pixmap specificate.
La direttiva font è semplicemente:
font = "<font name>"
dove l'unica parte complicata è immaginare la stringa del font. Allo scopo
può servire usare xfontsel o una utilità analoga.
``widget_class'' assegna lo stile di una classe di widget. Queste classi sono
elencate nell'introduzione ai widget sulla gerarchia delle classi.
La direttiva ``widget'' assegna un insieme di widget dal nome specificato ad
un dato stile, annullando qualsiasi stile assegnato per la data classe di widget.
Questi widget vengono registrati nell'applicazione usando la chiamata
gtk_widget_set_name(). Questo consente di specificare gli attributi di un
widget singlarmente, piuttosto che assegnando gli attributi di un'intera classe
di widget. E' opportuno documentare tutti questi widget speciali in modo che
gli utenti possano personalizzarli.
Quando la parola chiave ``parent'' viene usata come un attributo, il
widget erediterà gli attributi del suo genitore nell'applicazione.
Quando si definisce uno stile si possono assegnare gli attributi di uno
stile definito precedentemente a quello nuovo.
Questo esempio prende lo stile ``button'' e crea un nuovo stile
semplicemente cambiando il font e il colore di sfondo dello stato ``prelight''
nello stile ``button''.
Naturalmente, molti di questi attributi non sono applicabili a tutti i widget.
E' veramente un semplice problema di buon senso. Tutto quello che potrebbe
applicarsi, dovrebbe.
# pixmap_path "<dir 1>:<dir 2>:<dir 3>:..."
#
pixmap_path "/usr/include/X11R6/pixmaps:/home/imain/pixmaps"
#
# style <name> [= <name>]
# {
# <option>
# }
#
# widget <widget_set> style <style_name>
# widget_class <widget_class_set> style <style_name>
# Ecco una lista di tutti gli stati possibili. Si noti che alcuni non sono
# applicabili a certi widget.
#
# NORMAL - Lo stato normale di un widget, quando il mouse non si trova su
# di esso, quando non è premuto, ecc.
#
# PRELIGHT (evidenziato)- Quando il mouse si trova sopra al widget
# verranno usati i colori assegnati per questo stato.
#
# ACTIVE (attivo) - Quando il widget è premuto o cliccato esso sarà attivo,
# e verranno usati gli attributi assegnati da questa etichetta.
#
# INSENSITIVE (insensibile)- Quando un widget viene reso insensibile,
# e non può essere attivato, prenderà questi attributi.
#
# SELECTED (selezionato) - Quando un oggetto viene selezionato, prende
# questi attributi.
#
# Dati questi stati, è possibile assegnare gli attributi dei widget in
# ognuno di questi stati usando le seguenti direttive.
#
# fg - Assegna il colore di primo piano di un widget.
# bg - Assegna il colore di sfondo di un widget.
# bg_pixmap - Inserisce nello sfondo di un widget una pixmap.
# font - Sceglie il font da usarsi con il dato widget.
#
# Questo è uno stile chiamato "button". Il nome non è veramente importante,
# in quanto viene assegnato ai veri widget alla fine del file.
style "window"
{
# Questo inserisce nella spaziatura attorno alla finestra la pixmap
# specificata.
#bg_pixmap[<STATE>] = "<pixmap filename>"
bg_pixmap[NORMAL] = "warning.xpm"
}
style "scale"
{
# Mette il colore di primo piano (il colore del font) a rosso nello
# stato "NORMAL".
fg[NORMAL] = { 1.0, 0, 0 }
# Inserisce nello sfondo del gadget la stessa pixmap usata dal suo genitore.
bg_pixmap[NORMAL] = "<parent>"
}
style "button"
{
# Questo mostra tutti i possibili stati per un bottone. L'unico che
# non è applicabile è lo stato "SELECTED".
fg[PRELIGHT] = { 0, 1.0, 1.0 }
bg[PRELIGHT] = { 0, 0, 1.0 }
bg[ACTIVE] = { 1.0, 0, 0 }
fg[ACTIVE] = { 0, 1.0, 0 }
bg[NORMAL] = { 1.0, 1.0, 0 }
fg[NORMAL] = { .99, 0, .99 }
bg[INSENSITIVE] = { 1.0, 1.0, 1.0 }
fg[INSENSITIVE] = { 1.0, 0, 1.0 }
}
# In questi esempio ereditiamo gli attributi dello stile "button" e poi
# alteriamo il font e il colore di sfondo quando evidenziato per creare
# un nuovo stile "main_button".
style "main_button" = "button"
{
font = "-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
bg[PRELIGHT] = { 0.75, 0, 0 }
}
style "toggle_button" = "button"
{
fg[NORMAL] = { 1.0, 0, 0 }
fg[ACTIVE] = { 1.0, 0, 0 }
# Questo seleziona come pixmap di sfondo per il toggle_button quella del
# suo widget genitore (definita nell'applicazione).
bg_pixmap[NORMAL] = "<parent>"
}
style "text"
{
bg_pixmap[NORMAL] = "marble.xpm"
fg[NORMAL] = { 1.0, 1.0, 1.0 }
}
style "ruler"
{
font = "-adobe-helvetica-medium-r-normal--*-80-*-*-*-*-*-*"
}
# pixmap_path "~/.pixmaps"
# Queste assegnano ai tipi di widget gli stili definiti prima.
# I tipi di widget sono elencati nella gerarchia delle classi, ma probabilmente
# dovrebbero essere elencati in questo documento come riferimento per l'utente.
widget_class "GtkWindow" style "window"
widget_class "GtkDialog" style "window"
widget_class "GtkFileSelection" style "window"
widget_class "*Gtk*Scale" style "scale"
widget_class "*GtkCheckButton*" style "toggle_button"
widget_class "*GtkRadioButton*" style "toggle_button"
widget_class "*GtkButton*" style "button"
widget_class "*Ruler" style "ruler"
widget_class "*GtkText" style "text"
# Questo assegna lo stile main_button a tutti i bottoni che sono figli della
# "main window" (finestra principale). Questi devono essere documenati per
# potersene avvantaggiare.
widget "main window.*GtkButton*" style "main_button"