Free online content available in this course.

Got it!

Last updated on 1/8/18

Trucs et astuces divers

Log in or subscribe for free to enjoy all this course has to offer!

Ce chapitre contient diverses astuces qui pourraient bien vous servir, et ce quel que soit votre niveau/avancement.

N'hésitez pas à venir jeter un coup d'oeil de temps en temps ! ;)

Quelques Macros...

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 :

#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 ! :)

Astuce par Guimers8

Retour à la console

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 !

Astuce par Guimers8

Problèmes d'encodage UTF-8

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 :

** (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 :

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

Astuce par Guimers8

Texte accentué

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 tous les textes que GTK est susceptible d'afficher (titres des fenêtres, boutons, etc.).

Vous découvrez donc une petite fonction permettant de convertir une chaine en UTF-8 :

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

#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 ! ^^

Astuce par Guimers8

Il n'y a pas de QCM, cela ne servirait à rien, vous n'avez réellement rien appris ! ^^

Puissent ces astuces vous servir !

Le cours n'est bien entendu pas encore terminé, les chapitres sortiront au fur et à mesure. Sachez que le plan du cours est (en gros) bien défini et que nous aborderons quasiment tous les points pouvant vous intéresser, répartis sur au moins quatre parties dont une consacrée aux annexes. Rassurez-vous, le programme est plus que complet ! :)

Si vous avez des questions ou suggestions relatifs à un chapitre en particulier, envoyez un MP à l'auteur du chapitre en question (en bas de page), pas à moi !
Pour les problèmes de code, n'oubliez pas que le forum est là.

Picxime, Guimers8 & Im@GinE remercient les zCorrecteurs Petrus6, ptipilou et Ziame
qui ont participé à la correction ainsi que la validatrice Faeria MC (Morphée) qui s'occupe de notre tutorial.

Citation

[Important] Le Tutoriel GTK+ est actuellement en pause !

La rédaction de ce tutoriel à commencée il y a un peu plus d'un an, nous étions tous très motivés et avons travaillé dur pendant à peu près 9 mois. Mais depuis le début de l'année, l'acharnement au travail a diminué... Ainsi depuis plusieurs mois certains attendent les nouveaux chapitres, nous avons en effet écrit en partie les chapitres, mais ils ne sont plus les mêmes, trop imparfaits, et nous avons moins la motivation (et aussi surtout le temps ! :-° ) de les terminer correctement.

Nous avons ainsi décidé de mettre en pause la réalisation du tutorial car il devient important pour tous les 3 de consacrer plus de temps au travail scolaire.

Souhaitant que vous puissiez continuer d'apprendre GTK+, voici une liste de divers Tutos disponibles sur le net :

  • [Cours GTK] : Ce cours développera en détail la majorité des fonctions de GTK+ tout en fournissant des exemples concrets. De ce fait, ce cours sera une sorte de tutorial couplé à un manuel de référence complet.

  • [Gtk.org] : Le tutoriel officiel (donc en anglais !), par les créateurs de GTK+. Il est toujours intéressant d'étudier un document édité par les codeurs de la bibliothèque.

  • [Gtk par l'exemple] : Ce tutoriel a pour but de vous guider dans la réalisation d'une interface graphique en C grâce à GTK+ au travers l'exemple de la réalisation d'un éditeur de texte. Très instructif pour la pratique de GTK ;) .

  • [Tout sur GTK] : Cette page recense un grand nombre de contenues liés à GTK (documents, tutos, forum,...)

  • [Gtk-Fr] : Le tutoriel du wiki francophone dédié à GTK. Malgré quelques (grosses ? :-° ) lacunes pourtant essentielles, ce tutoriel est tout de même intéressant, avec de la bonne volonté biensûr.

Et en dernier cadeau, quelques documents sélectionnés (en anglais) :

Merci pour tous les messages de soutient que vous avez pu nous envoyer et à tout ce qui nous ont aidé ! :)
Bon codage ! ^^

Example of certificate of achievement
Example of certificate of achievement