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