Estoy escribiendo una aplicación de línea de comandos que escucha los eventos de liberación de la tecla Control en X Windows y alerta a otro proceso cuando los detecta.¿Escuchando eventos de teclado sin atraparlos?
Siendo nuevo en GNU/Linux, preferiría evitar perder el tiempo con GCC y, por lo tanto, estoy buscando una solución basada en scripts. Como conozco un poco de Python, me pareció natural buscar una solución basada en Python, y después de buscar en Internet ejemplos y leer documentos de Python Xlib, he creado estos programas que funcionan, pero con una advertencia: atrapa eventos en lugar de solo escucharlos (me refiero a que dichos eventos ya no se pasan a la aplicación a la que fueron dirigidos en primer lugar).
He rastreado los códigos de las teclas de control ejecutando "xev". Como he reasignado mis teclas modificadoras, en su sistema pueden ser diferentes.
Para simplificar, he omitido el código que trata sobre el proceso externo.
Gracias por su ayuda.
software:
Python 2.7.2
Python Xlib 0.15 RC1
Perl v5.10.1
versiónDebian GNU/Linux: 6.0.3
Kernel v ersion: Debian Linux 2.6.32-5-686
EDIT: Lo que no puedo entender es que los eventos de teclado no se quedan atrapados menos que se transformen (en mis programas, esto significa que la línea de 'imprimir "KeyRelease" se ejecuta). Como en mi código no invoco ningún método ni en Xlib ni en el objeto de evento, no entiendo dónde se encuentra la diferencia de procesamiento.
EDIT2: Sugerencias sobre soluciones alternativas además de usar Xlib también son bienvenidas.
EDIT3: conozco Perl y también son bienvenidas las sugerencias sobre bibliotecas Perl que pueden ser útiles, siempre que no requieran versiones recientes de bibliotecas de sistemas, ya que Debian se retrasa notoriamente en cuanto a paquetes disponibles en su repositorios, y la compilación e instalación de las últimas versiones de las bibliotecas puede ser difícil si tienen muchas dependencias (he intentado instalar PyGTK, pero renuncié después de no hacer referencia a un GLib actualizado que había instalado).
#!/usr/bin/env python
from Xlib.display import Display
from Xlib import X
Control_R = 64 # Keycode for right Control.
Control_L = 108 # Keycode for left Control.
keycodes = [Control_R, Control_L] # Keycodes we are listening for.
# Handle X events.
def handle_event(event):
# Let us know whether this event is about a Key Release of
# one of the key we are interest in.
if event.type == X.KeyRelease:
keycode = event.detail
if keycode in keycodes:
print "KeyRelease"
# Objects needed to call Xlib.
display = Display()
root = display.screen().root
# Tell the X server we want to catch KeyRelease events.
root.change_attributes(event_mask = X.KeyReleaseMask)
# Grab those keys.
for keycode in keycodes:
root.grab_key(keycode, X.AnyModifier, 1, X.GrabModeAsync, X.GrabModeAsync)
# Event loop.
while 1:
event = root.display.next_event()
handle_event(event)
Su comentario me permitió elaborar la respuesta a mi pregunta. Gracias. –