Volver al índice
; Próximo: Recursos
; Previo: Dibujando en X
El cliente especifica (XCreateWindow, XChangeWindowAttributes o
XSelectInputs) al servidor qué eventos debe notificarle en cada ventana. Las máscaras de
eventos disponibles y sus eventos asociados son:
Máscara Tipo de evento
------------ --------------
Button1MotionMask MotionNotify
Button2MotionMask MotionNotify
Button3MotionMask MotionNotify
Button4MotionMask MotionNotify
Button5MotionMask MotionNotify
ButtonMotionMask MotionNotify (any button)
ButtonPressMask ButtonPress
ButtonReleaseMask ButtonRelease
ColorMapChangeMask ColormapNotify
EnterWindowMask EnterNotify
ExposureMask Expose
FocusChangeMask FocusIn, FocusOut
KeymapStateMask KeymapNotify
KeyPressMask KeyPress
KeyReleaseMask KeyRelease
LeaveWindowMask LeaveNotify
NoEventMask None
OwnerGrabButtonMask None
PointerMotionHintMask None
PointerMotionMask MotionNotify
PropertyChangeMask PropertyNotify
ResizeRedirectMask ResizeRequest
StructureNotifyMask CirculateNotify,
ConfigureNotify,
DestroyNotify,
GravityNotify,
MapNotify,
ReparentNotify,
UnmapNotify
SubstructureNotifyMask CirculateNotify,
ConfigureNotify,
CreateNotify,
DestroyNotify,
GravityNotify,
MapNotify,
ReparentNotify,
UnmapNotify
SubstructureNotifyMask CirculateRequest,
ConfigureRequest,
MapRequest
VisibilityChangeMask VisibilityNotify
[Siempre seleccionados] MappingNotify,
ClientMessage,
SelectionClear,
SelectionNotify,
SelectionRequest
Hay numerosas funciones para obtener eventos de la cola con distintos modos de funcionamiento.
Ejemplos:
- XNextEvent. Modo bloqueante, cualquier evento de cualquier ventana.
- XMaskEvent. Modo bloqueante, eventos de cualquier ventana del tipo
especificado en la máscara que recibe como parámetro.
- XWindowEvent. Igual pero para una ventana específica.
- XCheck... Conjunto de rutinas no bloqueantes.
- XPeekEvent. Similar a XNextEvent pero no elimina de la cola el evento.
Los eventos del teclado y del ratón están vinculados con la ventana visible más pequeña que
contiene el puntero en ese instante. Hay tres casos en el mecanismo de
propagación:
- Si se ha seleccionado el evento en esa ventana, se notifica al cliente.
- Si no está seleccionado pero está incluido en do_not_propagate_mask, el evento no
se notifica.
- Si no está incluido en ninguna de las máscaras el evento se
propaga a la ventana padre y se repite el proceso hasta que se llegue a la ventana raíz.
El mecanismo de propagación descrito tiene dos excepciones:
En cada momento hay una ventana que tiene el enfoque del teclado. Los eventos del teclado
estarán asociados sólo a la ventana con el enfoque y sus descendientes. Dos casos:
- Si el puntero está fuera de estas ventanas, el evento se asocia a la ventana con enfoque.
- Si el puntero está dentro, se lleva a cabo el mecanismo de propagación habitual.
Por defecto el enfoque está en la ventana raiz y se cambia con la primitiva
XSetInputFocus. Normalmente, lo hace el gestor de ventanas.
Un cliente puede establecer un grab sobre el teclado o ratón para asegurarse de que todos
los eventos que produzca el dispositivo se le notifiquen sólo a él. Hay dos tipos:
- grab activo. Tiene lugar inmediatamente y se mantiene hasta que el cliente lo desactiva.
- grab pasivo. El programa especifica que la posesión tendrá lugar cuando se pulse una determinada tecla o botón del ratón y se mantendrá hasta
que se repita la acción.
Ademas del ratón y el teclado, un cliente puede tomar posesión del servidor evitando no sólo la
propagación de eventos a otros clientes sino también el procesamiento de sus
peticiones.
Cada evento lleva asociado una estructura XEvent que proporciona información detallada
sobre el evento. Algunos eventos:
- KeyPress, KeyRelease
- Tecla pulsada y liberada. La estrutura del evento contiene un código de tecla dependiente del
servidor. La aplicación debe usar XLookupString para obtener el valor ASCII.
- ButtonPress, ButtonRelease
- Respectivamente, botón del ratón pulsado y liberado.
- MotionNotify
- Indica que el ratón se ha movido. Hay tres tipos máscaras: PointerMotionMask (notifica
cualquier movimiento), PointerMotionHintMask (notifica los movientos de forma no continua)
y ButtonMotionMask (sólo notifica movimiento cuando un botón está pulsado).
- Expose
- Se genera un evento por cada zona de la ventana que se ha hecho visible.
- VisibilityNotify
- Notifica cambios en la visibilidad de una ventana.
- EnterWindow, LeaveWindow
- Informa que el puntero ha entrado o salido de una ventana respectivamente.
- PropertyNotify
- Indica que se han producido cambios en el valor asociado a una propiedad.
- ConfigureNotify
- Informa del cambio de configuración (geometría u orden de apilamiento) de una ventana.
- MapNotify
- Notifica que una ventana ha sido proyectada.
- SubstructureRedirectMask
- Cuando un cliente (y sólo uno) selecciona esta máscara sobre una ventana, las peticiones de
otros clientes para proyectar, cambiar la configuración o modificar el orden de apilamiento de una
ventana hija de la especificada, no las lleva a cabo el servidor sino que manda un evento al cliente
(redirección). Este mecanismo lo usa el gestor de ventanas.
- ClientMessage
- Usado para comunicación entre clientes. Está siempre
seleccionado.
Volver al índice
; Próximo: Recursos
; Previo: Dibujando en X