Manipolazione del tasto X e del puntatore sulla riga di comando


20

Quali strumenti da riga di comando esistono per elencare e gestire le prese del server X? (Questo è come per i tasti e per i puntatori, cioè per limitare l'uso di un determinato tasto o pulsante del mouse a una particolare applicazione o costringere il puntatore del mouse a rimanere in una determinata area dello schermo.) Sto cercando xgrabun'utilità ipotetica che sarebbe mostra cose come

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

il che significa che c'è stata una chiamata a XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)e così via con XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(se possibile). Il formato di visualizzazione non ha importanza, quello che voglio è un modo per vedere chi sta afferrando cosa, e forse un modo per revocare queste prese (se è possibile, non sono sicuro che l'API X11 lo consenta).

Risposte:


21

Le versioni recenti di X (server X.org ≥1.11) supportano diverse palestre di debug, introdotte in questo commit . Quando attivati, eseguono azioni correlate alle prese.

Per impostazione predefinita ( almeno nelle versioni recenti ), questi sono disabilitati (assenti dalla keymap predefinita).

Tuttavia, se è stato xdotoolinstallato, è possibile chiamarli, eseguendo dalla riga di comando:

xdotool key NameOfKey

dov'è NameOfKeyil keysym che vuoi attivare. Ad esempio, per stampare un elenco di grab attivi sul registro del server X, utilizzare xdotool key XF86LogGrabInfo.

Le relative palestre sono:

Nota che XF86LogGrabInfoelenca solo le prese attive, non le prese passive come una presa su un tasto che non è attualmente premuto. Se vuoi ottenere informazioni su una presa passiva, devi attivare la presa: corri xdotool key XF86LogGrabInfomentre viene premuto l'accordo con i tasti o la combinazione di pulsanti del mouse che ti interessa. Fai qualcosa come:

  1. Correre sleep 1; xdotool key XF86LogGrabInfo
  2. Entro 1 secondo, premere l'accordo con i tasti o la combinazione di pulsanti del mouse.
  3. Dopo 1 secondo, rilasciare il tasto / pulsante.
  4. Controlla le informazioni "Active grab ..." nel registro del server X (spesso /var/log/Xorg.0.log).

2
Testando ora su Debian wheezy con Xorg 1.12.4, xdotool key XF86LogGrabInfoinnesca solo due voci nel registro X: “Stampa di tutte le prese di dispositivi attualmente attive:” immediatamente seguite da “Elenco finale delle prese di dispositivi attivi”. Eppure il mio window manager prende un mazzo di chiavi. Hai visto questo lavoro per le chiavi afferrate?
Gilles 'SO- smetti di essere malvagio'

4
@Gilles - no, non otterrai alcun output se lo esegui in quel modo ... prova a eseguirlo sleep 2; xdotool key "XF86LogGrabInfo"e inizia subito a premere un tasto (ad esempio il tasto "Win") molto velocemente, quindi vedrai un output in Xorg.log. Oppure usa xdotoolper premere i tasti + XF86LogGrabInfoallo stesso tempo, come qui
don_crissti

@don_crissti Ah, vedo, XF86LogGrabInfostampa solo informazioni su un tasto attualmente premuto? Ciò limita la sua utilità. Voglio elencare tutte le prese - tutte le prese passive, se capisco correttamente la terminologia.
Gilles 'SO- smetti di essere malvagio' il

C'è probabilmente un modo intelligente di combinare questo con una ricerca esaustiva con script delle combinazioni di tasti, si spera senza una tastiera virtuale. Certamente al di fuori delle mie conoscenze.
Adam Katz,

Grazie! Questo mi ha aiutato a scoprire che xfsettingsdstava rubando la mia Win+ Lscorciatoia.
Mikel,

8

Non so nulla di manuale per le prese passive 1 di un singolo tasto o pulsante che potrebbero essere presenti, ma ci sono un paio di modi per elencare le prese attive di un intero dispositivo tastiera o mouse.

  1. Su tutte le piattaforme, ma solo con Xorg 1.11 e versioni successive (o una versione precedente con la patch applicata), mappare i tasti di scelta rapida per scaricare i dati sul log come descritto in queste note sulla patch .
  2. Su Solaris 11 (Solaris 11 Express 2010.11 o l'attuale versione di Solaris 11), utilizzare gli script di debugger come /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, come descritto in Informazioni sull'acquisizione da X Server . Ce n'è anche uno qui per i server grab, che attualmente i tasti di scelta rapida Xorg 1.11 non coprono.

1 Vedere http://tronche.com/gui/x/xlib/input/pointer-grabbing.html per la definizione di prese attive o passive.


4

Questa è un'aggiunta alla risposta della lumaca meccanica -

Le voci nel registro Xorg possono essere piuttosto indecifrabili. Ho scritto un programma che li analizza e li presenta in una forma trattabile dall'uomo:

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

Da usare, prima esecuzione xdotool key XF86LogGrabInfo, come descritto nella risposta della lumaca meccanica. Quindi, esegui il programma collegato sopra. Se il file di registro di Xorg non si trova in /var/log/Xorg.0.log, è possibile specificare la sua posizione utilizzando l' --xorg-logopzione. Vedi --helpper i dettagli.


1
L'essenza menzionata qui è programmata nella lingua D. Per ottenere un file eseguibile, è possibile installare i pacchetti gdc(compilatore D GNU) ed libx11-deveseguire gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Stéphane Gourichon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.