Capturar la entrada de clave del dispositivo de eventos y asignarla (la tecla de alternar TouchPad no está asignada)

10

Tengo un Lenovo IdeaPad Yoga 13 con Ubuntu 13.10 instalado. El dispositivo tiene un botón "Toggle TouchPad" en el teclado ( F5). Los F*botones del teclado están invertidos (para obtener F5, necesito presionar Fn+ F5, y en F5realidad es la tecla de alternar).

Descubrí que el botón en realidad lo lee el teclado (en lugar del TouchPad, como ciertos dispositivos), que está en /dev/input/event3. Así que usando sudo input-events 3pude descubrir que el botón envía el código de escaneo 190:

Salida de sudo lsinput:

/dev/input/event3
   bustype : BUS_I8042
   vendor  : 0x1
   product : 0x1
   version : 43907
   name    : "AT Translated Set 2 keyboard"
   phys    : "isa0060/serio0/input0"
   bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

Salida de sudo input-events 3:

23:13:03.849392: EV_MSC MSC_SCAN 190
23:13:03.849392: EV_SYN code=0 value=0
23:13:03.855413: EV_MSC MSC_SCAN 190
23:13:03.855413: EV_SYN code=0 value=0

Ningún otro programa (como xev) parece poder leerlo, excepto input-events. ¿Hay alguna forma de asignar este botón para activar el TouchPad en mi computadora portátil? Si es así, ¿cómo puedo hacerlo?

Hosh Sadiq
fuente

Respuestas:

7

Resulta que el núcleo lo recogió, pero siguió quejándose de que no se reconoce.

Para cualquier otra persona que tenga este problema o desee asignar una clave que el sistema operativo no lee, siga leyendo.

Abre una terminal y corre dmesg | grep -A 1 -i setkeycodes. Esto le dará múltiples entradas como esta:

[    9.307463] atkbd serio0: Unknown key pressed (translated set 2, code 0xbe on isa0060/serio0).
[    9.307476] atkbd serio0: Use 'setkeycodes e03e <keycode>' to make it known.

Lo que nos interesa es el valor hexadecimal después de "setkeycodes", en este caso esto es e03e. Si tiene varios de estos, puede ejecutar tail -f /var/log/kern.log. Una vez que lo haya hecho, puede tocar el botón que está buscando, y esto le dará la misma línea que arriba, y nuevamente, solo necesitamos el valor hexadecimal. Haz una nota de esto.

Ahora corre xmodmap -pke | lessy encuentra el mapeo apropiado. En mi caso, necesitaba mapear esto para alternar mi panel táctil, lo que significa que estaba interesado en la siguiente línea:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Si no puede encontrar lo que le interesa, lea también la respuesta @Gilles, ya que también puede definir asignaciones personalizadas, luego siga leyendo (si el núcleo lo lee, no necesitará agregarlo a xorg.conf. re)

Ahora me encontré con el siguiente comando: sudo setkeycodes [hexadecimal] [keycode], así que en mi caso, que se convirtió en: setkeycodes e03e 199.

Ahora puede usar la siguiente línea para probar si funcionó y / o tiene la asignación correcta:

xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'

Cuando ejecuta este comando, debe centrarse en la ventana recién abierta ( xev) y verificar la salida de la consola. En mi caso, decía lo siguiente:

207 NoSymbol

Esto obviamente estaba mal, ya que solicité el código clave 199, por lo que está asignado XF86TouchpadToggle. Revisé xmodmap -pkenuevamente, y noté que en keycode 207realidad está asignado NoSymbol, y noté que había una diferencia de compensación de 8, así que intenté el setkeycodescomando nuevamente, pero la clave está asignada keycode 191.

sudo setkeycodes e03e 191

Esto funcionó perfectamente.

EDITAR: la solución que proporcioné para tener que trabajar en el inicio no. Resolveré esto mañana y actualizaré esta respuesta. Por ahora, supongo que puede ejecutar esto al iniciar manualmente.

Hosh Sadiq
fuente
1
¿Cómo hacerlo permanente de la manera agradable? (es decir, después de reiniciar / reiniciar)
vak
4

Por lo que parece, el dispositivo es un teclado (reconocido en el software como separado del teclado "central") pero el servidor X no lo está escuchando.

Intente agregar una sección de entrada debajo/etc/X11/xorg.conf.d . Es decir, cree un directorio /etc/X11/xorg.conf.dsi aún no existe y cree un archivo extra-keyboard-buttonsen ese directorio que contenga

Section "InputClass"
    Identifier "extra-keyboard-buttons"
    Driver "kbd"
    MatchProduct "AT Translated Set 2 keyboard"
EndSection

No estoy seguro de esa MatchProductlínea; Si no funciona, intente jugar con las MatchXXXdirectivas .

Una vez que este archivo está configurado correctamente, cuando inicia el servidor X, debe procesar eventos desde este teclado y debe ver eventos en xevy en otros lugares. Tenga en cuenta el código clave (no estoy seguro de si el código clave X11 será el mismo que el código clave de hardware en este caso) y asóciele un símbolo clave. Puede hacerlo a través de un archivo llamado .Xmodmapen su directorio de inicio que contiene

keycode 190 = XF86_Launch5

Ahora puede definir métodos abreviados de teclado con estas teclas.

Para alternar el panel táctil, use el comando xinput. Ejecute xinput listpara ver qué dispositivos de entrada están disponibles y anote el nombre de su panel táctil (lo llamaré a Touchpadcontinuación). Ejecutar xinput list-props Touchpadpara enumerar sus propiedades; uno de ellos debe llamarse "Dispositivo habilitado" con un número al lado (por ejemplo, 135). El siguiente script alternará el panel táctil:

#!/bin/sh
device_name='Touchpad'
property=135
flipped_state=$(xinput list-props "$device_name" |
                awk "/\\($property\\)/ {print 1 - \$NF}")
xinput set-prop "$device_name" "$property" "$flipped_state"

Guarde esto en un archivo ~/bin/toggle-touchpady hágalo ejecutable ( chmod +x ~/bin/toggle-touchpad). Para vincularlo a una clave, instale xbindkeys y configúrelo para ejecutar su script colocando las siguientes líneas en ~/.xbindkeysrc:

"toggle-touchpad"
  XF86_Launch5
Gilles 'SO- deja de ser malvado'
fuente
Gracias por la respuesta. Esto desafortunadamente no funcionó. Sin embargo, lo hice funcionar, así que ¡no dudes en echar un vistazo a mi propia respuesta! :)
Hosh Sadiq