FocusIn y FocusOut
La pareja de eventos que el servidor X envía cuando el foco del teclado pasa de una ventana a otra: técnicamente impecable y, justamente por eso, casi imposible de interpretar bien.
El foco se fija con XSetInputFocus, normalmente desde el gestor de ventanas, y cada ventana que haya seleccionado FocusChangeMask y se vea afectada recibe un FocusOut o un FocusIn. Parece sencillo hasta que se miran los campos. mode distingue los cambios normales de los provocados por el inicio o fin de una captura de teclado (NotifyGrab, NotifyUngrab, NotifyWhileGrabbed). detail admite ocho valores —NotifyAncestor, NotifyVirtual, NotifyInferior, NotifyNonlinear, NotifyNonlinearVirtual, NotifyPointer, NotifyPointerRoot y NotifyDetailNone— que describen de dónde venía el foco en el árbol de ventanas y adónde fue.
La especificación dedica páginas a qué ventanas reciben qué combinación. La mayoría de los programas leen el tipo de evento, ignoran los casos NotifyPointer y cruzan los dedos. El resultado es el clásico fallo de X: un cursor parpadeando en dos ventanas a la vez, o en ninguna.