23. Chapitre 23. Les fichiers de style rc GTK▲
GTK+ possède sa propre manière de traiter avec les paramètres par défaut des applications, en utilisant des fichiers rc. Ceux-ci peuvent servir pour définir les couleurs de n'importe quel widget, ils peuvent aussi, pour quelques widgets, servir à définir un arrière-plan avec un pixmap en mosaïque.
23-1. Les fonctions pour le fichier rc▲
Au début de l'application, il faut inclure un appel à :
rc_parse
(
nom_du_fichier)
Le paramètre nom_du_fichier correspond au fichier rc. Ceci force GTK+ à analyser ce fichier et à utiliser les styles définis pour les types de widgets qui y sont décrits.
Si l'on souhaite avoir un ensemble spécifique de widgets possédant un style différent des autres ou réaliser un quelconque groupement particulier de widgets, il faut utiliser :
widget.set_name
(
nom)
Le nom choisi sera assigné au nouveau widget créé. Ceci permet de modifier les attributs de ce widget dans le fichier rc en utilisant son nom.
Si l'on utilise un appel comme celui-ci :
2.
3.
button =
gtk.Button
(
"
Special
Button
"
)
button.set_name
(
"
special
button
"
)
alors ce bouton button reçoit le nom "special button" et on peut y faire référence dans le fichier rc par le nom "special button.GtkButton". [--- Vérifiez-le !]
La Section 23.3, « Exemple de fichier rc »Exemple de fichier rc ci-dessous définit les propriétés de la fenêtre principale, tous les enfants de cette fenêtre héritent du style décrit par le style "bouton principal". Voici le code utilisé :
2.
3.
window =
gtk.Window
(
gtk.WINDOW_TOPLEVEL)
window.set_name
(
"
main
window
"
)
et le style est défini, dans le fichier rc, par :
widget "
main
window
.
*
GtkButton
*
"
style "
main_button
"
qui applique à tous les widgets Button (voir le Chapitre 6, Les boutonsChapitre 6. Les boutons) de la fenêtre principale "main window" le style "main_buttons" tel qu'il est défini dans le fichier rc.
Ainsi qu'on peut le constater, c'est un système assez souple et puissant. Utilisez votre imagination pour en profiter au maximum.
23-2. Format du fichier rc GTK▲
Le format du fichier rc GTK+ est illustré dans la Section 23.3, « Exemple de fichier rc »Exemple de fichier rc ci-dessous. C'est le fichier testgtkrc de la distribution GTK+, avec quelques commentaires et ajouts. Il est possible d'ajouter cette explication dans son application pour permettre à l'utilisateur de parfaire ses réglages.
Plusieurs commandes permettent de modifier les attributs d'un widget.
- fg - Définit la couleur de premier plan d'un widget.
- bg - Définit la couleur d'arrière-plan d'un widget.
- bg_pixmap - Compose l'arrière-plan d'un widget avec un pixmap en mosaïque.
- font - Définit la police utilisée pour le widget indiqué.
- De plus, un widget possède plusieurs états, il est possible de définir différentes couleurs, mosaïques de pixmap et polices pour chaque état. Ces états sont les suivants :
NORMAL |
L'état normal d'un widget, la souris n'est pas au-dessus, il n'est pas enfoncé, etc. |
PRELIGHT |
Lorsque le widget est survolé par la souris, les couleurs définies pour cet état seront utilisées. |
ACTIVE |
Lorsque le widget est cliqué ou enfoncé, il devient actif et les attributs définis pour cet état seront utilisés. |
INSENSITIVE |
Lorsqu'un widget est marqué "insensible", et ne peut être activé, il prendra ces attributs |
SELECTED |
Quand un objet est sélectionné, il prend ces attributs. |
Quand on utilise les mots-clé "fg" et "bg" pour définir les couleurs des widgets, il faut respecter ce format :
fg[<
STATE>
] =
{ Rouge, Vert, Bleu }
où STATE est un des états ci-dessus (PRELIGHT, ACTIVE, etc.), Rouge, Vert et Bleu sont des valeurs dans l'intervalle 0 - 1.0 ; {1.0,1.0,1.0} est le blanc. Elles doivent être au format décimal, sinon leur valeur est mise à 0, ainsi un simple "1" n'est pas correct, ce doit être "1.0". Un simple "0" fonctionne parce que les valeurs non reconnues sont mises à 0.
Le paramètre bg_pixmap est très semblable au précédent, mais les couleurs sont remplacées par un nom de fichier.
pixmap_path est une liste de chemins séparés par un ":". Ces chemins sont ceux où seront recherchés les pixmaps indiqués.
La commande "font" est simple :
font =
"
<
font
name
>
"
La partie la plus difficile est de trouver le contenu de la chaîne font. Utiliser le programme xfontsel ou un utilitaire équivalent devrait faciliter la tâche.
La commande "widget_class" définit le style d'une classe de widgets. Ces classes sont énumérées dans la Section 5.1, « Hiérarchie des widgets »Hiérarchie des widgets de la vue d'ensemble des widgets.
La commande "widget" applique un style donné à un ensemble de widgets portant un nom spécifique, quel que soit le style normal de cette classe de widgets. Ces widgets sont enregistrés dans l'application avec la méthode set_name(). Ceci permet de modifier les attributs d'un widget au coup par coup plutôt que de définir les attributs d'une toute une classe de widgets. Je vous recommande de documenter chacun de ces widgets spécifiques, permettant ainsi à l'utilisateur de les personnaliser.
Quand on utilise le mot-clé parent comme attribut, le widget utilise les attributs de son parent dans l'application.
Lorsque l'on définit un style, on peut attribuer les éléments d'un style déjà défini à ce nouveau style.
2.
3.
4.
5.
style "
main_button
"
=
"
button
"
{
font =
"
-
adobe
-
helvetica
-
medium
-
r
-
normal
-
-
*
-
100
-
*
-
*
-
*
-
*
-
*
-
*
"
bg[PRELIGHT] =
{ 0.75
, 0
, 0
}
}
Cet exemple utilise le style "button" et crée un nouveau style "main_button" simplement en modifiant la police et la couleur d'arrière-plan de l'état présélectionné (PRELIGHT) du style "button".
Naturellement, beaucoup de ces attributs ne s'appliquent pas à tous les widgets. C'est une simple question de bon sens. Ce qui peut s'appliquer devrait fonctionner.
23-3. Exemple de fichier rc▲
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
#
-*-
coding:utf-8
-*-
#
pixmap_path
"<dir
1>:<dir
2>:<dir
3>:..."
#
pixmap_path "
/
usr
/
include
/
X11R6
/
pixmaps
:
/
home
/
images
/
pixmaps
"
#
#
style
<name>
[=
<name>]
#
{
#
<option>
#
}
#
#
widget
<widget_set>
style
<style_name>
#
widget_class
<widget_class_set>
style
<style_name>
#
Voici
la
liste
de
tous
les
états
possibles.
#
Certains
ne
s'appliquent
pas
à
tous
les
widgets
#
#
NORMAL
-
L'état
normal
d'un
widget,
la
souris
n'est
pas
#
au-dessus,
il
n'est
pas
enfoncé,
etc.
#
#
PRELIGHT
-
Lorsque
le
widget
est
survolé
par
la
souris,
#
les
couleurs
définies
pour
cet
état
seront
utilisées.
#
#
ACTIVE
-
Lorsque
le
widget
est
cliqué
ou
enfoncé,
il
devient
#
actif
et
les
attributs
définis
pour
cet
état
seront
utilisés.
#
#
INSENSITIVE
-
Lorsqu'un
widget
est
marqué
"insensible",
#
et
ne
peut
être
activé,
il
prendra
ces
attributs
#
#
SELECTED
-
Quand
un
objet
est
sélectionné,
il
prend
ces
attributs.
#
#
À
partir
de
ces
états,
on
peut
définir
les
attributs
des
widgets
pour
#
chacun
d'eux
avec
les
commandes
suivantes
:
#
#
fg
-
indique
la
couleur
de
premier
plan
d'un
widget.
#
fg
-
indique
la
couleur
d'arrière-plan
d'un
widget.
#
bg_pixmap
-
l'arrière
plan
du
widget
est
une
image
en
mosaïque.
#
font
-
définit
la
police
utilisée
avec
ce
widget.
#
#
Ceci
crée
un
style
appelé
"button".
Le
nom
n'a
pas
réellement
#
d'importance,
il
est
assigné
aux
widgets
en
cours
à
la
fin
du
fichier.
style "
window
"
{
#
Ceci
remplit
l'espacement
autour
de
la
fenêtre
avec
l'image
indiquée.
#
bg_pixmap[<STATE>]
=
"<pixmap
filename>"
bg_pixmap[NORMAL] =
"
warning
.
xpm
"
}
style "
scale
"
{
#
Donne
la
valeur
rouge
à
la
couleur
de
premier
plan
(la
couleur
#
de
police)
dans
l'état
"NORMAL".
fg[NORMAL] =
{ 1.0
, 0
, 0
}
#
Donne
à
ce
widget
la
même
image
de
fond
que
celle
de
son
parent.
bg_pixmap[NORMAL] =
"
<
parent
>
"
}
style "
button
"
{
#
Ceci
montre
tous
les
états
possibles
d'un
bouton.
Le
seul
#
qui
ne
s'applique
pas
dans
ce
cas
est
l'état
"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
}
}
#
Dans
cet
exemple,
le
style
"main_button"
hérite
des
attributs
#
du
style
"button"
et
ensuite,
on
remplace
les
couleurs
de
police
#
et
d'arrière-plan
de
l'état
"PRELIGHT"
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
}
#
Ceci
définit
comme
image
d'arrière-plan
du
bouton
à
bascule,
celle
#
de
son
parent
(tel
qu'il
est
défini
dans
l'application).
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"
#
Les
lignes
suivantes
indiquent
aux
widgets
d'utiliser
les
styles
#
définis
ci-dessus.
#
Les
types
de
widget
sont
énumérés
dans
la
hiérarchie
des
classes,
#
mais
on
pourrait
aussi
les
rappeler
dans
ce
document
pour
servir
#
de
référence
aux
utilisateurs.
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
"
#
Cette
ligne
donne
à
tous
les
boutons,
enfants
de
la
fenêtre
#
principale
("main
window"),
le
style
main_button.
Ceux-ci
doivent
#
être
renseignés
pour
en
profiter.
widget "
main
window
.
*
GtkButton
*
"
style "
main_button
"