Gestion des évènements introduction
Le GEM repose principalement sur la gestion des évenements,
comme a peu près tous les systèmes d'interface graphique. Mais
contrairement a ceux ci le nombre de messages et d'évenements
gérés est très réduit et pourtant on peut tout
gérer! Ca c''est l'intérêt d'avoir un système
assez bas niveau, l'inconvénient, c'est qu'il y a pas mal de choses
à faire à la main à moins de trouver la bibliothèque
GEM qui convient.
En gros donc, un programme GEM se caractérise par une grosse
boucle d'attente d'évènements autour de laquelle on greffe
le reste du programme. c'est très caricatural mais pas si loins que
ça.
La librairie de la gestion d'évenements GEM est constituée
de 7 fonctions:
-
evnt_button()
-
evnt_dclick()
-
evnt_keybd()
-
evnt_mesag()
-
evnt_mouse()
-
evnt_multi()
-
evnt_timer()
La pratique que j'ai pu avoir avec GEM m'a montré que souvent
celui ci n'aimait pas avoir trôp de messages sur la "conscience"! Alors
pour la gestion, personnellement je n'utilise que 2 fonctions: evnt_mesag()
et evnt_multi(), les autres j'oublie. D'ailleur leur intérêt
est très limité car evnt_multi() sait faire ce que font ces
procédures, son seul défaut: Un nombre interminable de
paramètres! :-(
Systématiquement, je recommande donc que vous attendiez un
évenement clavier, sourie ou timer de gérer en même temps
les messages avec evnt_multi().
Le cas du timer est un peu spécial si vous utilisez evnt_multi()
pour gerer le timer selectionnez la page liée
à ces mots.
Description des procédures evnt_mesag() et evnt_multi()
-
evnt_mesag()
-
int evnt_mesag(int msg[8])
-
evnt_mesag() retourne une valeur dont le rôle n'est pas défini,
généralement à 1
-
msg est un buffer de 8 valeurs 16bits (sauf GCC qui pour une raison inconnue
en compilation 32bits on ne passe non pas un tableau de short 16bits mais
un tableau de int 32bits, ces entiers ne sont pas de plus 32bits clean, il
en résulte que si vous désirez faire des opérations
binaires sur les valeurs vous devez réaliser avant un masquage des
16bits inutiles (0xFFFF))
-
Les valeurs transmises dans msg par la procédure ont dans l'ordre
la signification suivante:
-
Type de message (voir leur signification)
-
Numéro GEM de l'application qui a envoyée le message
(0=système)
-
Nombre d'octets au delà des 16 transmis et doivent être relus
par appl_read(), remarque aucun message systeme connu ne nécessite
son utilisation.
-
Les entiers suivants contiennent les paramètres en fonction
du type de message envoyé, leurs descriptions sont
présentés ici.
-
evnt_multi()
-
int evnt_multi(int events, clicks, button, state, m1out, x1, y1, w1, h1,
m2out, x2, y2, w2, h2, buffer[8], lowtime, hightime, *xptr, *yptr, *bptr,
*kptr, *key, *times)
-
evnt_multi() retourne l'évènement ou les évènements
qui ont provoqués la sortie, a traiter avec un ET physique (valeurs
voir events ci après).
-
int events: Quels évènements attendre:
-
0x01 Clavier
-
0x02 Bouton de souris
-
0x04 1er évènement souris de zone
-
0x08 Second évènement souris de zone
-
0x10 Messages
-
0x20 Timer
-
int clicks: Nombre de clicks souris successifs attendus (l'évènement
sera déclenché si il y a au moins un click souris, mais la
fonction attend un peu pour voir si il n'y en a pas plus si on met une valeur
supérieure à 1 (pour détecter un double click par exemple))
-
int button: bouton de souris à attendre : 0x01 le plus à gauche
0x02, 0x04 de gauche à droite
-
int state: état du bouton à attendre: 0 levé, 1
abaissé
-
int m1out: 1er évènement position souris 0= dedans, 1= dehors
du rectangle désigné par x1, y1, w1, h1
-
int x1, y1, w1, h1: position et taille du rectangle pour le 1er
évènement souris
-
int m2out: idem m1out pour le second évènement souris
-
int x2, y2, w2, h2: position et taille du rectangle pour le second
évènement souris
-
int buffer[8]: tableau ou l'AES écrit les messages (voir evnt_mesag())
-
int lowtime, hightime: respectivement les 2 octets de poid faible et les
2 de poids fort pour le temps d'attente timer en millisecondes (ancienne
méthode, flag OLDWAY sur GCC, aesbind est d'ailleur erronée,
voir fichier partiellement corrigé sur ma page). Dans la méthode
moderne de passage de paramètres les 2 entiers sont remplacés
par un long, le temps en millisecondes est codé dans ce long.
-
int *xptr, *yptr: Coordonnées de la souris au moment de
l'évènement.
-
int *bptr: Etat des boutons souris au moment de l'évènement
-
int *kptr: Etat des touches spéciales du clavier:
-
0x0 Touches non enfoncées
-
0x1 Shift droit enfoncée
-
0x2 Shift gauche enfoncée
-
0x4 Control enfoncée
-
0x8 Alt enfoncée
-
int *key: Code clavier de la touche enfoncée pour l'octet de poids
fort et le code ASCII pour l'octet de poids faible.
-
int *times: nombres de clicks souris qui ont provoqués la sortie.
Olivier Landemarre