Чистка вывода xev

ОС: сессия Openbox Lubuntu 14.04

Скажем, я работаю xev и нажмите Super ключ, я получаю большой вывод (> 100 строк), и релевантная информация является путем вниз вывод, как замечено когда я

  • выполненный xev | grep -in super
  • пресса super
  • и затем близко 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,
$ 

Я столкнулся с остротой в Wiki Arch (wiki.archlinux.org/index.php/Extra_Keyboard_Keys#In_Xorg), который существенно очищает вывод (за определенными исключениями, отмеченными в ссылке):

xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'

Объемы производства сокращены только к:

133 Super_L

Я хочу знать, как код Wiki Arch делает свое волшебство. Все, что я могу предположить, - то, что это так или иначе анализирует вывод, запускающийся с KeyPress но после этого я ничего не понимаю:

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: 

Кто-то может любезно идти через то, что делает код?

0
задан 17 February 2016 в 16:30

1 ответ

awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
  • -F'[ )]+' говорит awk разделять строку на любом количестве пробелов или скобок. Так, поля в state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES, были бы:

              # empty field
    state
    0x0,
    keycode
    133
    (keysym 
    0xffeb,
    Super_L
    ,
    same_screen
    YES,
    
  • /^KeyPress/ { a[NR+2] } создает пустую запись в номере строки + 2 в массиве a, для строк, начинающихся KeyPress.
  • NR in a проверки, если текущий номер строки имеет запись в массиве a. Это было бы верно, если бы строка, начинающаяся KeyPress, прибыла две строки назад.
  • Затем это печатает пятые и восьмые поля, которые являются 133 и Super_L как видно в первой точке.

xev вывод на самом деле похож:

$ 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,

Так, для каждого нажатия клавиши, вторая строка после этого имеет код клавиши и имя.

2
ответ дан 24 July 2019 в 10:50

Другие вопросы по тегам:

Похожие вопросы: