Événements de franchissement (X11)
EnterNotify et LeaveNotify, les événements que le serveur X envoie quand le pointeur franchit la limite d'une fenêtre — à la base des effets de survol, du focus-suit-la-souris et d'une bonne dose de confusion.
Chaque fois que le pointeur quitte une fenêtre pour en atteindre une autre, le serveur envoie LeaveNotify à la première et EnterNotify à la seconde, à condition que le client les ait demandés avec EnterWindowMask et LeaveWindowMask dans son masque d'événements. Les fenêtres forment un arbre : passer d'une petite-fille dans une application à une fenêtre d'une autre traverse plusieurs fenêtres intermédiaires, qui sont prévenues elles aussi, avec des événements marqués virtuels. Le champ detail indique où se situe l'autre fenêtre dans la hiérarchie : NotifyAncestor, NotifyInferior, NotifyNonlinear et leurs variantes virtuelles. Le champ mode dit si le pointeur a réellement bougé ou si l'événement n'est que l'effet secondaire d'une capture prise ou relâchée par quelqu'un.
Les gestionnaires de fenêtres en mode focus suit la souris ne font rien de plus qu'écouter EnterNotify sur les cadres des clients et appeler XSetInputFocus. Les infobulles, les boutons qui s'allument et les menus qui se déplient au survol relèvent de la même mécanique, un étage plus bas. La confusion vient du fait que le serveur génère des événements de franchissement alors que le pointeur n'a pas bougé : une fenêtre mappée ou démappée en dessous, une capture qui ouvre un menu, un gestionnaire qui réarrange les cadres. Un programme qui suppose que chaque LeaveNotify signifie que l'utilisateur est parti perd ses infobulles en plein clic, et NotifyInferior, qui signifie que le pointeur est entré dans l'un de vos propres enfants au lieu de partir, est l'erreur que tout le monde commet une fois.