Les champs détail et mode
Ces deux champs sont renseignés lors de réception d'évènements.
Ces champs se retrouvent sous les types d'évènements suivant:
- XFocusEvent
- EnterNotify et LeaveNotify qui renseigne XCrossingEvent pour la gestion de la souris.
Le champ détail
int detail Ce champ indique la position de la fenêtre dans la hiérachie par rapport à celle qui va recevoir ou celle pour qui la souris sort de sa zone cliente.
Ce champ peut prendre les valeurs NotifyAncestor, NotifyVirtual, NotifyInferior, NotifyNonlinear ou NotifyNonlinearVirtual.
Détail à NotifyAncestor ou NotifyInferior
Cas de deux fenêtres dans une relation de parenté directe, ces deux détails permettent de d'avoir des informations sur le déplacement de la souris: la souris entre ou sort de la fenêtre parent (NotifyAncestor) ou de la fenêtre fille (NotifyInferior)
Soit F1 une fenêtre et F2 une fenêtre fille, la souris passe de F1 à F2:
Fenêtres | Evènements | Détail | |
F1 | LeaveNotify | La souris sort de F1 pour aller vers... | NotifyInferior(avec un champ subwindow à F2) |
F2 | EnterNotify | La souris entre dans F2 en provenance de... | NotifyAncestor |
Maintenant, la souris passe de F2à F1:
Fenêtres | Evènements | Explication | Détail |
F1 | EnterNotify | La souris entre dans F1 en provenance de... | NotifyInferior |
F2 | LeaveNotify | La souris sort de F2 pour aller vers... | NotifyAncestor |
Détail à NotifyVirtual
Cas de n fenêtres toutes descendantes l'une de l'autre (arborescence verticale)
F1->F2->Fn-1->Fn
Si la souris passe de F1 à Fn ou de Fn à F1, toutes les fenêtres intermédiaires recevront un évènement EnterNotify ou LeaveNotify (suivant le sens du déplacement !). On dit que ces fenêtres intermédiaires sont traversées virtuellement et elles recevront comme détail NotifyVirtual.
Détail NotifyNonlinear et NotifyNonlinearVirtual
Cette fois-ci, il n'y a plus de parenté vertical. F1 et fn se trouvent donc n'importe où dans l'arborescence des fenêtres (voir les fenêtres ne sont pas sur le même écran !).
Dans ce cas, les fenêtres F1 et Fn recevront NotifyNonlinear et les fenêtres intermédiaires permettant de joindre les deux fenêtres extrèmes (sauf l'ancètre commun qui en est exclu) auront le champ détail à NotifyNonlinearVirtual. Les fenêtres qui sont quittées, recevront un LeaveNotify, toutes celles qui reçoivent (même virtuellement) la souris recevront un EnterNotify.
Pour simplifier le champ détail
Si une fenêtre reçoit un évènement et que le détail indique NotifyVirtual ou NotifyNonLinearVirtual, alors on peut généralement ignorer l'évènement. Le type d'évènement en question ne faisant que traverser notre fenêtre pour arriver à sa destination.
Le champ mode
int mode peut prendre les valeurs NotifyNormal, NotifyGrab ou NotifyUngrab et indique que l'événement provient d'un mouvement normal ou d'un début ou fin de processus de saisie.
Par exemple soit F1 et F2 fille de F1.
Si l'utilisateur clique sur F2 et sort le curseur de celle-ci pour aller dans F1, F2 recevra un évènement LeaveNotify de détail NotifyAncestor (on passe sur la fenêtre parent) de mode NotifyNormal pour annoncer la sortie de la souris.
Ce n'est qu'au moment où l'utilisateur lâchera le bouton de la souris que :
- F1 recevra un évènement EnterNotify (jusqu'à présent, la souris était toujours lié à F2 car bouton non relâché) de détail NotifyInferior (on passe de F2 fille à F1) mode NotifyUngrab pour indiquer la fin de saisie sur F2.
- F2 recevra un évènement LeaveNotify (pour annoncer la sortie de la souris) de détail NotifyAncestor (on passe sur la fenêtre parent) de mode NotifyUngrab pour indiquer la fin de saisie sur F2.
Bien entendu, il pourra y avoir là aussi plusieurs évènements envoyés dans différentes fenêtres à cause du champ détail...