SO: sessão Openbox do Lubuntu 14.04
Digamos que eu corra xev
e pressione a Super
tecla, recebo muita saída (>100 linhas) e as informações relevantes estão bem abaixo da saída, como visto quando eu
- correr
xev | grep -in super
- imprensa
super
- e feche a
xev
janela pop-up.
$ xev | grep -in super
122: state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
129: state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
$
Me deparei com uma linha no wiki do Arch (wiki.archlinux.org/index.php/Extra_Keyboard_Keys#In_Xorg) que limpa drasticamente a saída (com certas exceções anotadas no link):
xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
A saída é reduzida para apenas:
133 Super_L
Quero saber como o código wiki do Arch faz sua mágica. Tudo o que posso imaginar é que de alguma forma está analisando a saída começando com, KeyPress
mas depois disso não entendo nada:
KeyPress event, serial 48, synthetic NO, window 0x2800001,
root 0x7e, subw 0x0, time 13500391, (362,697), root:(363,760),
state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
Alguém pode gentilmente explicar o que o código faz?
Responder1
awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
-F'[ )]+'
dizawk
para dividir a linha em qualquer número de espaços ou colchetes. Então, os camposstate 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
seriam:# empty field state 0x0, keycode 133 (keysym 0xffeb, Super_L , same_screen YES,
/^KeyPress/ { a[NR+2] }
cria uma entrada vazia na linha número + 2 na matriza
, para linhas que começam comKeyPress
.NR in a
verifica se o número da linha atual possui uma entrada em arraya
. Isso seria verdade se uma linha começando comKeyPress
surgisse duas linhas atrás.- Em seguida imprime o quinto e o oitavo campos, que são
133
eSuper_L
como pode ser visto no primeiro ponto.
xev
a saída realmente se parece com:
$ xev
...
KeyPress event, serial 36, synthetic NO, window 0x2a00001,
root 0x29c, subw 0x0, time 217441518, (91,162), root:(91,697),
state 0x10, keycode 134 (keysym 0xffec, Super_R), same_screen YES,
Portanto, para cada pressionamento de tecla, a segunda linha seguinte contém o código-chave e o nome.