jeudi 14 juin 2018

Chapitre 35 : Gestion d’un bouton de la fenêtre, modification police de caractères


Après ces créations de fenêtres, nous allons utiliser toutes les fonctions de création de boutons, de listes déroulantes, de boites de dialogue disponibles dans X11 etc.  Ah Ah Ah, je rigole bien sûr car rien de tout cela n’est fourni, c’est à nous à tout programmer à partir des fonctions de base !!
Donc nous allons ajouter un bouton dans notre fenêtre X11 et voir comment gérer l’appui sur ce bouton pour afficher une ligne de texte. Nous allons aussi modifier la police et la couleur de ce texte.
Pour commencer, j’ai restructuré complétement le programme pour le décomposer en sous-routines plus facilement duplicables en fonction des besoins. Nous trouverons donc une routine pour créer la connexion au serveur X11, une routine pour créer, afficher et configurer la fenêtre, une routine pour créer les contextes graphiques et une routine pour gérer les évènements de la souris. Nous dessinons une ligne avec le contexte graphique simple, ligne horizontale qui traverse toute la fenêtre et dont la longueur variera en fonction de la largeur de la fenêtre. Nous écrivons aussi une ligne de texte avec le contexte simple pour comparaison avec la suite.
A toutes ces routines qui reprennent le code des programmes précédents, nous ajoutons une routine pour créer un bouton. Par rapport aux autres routines, nous lui passons les paramètres de configuration car il est probable que par la suite, les programmes comportent plusieurs boutons. Pour regrouper toutes les informations sur le bouton, j’ai déclaré une structure BT qui n’est pas une structure d’origine X11 et dont on réserve la place en mémoire.
Dans la routine creationBouton, nous créons une fenêtre par la procèdure XCreateSimpleWindow puisque tout bouton est une fenêtre X11. Nous rattachons cette fenêtre à la fenêtre mère créée dans la routine creationfenetre et non pas à la fenêtre racine. Nous autorisons des actions particulières sur ce bouton avec les options ButtonPressMask,  ButtonReleaseMask, LeaveWindowMask, EnterWindowMask qui permettent au gestionnaire d’évènements de recevoir les appuis, relâchements et passages de la souris.
Puis nous créons un contexte graphique spécifique au bouton, puisqu’il faudra bien le distinguer du reste de la fenêtre puis nous l’affichons. En fin nous affichons le libellé du bouton par une sous-routine ecritureTexteBouton. Dans cette dernière, nous calculons le positionnement du texte à partir des données de la structure bouton pour que celui-ci soit centré à l’intérieur du bouton. Nous utilisons une sous-routine car il faudra l’appeler à nouveau en cas de redimensionnement de la fenêtre.
Dans la routine de gestion des évènements nous ajoutons les événements EnterNotify et LeaveNotify et la routine boutonAppel dans la partie de l’évènement ButtonPress. Dans celle-ci, nous commençons à vérifier que l’événement reçu correspond bien au bouton car en effet, il peut y avoir plusieurs boutons sur la fenêtre ou simplement vous avez cliqué en dehors du bouton et dans ce cas, il ne faut rien faire. Si le bouton est ok, on appelle la sous routine ecritureTexte2 pour écrire un texte dans la fenêtre et la sous routine modifBoutonAppui pour modifier l’aspect du bouton : pour faire simple j’inverse les pixels du fond et de la bordure.
Pour le texte, nous utilisons un deuxième contexte graphique (crée dans la routine creationGC) pour avoir une couleur et une police différente. Pour la couleur c’est la même chose que dans l’exemple précèdent pour afficher une ligne colorée. Pour la police, c’est plus compliqué car il nous faut récupérer une police existante dans le système graphique X11 et respecter un nom précis. Ici la police recherchée par la procédure XLoadQueryFont s’appelle
 -*-helvetica-bold-*-normal-*-14-* . Je vous conseille de lire la documentation sur la normalisation des polices X11. En plus, il est très possible que cette police ne soit pas accessible sur votre système et il vous faudra modifier ce nom ou sa taille (ici c’est 14 pixels par pouce). Donc, il vous faudra soit charger sur le raspberry un package supplémentaire des polices X11, soit les polices additionnelles du serveur Xming (en effet à ce jour, j’ai un doute sur qui fournit les polices lors de l’affichage !!). Vouai !! mais comment trouver le nom d’une police ? Et bien, vous disposez sur le raspberry du programme xfontsel qui vous permet de trouver une police valide. Sur mon système ce logiciel trouve plus de 6000 noms !!! et en cochant le bouton select puis les noms de famille, de type et de taille, vous arrivez à trouver une police qui convienne. Dans ce cas, vous reportez le nom complet en respectant bien les tirets et les * du nom. Pour vous familiariser, je vous conseille après un premier fonctionnement correct du programme, d’effectuer plusieurs tests en changeant le nom de cette police et de voir le résultat.
Vous remarquerez que le programme xfontsel, lancé à partir de la session putty X11, affiche le résultat sur votre windows et qu’il ressemble à nos fenêtres X11 !!!
Ensuite, le pointeur de cette police est passé au contexte graphique dans la structure XGCValues comme la couleur.
Il nous reste à gérer la modification de l’apparence du bouton lorsque la souris s’éloigne de celui-ci. C’est dans l’événement LeaveNotify que nous appelons une routine modifBoutonSortie qui se contente de remettre les couleurs du fond et de la bordure comme elles étaient avant l’appui sur le bouton avec la procédure XChangeWindowAttributes. Il faut aussi redessiner le bouton par la procédure XClearArea.
Remarque : dans ce programme, les passages de paramètres par les registres aux routines internes, les sauvegardes des registres ne respectent aucune norme !!!!

Voici le résultat que vous devez retrouver :
 

Aucun commentaire:

Enregistrer un commentaire