`xdotool` non invia le chiavi


8

Sto cercando di inviare le sequenze di tasti tramite xdotool. Tuttavia, l'invio non funziona correttamente.

Di seguito è riportato il registro di uno script che dovrebbe selezionare tutto il testo in Gedit e copiarlo (ma non fa nulla), insieme al suo output (catturato reindirizzando sia stdout che stderr):

+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1

Ho provato con Thunderbird e lo script invia le chiavi, ma senza modificatori (no Control, cioè). A proposito, nella sceneggiatura, le chiavi sono circondate ", come "ctrl+a".

La differenza tra Gedit e Thunderbird potrebbe essere che Gedit è un'applicazione GTK3, mentre Thunderbird sembra un'applicazione GTK2 (ma Firefox, che sembra un'applicazione GTK3, si comporta come Thunderbird).

xdotool versione 3.20141006.1
Sistema operativo: Debian GNU / Linux 8.1 (kernel Linux 3.16.0-4-amd64)
Desktop Manager: GNOME Shell 3.14.4


1
se lo usi, xbindkeysdevi rilasciare i tasti che attivano lo script xdotool keyup ...per un funzionamento affidabile
grabantot

Risposte:


7

Quando un evento tastiera o mouse viene generato da un'applicazione anziché da una periferica di input, tale evento viene contrassegnato come "sintetico". Molte applicazioni rifiutano eventi sintetici.

In teoria, c'è un motivo di sicurezza per questo - potresti eseguire un'applicazione sul tuo display X ma con un account diverso o su un computer diverso - ma X è così male nell'isolare le applicazioni (non è mai stato progettato per quello) che non dovresti consentire alle applicazioni non attendibili di accedere al display. E se non lo fai, non c'è motivo di rifiutare eventi sintetici.

Per quanto ne so, Gtk non offre un modo generico per decidere se consentire eventi sintetici. Dipende dalle singole applicazioni e non so quale sia l'impostazione predefinita se al programmatore non importa.

C'è un altro modo per iniettare eventi di input, con l'estensione XTEST. Gli eventi iniettati in questo modo appaiono esattamente come gli eventi di una periferica di input: effettivamente, provengono da una periferica di input "test". L'aspetto negativo di questo approccio è che vengono indirizzati a una finestra allo stesso modo di qualsiasi altro evento, quindi vengono inviati alla finestra che ha lo stato attivo (a meno che non venga intercettato dal gestore della finestra). Puoi inviare eventi XTEST con (versioni sufficientemente recenti di) xdotool, ecco cosa fa se non passi un ID finestra.

xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c

Sì, è fastidioso. Puoi trovare una discussione di questo problema sul Selenium wiki . Sembra che ci sia un modo per inviare eventi falsi a un'applicazione GTK + tramite segnali GTK o eventi GDK, ma non so come funzioni.

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.