samedi 23 juin 2018

Chapitre 36 : X11 création d'une fenêtre de saisie de texte


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