Manipular a tecla X e o ponteiro agarra na linha de comando

20

Quais ferramentas de linha de comando existem para listar e gerenciar as capturas do servidor X? (Isso é o mesmo que ocorre nas capturas de teclas e ponteiros, ou seja, restringir o uso de uma tecla ou botão do mouse em particular a um aplicativo específico ou restringir o ponteiro do mouse a permanecer em uma área específica da tela.) Estou procurando um xgrabutilitário hipotético que mostrar coisas como

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

o que significa que houve uma chamada para XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)e assim por diante com XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(se possível). O formato de exibição não importa, o que eu quero é uma maneira de ver quem está pegando o que e, possivelmente, alguma maneira de revogar essas garras (se possível, não tenho certeza se a API do X11 permite isso).

Gilles 'SO- parar de ser mau'
fonte

Respostas:

21

Versões recentes do X (servidor X.org ≥1,11) suportam vários keyyms de depuração, introduzidos neste commit . Quando acionados, eles executam ações relacionadas a agarra.

Por padrão ( pelo menos nas versões recentes ), elas estão desabilitadas (ausentes no mapa de teclas padrão).

No entanto, se você xdotoolinstalou, é possível chamá-los, executando na linha de comando:

xdotool key NameOfKey

Onde NameOfKeyestá o teclado que você deseja ativar. Por exemplo, para imprimir uma lista de capturas ativas no log do servidor X, use xdotool key XF86LogGrabInfo.

Keyyms relevantes são:

Observe que XF86LogGrabInfoapenas lista as capturas ativas, e não passivas, como a captura de uma tecla que não está pressionada no momento. Se você deseja obter informações sobre uma captura passiva, precisa ativar a captura: corra xdotool key XF86LogGrabInfoenquanto a combinação de acordes de teclas ou botão do mouse em que você está interessado é pressionada. Faça algo como:

  1. Corre sleep 1; xdotool key XF86LogGrabInfo
  2. Em 1 segundo, pressione a combinação de acordes de teclas ou botão do mouse.
  3. Após 1 segundo, solte a tecla / botão.
  4. Verifique as informações de “captura ativa…” no log do servidor X (frequentemente /var/log/Xorg.0.log).
Caracol mecânico
fonte
2
Testando agora no Debian wheezy com o Xorg 1.12.4, xdotool key XF86LogGrabInfodispara apenas duas entradas no log do X: “Imprimindo todas as capturas de dispositivos atualmente ativas:” imediatamente seguidas por “Finalizar lista de capturas de dispositivos ativas”. No entanto, meu gerenciador de janelas pega um monte de chaves. Você já viu esse trabalho para pegar as chaves?
Gilles 'SO- stop be evil'
4
@Gilles - não, você não obterá nenhuma saída se a executar dessa maneira ... tente executá-la sleep 2; xdotool key "XF86LogGrabInfo"e imediatamente comece a pressionar uma tecla (por exemplo, a tecla "Win") muito rápido, e então verá alguma saída em Xorg.log. Ou o uso xdotoolde chaves de imprensa + XF86LogGrabInfo, ao mesmo tempo, como aqui
don_crissti
@don_crissti Ah, entendo, XF86LogGrabInfoapenas imprime informações sobre uma tecla que está pressionada no momento? Isso limita sua utilidade. Quero listar todas as capturas - todas as capturas passivas, se entender a terminologia corretamente.
Gilles 'SO- stop be evil'
Provavelmente, existe uma maneira inteligente de combinar isso com uma pesquisa exaustiva e por script de combinações de teclas, sem a necessidade de um teclado virtual. Certamente fora do meu conhecimento.
Adam Katz
Obrigado! Isso me ajudou a descobrir que xfsettingsdestava roubando meu Win+ Latalho.
Mikel
8

Não conheço nada de improviso para as garras passivas 1 de uma única tecla ou botão que possam estar presentes, mas existem algumas maneiras de listar as garras ativas de um dispositivo de teclado ou mouse inteiro.

  1. Em todas as plataformas, mas apenas com o Xorg 1.11 e posterior (ou uma versão mais antiga com o patch aplicado), mapeie as teclas de atalho para despejar dados de captura no log, conforme descrito nestas notas de patch .
  2. No Solaris 11 (Solaris 11 Express 2010.11 ou na versão atual do Solaris 11), use os scripts do depurador /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, como descrito em Agarrando informações do X Server . Há também um aqui para servidores, que as teclas de atalho do Xorg 1.11 atualmente não cobrem.

1 Consulte http://tronche.com/gui/x/xlib/input/pointer-grabbing.html para obter a definição de agarra ativa versus passiva.

alanc
fonte
4

Esta é uma adição à resposta do Mechanical snail -

As entradas no log do Xorg podem ser bastante indecifráveis. Eu escrevi um programa que os analisa e os apresenta de uma forma tratável por humanos:

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

Para usar, execute primeiro xdotool key XF86LogGrabInfo, conforme descrito na resposta do Mechanical snail. Em seguida, execute o programa vinculado acima. Se o arquivo de log do Xorg não estiver localizado em /var/log/Xorg.0.log, você poderá especificar sua localização usando a --xorg-logopção Veja --helppara detalhes.

Vladimir Panteleev
fonte
11
A essência mencionada aqui é programada na linguagem D. Para obter um arquivo executável, é possível instalar pacotes gdc(compilador GNU D) e libx11-devdepois executar gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Stéphane Gourichon