Manipulando la tecla X y el puntero en la línea de comando


20

¿Qué herramientas de línea de comando existen para enumerar y administrar las capturas de servidor X? (Eso es agarrar como en las capturas de teclas y punteros, es decir, restringir el uso de una tecla o botón de mouse en particular a una aplicación en particular, o restringir el puntero del mouse para que permanezca en un área de pantalla en particular). Estoy buscando una xgrabutilidad hipotética que podría mostrar cosas como

Key     0x00f00ba5  0x123   0
Button  0x00f00ba5  2       
Pointer 0x00abcdef  

lo que significa que ha habido una llamada a XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)y así sucesivamente con XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(si es posible). El formato de visualización no importa, lo que quiero es una forma de ver quién está agarrando qué, y posiblemente alguna forma de revocar estas capturas (si es posible, no estoy seguro de si la API X11 lo permite).

Respuestas:


21

Las versiones recientes de X (servidor X.org ≥1.11) admiten varios símbolos de claves de depuración, introducidos en esta confirmación . Cuando se activan, realizan acciones relacionadas con los acaparamientos.

Por defecto ( al menos en versiones recientes ), estos están deshabilitados (ausentes del mapa de teclas predeterminado).

Sin embargo, si ha xdotoolinstalado, es posible llamarlos, ejecutando en la línea de comandos:

xdotool key NameOfKey

¿Dónde NameOfKeyestá el teclado que quieres activar? Por ejemplo, para imprimir una lista de capturas activas en el registro del servidor X, use xdotool key XF86LogGrabInfo.

Los keyyms relevantes son:

Tenga en cuenta que XF86LogGrabInfosolo enumera capturas activas, no capturas pasivas, como una captura de una tecla que no está presionada actualmente. Si desea obtener información sobre una captura pasiva, debe activar la captura: ejecutar xdotool key XF86LogGrabInfomientras se presiona la combinación de teclas o el botón del mouse que le interesa. Haz algo como:

  1. correr sleep 1; xdotool key XF86LogGrabInfo
  2. Dentro de 1 segundo, presione la combinación de teclas o el botón del mouse.
  3. Después de 1 segundo, suelte la tecla / botón.
  4. Verifique la información de "Captura activa ..." en el registro del servidor X (a menudo /var/log/Xorg.0.log).

2
Al probar ahora en Debian wheezy con Xorg 1.12.4, xdotool key XF86LogGrabInfosolo se activan dos entradas en el registro X: “Imprimir todas las capturas de dispositivos actualmente activas:” seguido inmediatamente por “Finalizar lista de capturas de dispositivos activas”. Sin embargo, mi administrador de ventanas toma algunas llaves. ¿Has visto este trabajo para las llaves agarradas?
Gilles 'SO- deja de ser malvado'

44
@Gilles: no, no obtendrá ningún resultado si lo ejecuta así ... intente ejecutarlo sleep 2; xdotool key "XF86LogGrabInfo"e inmediatamente comience a presionar una tecla (por ejemplo, la tecla "Win") muy rápido, luego verá algo de salida en Xorg.log. O use xdotoolpara presionar las teclas + XF86LogGrabInfoal mismo tiempo, como aquí
don_crissti

@don_crissti Ah, ya veo, ¿ XF86LogGrabInfosolo imprime información sobre una tecla que está presionada actualmente? Eso limita su utilidad. Quiero enumerar todas las capturas, todas las capturas pasivas, si entiendo la terminología correctamente.
Gilles 'SO- deja de ser malvado'

Probablemente haya una forma inteligente de combinar esto con una búsqueda exhaustiva de combinaciones de teclas, con suerte sin un teclado virtual. Ciertamente fuera de mi conocimiento.
Adam Katz

¡Gracias! Esto me ayudó a descubrir que xfsettingsdestaba robando mi atajo Win+ L.
Mikel

8

No sé nada de las manos para las capturas pasivas 1 de una sola tecla o botón que puede estar presente, pero hay un par de maneras de enumerar las capturas activas de un dispositivo de teclado o mouse completo.

  1. En todas las plataformas, pero solo con Xorg 1.11 y posterior (o una versión anterior con el parche aplicado), asigne teclas de acceso rápido para volcar datos de captura en el registro como se describe en estas notas del parche .
  2. En Solaris 11 (ya sea Solaris 11 Express 2010.11 o la liberación real Solaris 11), utilizar los scripts depurador tales como /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, como se describe en Información Grabbing desde el Servidor X . También hay uno aquí para obtener el servidor, que las teclas de acceso rápido Xorg 1.11 no cubren actualmente.

1 Consulte http://tronche.com/gui/x/xlib/input/pointer-grabbing.html para la definición de agarres activos frente a pasivos.


4

Esta es una adición a la respuesta del caracol mecánico:

Las entradas en el registro de Xorg pueden ser bastante indescifrables. Escribí un programa que los analiza y los presenta en una forma manejable por humanos:

https://gist.github.com/CyberShadow/6412d11aea64144f8905cc0b8196f38e

Para usar, primero ejecute xdotool key XF86LogGrabInfo, como se describe en la respuesta del caracol mecánico. Luego, ejecute el programa vinculado anteriormente. Si su archivo de registro Xorg no se encuentra en /var/log/Xorg.0.log, puede especificar su ubicación utilizando la --xorg-logopción. Ver --helppara más detalles.


1
La esencia mencionada aquí está programada en el lenguaje D. Para obtener un archivo ejecutable, uno puede instalar paquetes gdc(compilador GNU D) y libx11-devluego ejecutarlo gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Stéphane Gourichon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.