Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Les conventions de GTK disent que chaque widget doit posséder trois macros (minimum) permettant de manipuler les Widgets :
- GTK_WIDGET(widget) : Permet de caster (transformer) un widget en son type réel.
Par exemple, pour modifier les paramètres d'une fenêtre, vous devez passer aux fonctions un GtkWindow et non un GtkWidget, ce qui se fait donc avec la macro GTK_WINDOW.
- GTK_WIDGET_CLASS(widget) : Même chose, sauf qu'on obtient un GtkWidgetClass*.
Utile lors du développement de widgets, mais pas (ou trés peu) utilisé par l'utilisateur (vous).
- GTK_IS_WIDGET(widget) : Permet de savoir si un widget est de type GtkWidget.
Renvoie "vrai" si le widget et bien du type précisé.
*
WIDGET : Quand Widget est écrit ainsi, cela signifie que le mot est à remplacer par le type voulu.
Ex : pour les GtkWindow, les macros sont :
Code : C1
2
3 | #define GTK_WINDOW ...
#define GTK_WINDOW_CLASS ...
#define GTK_IS_WINDOW ...
|
Rien de bien passionnant je vous l'avoue, mais vous devez connaître l'existence de ces macros, ou tout au moins la première !
Apprenez chers amis, que lors du développement d'une vraie application GTK, ou même d'un simple petit programme,
la console peut se révéler utile. Je vous conseille
très fortement d'activer la console pendant le développement (on l'enlève pour la distribution

), car elle permet d'afficher différentes choses telles que :
- En cas d'erreur d'installation d'un composant, mais qui ne gène pas la compilation, vous pouvez avoir des erreurs qui apparaissent.
- En cas d'erreur d'utilisation des certains widgets, vous pouvez voir des Warnings. Très utile !
- Pour faire du débug, par exemple pour afficher simplement un retour de fonction (pour faire des tests).
Ces trois raisons sont largement suffisantes ! Quand vous avez un problème, ne posez pas de questions sur le forum avant d'avoir vérifié qu'il n'y a pas d'erreurs !
GTK+ utilise l'encodage UTF-8 pour le traitement et l'affichage des chaines de caractères, ce qui peut poser problème et gêner l'affichage des les caractères spéciaux et des accents. On aura alors une erreur de ce type dans la console :
Code : Console | ** (programme.exe) : WARNING **: Invalid UTF8 string passed to pango_layout_set_text() |
La solution qui permet de remédier à ce problème est simple, il suffit de convertir la chaine en question en UTF-8, comme vous l'avez vu dans le chapitre sur les labels :
Code : C1
2
3
4
5
6
7
8 | #define UTF8(string) g_locale_to_utf8(string, -1, NULL, NULL, NULL)
/* encodage */
gchar *chaine = UTF8("Un texte accentué, avec des caractères bizarres... $23, 32?, £18...");
/* utilisation de la chaine */
<...>
/* libération de la chaine allouée */
g_free(chaine);
|
Cependant, il est tout de même assez lourd de devoir passer par un encodage, puis de libérer la mémoire après utilisation… Alors qu'il y a bien plus simple !
Pourquoi ce problème ?
Nous avons un conflit d'encodage entre les chaines traitées par GTK+ (UTF-8), et celles que vous tapez dans votre IDE (ISO-38547 ou autre…). Conclusion : votre éditeur n'utilise pas le même encodage que GTK+.
Comment le résoudre ?
Pour résoudre le problème, il faudrait que votre éditeur, et donc vos fichiers sources, utilisent l'encodage UTF-8. Voici comment faire :
Sous Linux : il est très probable que vos fichiers soient déjà encodés en UTF8, ainsi pas de problème. Si ce n'est pas le cas, vous pouvez généralement régler cela dans le préférences de votre éditeur. Pour info, Code::Blocks utilise l'UTF-8 par défaut.
Sous Windows : sur cet OS, le problème est
systématique. Soit vous choisissez d'utiliser un éditeur externe dont on peut choisir l'encodage, soit vous utilisez les
nightly builds de Code::Blocks.
Sous Mac OS : XCode vous permet de choisir l'encodage (menu
Format >
File encoding >
Unicode UTF8). Si vous utilisez un éditeur externe, comme
Smultron, vous pourrez également utiliser l'encodage de votre choix.
C'est tout ?
Oui.

Réenregistrez vos fichiers avec le nouvel encodage, puis compilez : comme par magie, plus besoin de convertir vos chaines !
Merci qui ?
Dans le chapitre sur les labels, vous avez appris que GTK utilisait l'encodage UTF-8, mais que ce n'etait pas forcement votre encodage local et qu'il fallait donc convertir les chaines accentuées. Cela ne concerne pas que les labels mais tout les textes que GTK est succeptible d'afficher. (titre de fenêtre, boutons, etc...)
Vous découvrez donc une
petite fonction permettant de convertir une chaine en UTF-8 :
Code : C1 | gchar* g_locale_to_utf8 (const gchar *opsysstring, gssize len, gsize *bytes_read, gsize *bytes_written, GError **error);
|
La plupart du temps, on ne se sert que du premier paramètre; et comme cette fonction est très longue, je vous propose d'ecrire une petite macro qui fera la convertion mais qui prendra moins de place. La voilà :
Code : C1 | #define UTF8(string) g_locale_to_utf8(string, -1, NULL, NULL, NULL)
|
Ca sera plus pratique à utiliser comme ça ! Cependant, n'oubliez pas de libérer la mémoire lorsque c'est nécéssaire !
C'est une petite astuce toute bète, que vous pouvez appliquer pour d'autre fonctions
longues !