Dans ce programme, nous allons créer une zone de saisie de
texte car il n’y a pas de fonction dans la librairie X11 pour le faire. Mais au
lieu de créer la zone dans la fenêtre principale, nous allons la créer dans une
fenêtre autonome puis nous afficherons le résultat dans une autre fenêtre
autonome.
Dans ce programme, nous effectuerons aussi quelques
modifications pour rendre les routines plus autonomes et permettre leur
réutilisation ultérieure. Comme tout programmes X11, nous commençons par ouvrir
une connexion au serveur et à créer la
fenêtre principale. Puis nous créons un bouton ok au milieu de la fenêtre
principale. L’appui de ce bouton lancera la création d’une fenêtre de saisie
qui contiendra une zone de saisie (qui est une fenêtre) et un bouton de
validation. Vous remarquez que la zone de saisie est rattachée à la fenêtre de
saisie alors que cette dernière est rattachée à la fenêtre racine. Vous
remarquez aussi que la zone se positionne bien du premier coup dans la fenêtre
de saisie alors que cette dernière nécessite l’appel à la fonction XMoveWindow.
Y a un truc qu’il faut que je trouve !!!
Ensuite nous créons une fenêtre d’affichage qui ne
contiendra qu’un seul bouton OK. Vous voyez que je passe dans le registre r3 un
code de valeur 0. C’est pour une future amélioration, où avec d’autres valeurs,
j’afficherais soit un bouton soit 2 boutons OUI/NON soit 3 boutons
OUI/NON/ANNULER.
Dans toutes ces routines, les écritures des libellés et
texte sont effectuées dans des sous-routines, en effet, il faudra réécrire ces
éléments dans le cas où les fenêtres sont masquées par d’autres fenêtres puis
redécouvertes (gestion du message Expose).
Et maintenant la partie la plus importante : la gestion
des évènements : il nous faut gérer les actions sur 3 fenetres, sur 3
boutons et sur la zone de saisie !!. Dans la boucle des évènements, nous
commençons donc à tester quelle fenêtre et quel bouton est concerné par l’évènement.
Ensuite pour chaque élément, nous regardons quel évènement arrive (touche,
appui souris, etc..) et nous effectuons l’action en conséquence.
Pour la fenêtre principale, nous ne gérons que la fermeture
(qui termine le programme) et le masquage de la fenêtre pour réafficher le
texte du bouton.
Pour la fenêtre de saisie, nous gérons la fermeture qui
détruit la fenêtre ( mais ne termine pas le programme ) et le masquage de la
fenêtre.
Pour la fenêtre de message, nous gérons aussi la fermeture
et le masquage. Dans ce cas nous réaffichons le texte du bouton OK et le texte
du message.
Pour la zone de saisie, nous gérons l’appui sur une touche, et
le passage de la souris sur la zone. Dans ce dernier cas, nous augmentons
simplement la taille de la bordure pour montrer qu’elle est sélectionnée et que
la saisie est possible. Pour l’appui d’une touche, il nous faut tester s’il s’agit
d’un caractère ou d’une autre touche. Pour le caractère, il faut l’ajouter à un
buffer de saisie et réafficher le texte dans la zone de saisie (Et ben oui, il
faut tout faire !!) Ici nous utilisons une autre fonction XDrawText pour
écrire le texte. Pour les touches, nous ne gérons que le retour arrière pour effacer
le dernier caractère saisi. Et nous gérons aussi un curseur.
Ensuite, pour l’appui sur le bouton Ok de la fenêtre
principale, nous appelons la création de la fenêtre de saisie avec sa zone.
Pour l’appui du bouton de la fenêtre de saisie, nous supprimons
la fenêtre de saisie et nous créons la fenêtre de message en passant le buffer
de saisi pour afficher le texte. Ici on pourrait aussi forcer un zéro binaire
pour terminer proprement la chaine de caractère si elle doit être utilisée ultérieurement
(par exemple comme paramètre).
Pour l’appui du bouton de la fenêtre de message, nous
supprimons cette fenêtre.
Ce programme peut être amélioré en ajoutant d’autres boutons
comme annuler, en améliorant les fonds des fenêtres pour les distinguer les
unes des autres ainsi que les boutons, agrandir les polices utilisées pour
améliorer la lisibilité etc.
Maintenant je vais essayer d'éclaircir le problème du centrage des fenêtres.
Aucun commentaire:
Enregistrer un commentaire