ОС: сессия 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:
Кто-то может любезно идти через то, что делает код?
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,
Так, для каждого нажатия клавиши, вторая строка после этого имеет код клавиши и имя.