Manipulation des saisies de touche et de pointeur X sur la ligne de commande

20

Quels outils de ligne de commande existent pour répertorier et gérer les captures de serveur X? (C'est saisir comme dans les saisies de touches et de pointeurs, c'est-à-dire restreindre l'utilisation d'une touche ou d'un bouton de souris particulier à une application particulière, ou restreindre le pointeur de la souris pour qu'il reste dans une zone d'écran particulière.) Je recherche un xgrabutilitaire hypothétique qui montrer des choses comme

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

ce qui signifie qu'il ya eu un appel à XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)et ainsi de suite avec XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(si possible). Le format d'affichage n'a pas d'importance, ce que je veux, c'est un moyen de voir qui saisit quoi, et peut-être un moyen de révoquer ces captures (si c'est possible, je ne sais pas si l'API X11 le permet).

Gilles 'SO- arrête d'être méchant'
la source

Réponses:

21

Les versions récentes de X (serveur X.org ≥ 1.11) prennent en charge plusieurs clés de débogage, introduites dans ce commit . Lorsqu'elles sont déclenchées, elles exécutent des actions liées aux prises.

Par défaut ( au moins dans les versions récentes ), ceux-ci sont désactivés (absents du clavier par défaut).

Cependant, si vous l'avez xdotoolinstallé, il est possible de les appeler, en exécutant sur la ligne de commande:

xdotool key NameOfKey

NameOfKeyest le clavier que vous souhaitez activer. Par exemple, pour imprimer une liste des captures actives dans le journal du serveur X, utilisez xdotool key XF86LogGrabInfo.

Les synonymes clés pertinents sont les suivants:

Notez que XF86LogGrabInfone répertorie que les captures actives, pas les captures passives telles qu'une capture sur une touche qui n'est pas actuellement enfoncée. Si vous souhaitez obtenir des informations sur une saisie passive, vous devez activer la saisie: exécuter xdotool key XF86LogGrabInfopendant que la combinaison d'accords de touches ou de boutons de souris qui vous intéresse est enfoncée. Faites quelque chose comme:

  1. Courir sleep 1; xdotool key XF86LogGrabInfo
  2. Dans la seconde qui suit, appuyez sur l'accord de touches ou la combinaison de boutons de la souris.
  3. Après 1 seconde, relâchez la touche / le bouton.
  4. Vérifiez (souvent /var/log/Xorg.0.log) les informations «Capture active…» dans le journal du serveur X.
Escargot mécanique
la source
2
Tester maintenant sur Debian Wheezy avec Xorg 1.12.4, xdotool key XF86LogGrabInfone déclenche que deux entrées dans le journal X: «Impression de tous les récupérations de périphériques actuellement actifs:» immédiatement suivi de «Fin de la liste des récupérations de périphériques actifs». Pourtant, mon gestionnaire de fenêtres récupère un tas de clés. Avez-vous vu ce travail pour les clés saisies?
Gilles 'SO- arrête d'être méchant'
4
@ Gilles - non, vous n'obtiendrez aucune sortie si vous l'exécutez comme ça ... essayez de l'exécuter avec sleep 2; xdotool key "XF86LogGrabInfo"et commencez immédiatement à appuyer sur une touche (par exemple la touche "Win") très rapidement, alors vous verrez une sortie dans Xorg.log. Ou utilisez xdotoolpour appuyer sur les touches + XF86LogGrabInfoen même temps, comme ici
don_crissti
@don_crissti Ah, je vois, XF86LogGrabInfoimprime uniquement des informations sur une touche qui est actuellement enfoncée? Cela limite son utilité. Je veux énumérer toutes les captures - toutes les captures passives, si je comprends bien la terminologie.
Gilles 'SO- arrête d'être méchant'
Il existe probablement un moyen intelligent de combiner cela avec une recherche exhaustive par script des combinaisons de touches, espérons-le sans clavier virtuel. Certainement en dehors de mes connaissances.
Adam Katz
Merci! Cela m'a aidé à découvrir qui xfsettingsdvolait mon Win+ Lraccourci.
Mikel
8

Je ne connais rien de disponible pour les saisies passives 1 d'une seule touche ou d'un seul bouton qui peuvent être présents, mais il existe plusieurs façons de répertorier les saisies actives d'un clavier ou d'une souris.

  1. Sur toutes les plates-formes, mais uniquement avec Xorg 1.11 et versions ultérieures (ou une version antérieure avec le correctif appliqué), mappez les raccourcis clavier pour vider les données de capture dans le journal, comme décrit dans ces notes de correctif .
  2. Sous Solaris 11 (soit Solaris 11 Express 2010.11 ou la version actuelle de Solaris 11), utilisez les scripts de débogage tels que /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, comme décrit dans la section Grabbing Information from the X Server . Il y en a également un ici pour les captures de serveur, que les raccourcis clavier Xorg 1.11 ne couvrent pas actuellement.

1 Voir http://tronche.com/gui/x/xlib/input/pointer-grabbing.html pour la définition des saisies actives et passives.

alanc
la source
4

Ceci est un ajout à la réponse de Mechanical Snail -

Les entrées dans le journal Xorg peuvent être assez indéchiffrables. J'ai écrit un programme qui les analyse et les présente sous une forme humaine:

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

Pour l'utiliser, lancez d'abord xdotool key XF86LogGrabInfo, comme décrit dans la réponse de Mechanical Snail. Ensuite, exécutez le programme lié ci-dessus. Si votre fichier journal Xorg ne se trouve pas à /var/log/Xorg.0.log, vous pouvez spécifier son emplacement à l'aide de l' --xorg-logoption. Voir --helppour plus de détails.

Vladimir Panteleev
la source
1
L'essentiel mentionné ici est programmé en langage D. Pour obtenir un fichier exécutable, on peut installer des packages gdc(compilateur GNU D) libx11-devpuis exécuter gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Stéphane Gourichon