xinput test
pode relatar todos os eventos do teclado para o servidor X. Em um sistema GNU:
xinput list |
grep -Po 'id=\K\d+(?=.*slave\s*keyboard)' |
xargs -P0 -n1 xinput test
Se você deseja obter os nomes das chaves, poderá pós-processar essa saída com:
awk 'BEGIN{while (("xmodmap -pke" | getline) > 0) k[$2]=$4}
{print $0 "[" k[$NF] "]"}'
Adicionar > file.log
para armazenar em um arquivo de log. Ou | tee file.log
para logar e vê-lo.
xinput
consulta o XinputExtension do servidor X. Isso é o mais próximo que você vai conseguir de um padrão (não conheço nenhum padrão que cubra os utilitários X) ou um comando comum para fazer isso. Isso também não requer privilégios de root.
Se o servidor X e o xinput suportarem a versão 2 do XinputExtension, você poderá usar, em test-xi2
vez disso test
, para obter mais informações, em particular o estado dos modificadores (shift, ctrl, alt ...). Exemplo:
$ xinput test-xi2 --root
EVENT type 2 (KeyPress)
device: 11 (11)
detail: 54
flags:
root: 846.80/451.83
event: 846.80/451.83
buttons:
modifiers: locked 0 latched 0 base 0x4 effective: 0x4
group: locked 0 latched 0 base 0 effective: 0
valuators:
windows: root 0x26c event 0x26c child 0x10006e6
Você pode traduzir o código-chave (in detail
) em um chaveiro com a ajuda de xmodmap -pke
novamente, e o effective
modificador bitmask para algo mais útil com a ajuda de xmodmap -pm
. Por exemplo:
xinput test-xi2 --root | perl -lne '
BEGIN{$"=",";
open X, "-|", "xmodmap -pke";
while (<X>) {$k{$1}=$2 if /^keycode\s+(\d+) = (\w+)/}
open X, "-|", "xmodmap -pm"; <X>;<X>;
while (<X>) {if (/^(\w+)\s+(\w*)/){($k=$2)=~s/_[LR]$//;$m[$i++]=$k||$1}}
close X;
}
if (/^EVENT type.*\((.*)\)/) {$e = $1}
elsif (/detail: (\d+)/) {$d=$1}
elsif (/modifiers:.*effective: (.*)/) {
$m=$1;
if ($e =~ /^Key/){
my @mods;
for (0..$#m) {push @mods, $m[$_] if (hex($m) & (1<<$_))}
print "$e $d [$k{$d}] $m [@mods]"
}
}'
produziria:
KeyPress 24 [q] 0x19 [Shift,Alt,Num_Lock]
quando pressiono Shift + Alt + q quando o num-lock está ativado.
Observe que você não precisa ter privilégios de superusuário para instalar um programa. Se você tiver acesso de gravação para algum lugar no sistema de arquivos onde executar permissão é concedida (seu diretório home, /tmp
, /var/tmp
...), então você pode copiar um xinput
comando a partir de um sistema compatível lá e executá-lo.