SO: sesión Openbox de Lubuntu 14.04
Digamos que ejecuto xev
y presiono la Super
tecla, obtengo una gran cantidad de resultados (>100 líneas) y la información relevante está muy por debajo de la salida, como se ve cuando ejecuto
- correr
xev | grep -in super
- prensa
super
- y luego cierre la
xev
ventana emergente.
$ 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 encontré con una frase en la wiki de Arch (wiki.archlinux.org/index.php/Extra_Keyboard_Keys#In_Xorg) que limpia drásticamente la salida (con ciertas excepciones indicadas en el enlace):
xev | awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
La salida se reduce a solo:
133 Super_L
Quiero saber cómo el código wiki de Arch hace su magia. Todo lo que puedo adivinar es que de alguna manera está analizando la salida comenzando con KeyPress
pero después de eso no entiendo 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:
¿Puede alguien explicarnos lo que hace el código?
Respuesta1
awk -F'[ )]+' '/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'
-F'[ )]+'
indicaawk
dividir la línea en cualquier número de espacios o corchetes. Entonces, los camposstate 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
serían:# empty field state 0x0, keycode 133 (keysym 0xffeb, Super_L , same_screen YES,
/^KeyPress/ { a[NR+2] }
crea una entrada vacía en la línea número + 2 de la matriza
, para las líneas que comienzan conKeyPress
.NR in a
comprueba si el número de línea actual tiene una entrada en la matriza
. Esto sería cierto si una línea que comenzara conKeyPress
viniera hace dos líneas.- Luego imprime los campos quinto y octavo, que son
133
ySuper_L
como se puede ver en el primer punto.
xev
la salida en realidad se parece a:
$ 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,
Entonces, para cada pulsación de tecla, la segunda línea posterior tiene el código clave y el nombre.