Capturando entrada de chave do dispositivo de eventos e mapeando-a (não é possível mapear a tecla do TouchPad)

10

Eu tenho um Lenovo IdeaPad Yoga 13 com o Ubuntu 13.10 instalado. O dispositivo tem um botão "Toggle TouchPad" no teclado ( F5 ). Os botões F * do teclado estão invertidos (para obter F5 , preciso pressionar Fn + F5 e F5 é na verdade a tecla de alternância).

Descobri que o botão é realmente lido pelo teclado (em vez do TouchPad como certos dispositivos), que está em /dev/input/event3 . Então, usando sudo input-events 3 , consegui descobrir que o botão envia o código de verificação 190:

Saída 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

Saída 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

Nenhum outro programa (como xev ) parece ser capaz de lê-lo, exceto input-events . Existe alguma maneira de mapear este botão para alternar o TouchPad no meu laptop? Se sim, como posso fazer isso?

    
por Hosh Sadiq 01.12.2013 / 01:09

2 respostas

7

Como se vê, o kernel pegou, mas continuou reclamando que não é reconhecido.

Para qualquer outra pessoa que tenha esse problema, ou queira mapear uma chave que não seja lida pelo SO, continue lendo.

Abra um terminal e execute dmesg | grep -A 1 -i setkeycodes . Isso lhe dará várias 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.

O que estamos interessados é o valor hexadecimal depois de "setkeycodes", neste caso, isto é e03e . Se você tiver vários desses, poderá executar tail -f /var/log/kern.log . Uma vez feito isso, você pode tocar no botão que está procurando, e isso lhe dará a mesma linha acima, e novamente, precisamos apenas do valor hexadecimal. Anote isso.

Agora, execute xmodmap -pke | less e encontre o mapeamento apropriado. No meu caso, eu precisava mapear isso para alternar meu touch pad, o que significa que eu estava interessado na seguinte linha:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Se você não encontrar o que quer que esteja interessado, leia @Gilles answer também, como você também pode definir mapeamentos personalizados, então continue lendo (se o kernel ler, você não precisará adicioná-lo ao xorg .conf.d)

Agora eu executei o seguinte comando: sudo setkeycodes [hexadecimal] [keycode] , então no meu caso isso se tornou: setkeycodes e03e 199 .

Agora você pode usar a seguinte linha para testar se funcionou e / ou você tem o mapeamento correto:

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

Ao executar este comando, você precisa se concentrar na janela recém-aberta ( xev ) e verificar a saída do console. No meu caso, leia o seguinte:

207 NoSymbol

Isso estava obviamente errado, já que solicitei o keycode 199 , então ele foi mapeado para XF86TouchpadToggle . Verifiquei xmodmap -pke novamente e percebi que keycode 207 está realmente mapeado para NoSymbol e percebi que havia uma diferença de deslocamento de 8, então tentei o comando setkeycodes novamente, mas a chave foi mapeada para keycode 191 .

sudo setkeycodes e03e 191

Isso funcionou perfeitamente.

EDIT - a solução que forneci para trabalhar no arranque não. Eu vou descobrir isso amanhã e atualizar esta resposta. Por enquanto, suponho que você possa executar isso no início manualmente.

    
por 01.12.2013 / 04:38
4

Pelo que parece, o dispositivo é um teclado (reconhecido no software como separado do teclado "core"), mas o servidor X não está escutando.

Experimente adicionar uma seção de entrada em /etc/X11/xorg.conf.d . Ou seja, crie um diretório /etc/X11/xorg.conf.d se ele ainda não existir e crie um arquivo extra-keyboard-buttons nesse diretório contendo

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

Não tenho certeza sobre isso MatchProduct line; Se isso não funcionar, tente brincar com o MatchXXX .

Quando esse arquivo estiver configurado corretamente, quando você iniciar o servidor X, ele deverá processar os eventos deste teclado e você deverá ver os eventos em xev e em outro lugar. Observe o keycode (não tenho certeza se o keycode do X11 será o mesmo que o keycode do hardware neste caso) e associe um keysym a ele. Você pode fazer isso por meio de um arquivo chamado .Xmodmap no seu diretório pessoal que contém

keycode 190 = XF86_Launch5

Agora você pode definir atalhos de teclado usando essas chaves.

Para alternar o touchpad, use o comando xinput . Execute xinput list para ver quais dispositivos de entrada estão disponíveis e anote o nome do seu touchpad (eu chamarei Touchpad abaixo). Execute xinput list-props Touchpad para listar suas propriedades; um deles deve ser chamado de "Dispositivo habilitado" com um número próximo a ele (por exemplo, 135). O script a seguir alternará o touchpad:

#!/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"

Salve isso em um arquivo ~/bin/toggle-touchpad e torne-o executável ( chmod +x ~/bin/toggle-touchpad ). Para ligá-lo a uma chave, instale xbindkeys e configure-o para executar o seu script, colocando as seguintes linhas em ~/.xbindkeysrc :

"toggle-touchpad"
  XF86_Launch5
    
por 01.12.2013 / 02:01