Limpando a saída de xev

0

OS: Sessão Openbox do Lubuntu 14.04

Digamos que eu corra xev e pressione a tecla Super , recebo muita saída (> 100 linhas) e a informação relevante está bem abaixo da saída como visto quando eu

  • executar xev | grep -in super
  • pressione super
  • e feche a janela pop-up xev .
$ 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,
$ 

Eu me deparei com um one-liner no wiki do Arch (wiki.archlinux.org/index.php/Extra_Keyboard_Keys#In_Xorg), que limpa drasticamente a saída (com certas exceções observadas 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

Eu 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 eu 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 saber o que o código faz?

    
por DK Bose 17.02.2016 / 14:21

1 resposta

2
awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
  • -F'[ )]+' diz awk para dividir a linha em qualquer número de espaços ou colchetes. Então, os campos em state 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 no número da linha + 2 na matriz a , para as linhas que começam com KeyPress .
  • NR in a verifica se o número da linha atual possui uma entrada na matriz a . Isso seria verdade se uma linha que começasse com KeyPress fosse duas linhas atrás.
  • Em seguida, ele imprime o quinto e o oitavo campos, que são 133 e Super_L , como pode ser visto no primeiro ponto.

xev output 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,

Assim, para cada pressionamento de tecla, a segunda linha depois disso tem o código e o nome.

    
por muru 17.02.2016 / 14:43