Avanti Indietro Indice

18. I file rc di GTK

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.

18.1 Funzioni per i file rc

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

void gtk_widget_set_name (GtkWidget *widget,
                          gchar *name);

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.

Effettuando una chiamata come questa:

button = gtk_button_new_with_label ("Special Button");
gtk_widget_set_name (button, "special button");

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 è:

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name (window, "main window");

Lo stile viene definito nel file rc usando:

widget "main window.*GtkButton*" style "main_button"

che assegna a tutti i widget GtkButton nella finestra principale lo stile ``main_buttons'' secondo la definizione data nel file rc.

Come si può vedere, questo sistema è molto potente e flessibile. Usate la vostra immaginazione per trarre il massimo vantaggio da esso.

18.2 Il formato dei file rc di GTK

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.

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:

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.

style "main_button" = "button"
{
  font = "-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
  bg[PRELIGHT] = { 0.75, 0, 0 }
}

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.

18.3 Esempio di file rc

# 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"


Avanti Indietro Indice