Nous allons reprendre le programme précèdent pour
l’améliorer en incluant la correction du message d’erreur, un titre pour la
fenêtre, la saisie de caractère ou l’appui sur un bouton de la souris.
Nous reprenons le début du programme avec la connexion au
serveur X11, la récupération des données et la création de la fenêtre. Pour
cette dernière, nous inversons les codes RGB des pixels du fond d’écran et de
la bordure.
Ensuite, nous allons mettre à jour le titre de la fenêtre
avec son nom par la fonction XSetWMName
. Mais cette fonction ne prend pas directement la chaine de
caractères du nom, il faut auparavant la convertir en une propriété avec la fonction
XStringListToTextProperty.
Ensuite nous trouvons les instructions pour corriger le
message d’erreur qui apparait lors de la fermeture de la fenêtre. J’ai trouvé
cette correction sur internet et elle est un peu compliquée mais elle
fonctionne. Il sera necessaire de conserver ces instructions dans tous les
programmes suivants. En fait, nous créons une entité par la fonction XInternAtom
dont nous stockons l’identification en mémoire et nous passons cette
identification au serveur par la fonction XSetWMProtocols. Cette identification
nous sera retournée dans certains messages liés aux évenements de la fenêtre.
Puis nous affichons la fenêtre avec la fonction XMapWindow
comme déjà vu.
Et nous trouvons une nouvelle fonction qui va autoriser la
prise en compte des saisies par le gestionnaire des évènements. Ici nous
autorisons la saisie d’une touche du clavier et le clic des boutons de la
souris. Si dans un programme, le gestionnaire d’évènements ne réagit pas, c’est
qu’une autorisation n’a pas été donnée ou
a mal fonctionnée. C’est un point sensible !!
Enfin nous trouvons la boucle de gestion des évènements avec
l’appel à la fonction XNextEvent qui retourne à l’adresse mémoire passée en
paramètre le contenu de l’évènement que nous avons autorisé précédemment. Nous
effectuons un vidage des données pour vérification. Les 4 premiers octets
contiennent le code évènement. Nous testons la valeur 2 (KEYPRESSED) pour
savoir si une touche a été appuyée ou la valeur 4 (ButtonPress) si c’est un
bouton de la souris. Dans le premier cas, il nous faut déterminer s’il s’agit
d’un caractère alpha ou une touche de fonction. Pour cela nous appelons la
fonction XLookupString qui va retourner la valeur 1 s’il s’agit d’un caractère
et sa valeur sera stockée dans un buffer dont l’adresse a été passée en
paramètre de la fonction. Nous testons la valeur q (pour quitter) et si c’est
le cas nous fermons la connexion et terminons le programme. Vous pouvez vous
amuser à appuyer sur d’autres touches et voir dans les vidages les différents codes
retournés.
Si l’évènement correspond à un clic de la souris, nous nous
contentons de récupérer dans les registres r1 et r2 les positions X et Y du
clic et nous affichons ces registres pour voir les valeurs.
Si l’évènement correspond au code 33 (clientMessage) il
s’agit d’une demande fermeture de la fenêtre par le menu système. Dans ce cas,
nous vérifions que ce message contient bien la même identification que celle
que nous avons positionnée et si oui, nous fermons la connexion et cette fois ci
il n’y a pas de message d’erreur.
Vous remarquerez que le passage de la souris sur l’écran
sans cliquer ou le redimensionnement de la fenêtre n’entraine pas de réaction
du gestionnaire d’évènement. Ceci est normal puisque nous n’avons pas autorisé
ces évènements par la fonction XSelectInput.
Aucun commentaire:
Enregistrer un commentaire