Bonjour
Voici le code incriminé :
1 2 3 4 5 6 7 8 9 10 11
| void style1(GtkWidget *ChildWidget, cairo_t *cr)
{
static unsigned long i=0;
i++;
printf("%lu\n",i);
style (ChildWidget,cr,1.*0xf0/255,1.*0xe6/255,1.*0x8c/255);
bord(ChildWidget,cr);
} |
Celui se lance lors du "draw" du widget, voici l'extrait du fichier glade :
<signal name="draw" handler="style1" swapped="no"/>
Dès que je passe la souris sur l'item je vois les valeurs de i qui défilent => j'aimerai ne pas passer plusieurs fois.
Si je modifie le code comme ceci j'ai une autre surprise :
1 2 3 4 5 6 7 8 9 10 11
| void style1(GtkWidget *ChildWidget, cairo_t *cr)
{
static unsigned long i=0;
style (ChildWidget,cr,1.*0xf0/255,1.*0xe6/255,1.*0x8c/255);
bord(ChildWidget,cr);
i++;
printf("%lu\n",i);
} |
Le wigdet se colorie bien, mais le texte et ses boutons radio ne sont plus visibles (ce widget n'a pas autres éléments) => pourquoi l'ordre importe ?
Mon but étant de ne faire la couleur une seule fois, je modifie donc le code :
1 2 3 4 5 6 7 8 9 10 11 12 13
| void style1(GtkWidget *ChildWidget, cairo_t *cr)
{
static unsigned long i=0;
i++;
printf("%lu\n",i);
if (i==1)
{
style (ChildWidget,cr,1.*0xf0/255,1.*0xe6/255,1.*0x8c/255);
bord(ChildWidget,cr);
}
} |
Je ne vois rien de spécial dans l'affaire... Le problème, c'est que chaque fois que la souris passe sur un bouton radio (pas un label) le bouton et son texte passe en gris clair sur gris clair (couleur de fond pas défaut). Je ne vois plus les boutons et leur texte
, mais le label reste.
La raison de ces tests, c'est que je souhaite modifier l'affichage d'un sous-menu. Les couleurs dépendent des choix du moment (des éléments cochés dans d'autres menus) et le calcul de la couleur d'un item est long. Je ne voulais les faire que lorsque que c'était utile. Si je commence ma fonction callback par un test pour éviter le calcul, lorsque je demande de ne pas colorier, ma case devient gris-clair sur gris-clair.
Je pourrais certes mémoriser la couleur dans un tableau static pour ne pas refaire le calcul, mais si en plus, je pouvais éviter les appels suivants, je pense que je gagnerai du temps :
1 2
| cairo_set_source_rgb (cr, rouge, vert, bleu); // Affectation de la couleur récupérée en tant que donnée utilisateur
cairo_paint(cr); |
nb : un des but du travail que je fais est d’accélérer (sans avoir besoin de changer de PC) mon ancien programme qui marchent bien, mais avec des grosses lenteurs (et qui compile avec des warning : attention, fonction obsolète).
Partager