mercredi 6 juin 2018

Chapitre 32 : fenêtre X11 et gestion des évenements


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