Capturando a entrada da tecla do dispositivo de eventos e mapeando-a (a tecla de alternância do TouchPad não está mapeada)

10

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

Descobri que o botão é realmente lido pelo teclado (e não pelo TouchPad como certos dispositivos), que está em /dev/input/event3. Então, usando sudo input-events 3eu 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 capaz de lê-lo, exceto input-events. Existe alguma maneira de mapear esse botão para alternar o TouchPad no meu laptop? Se sim, como posso fazer isso?

Hosh Sadiq
fonte

Respostas:

7

Acontece que o kernel o pegou, mas continuou reclamando que não é reconhecido.

Para qualquer pessoa que tenha esse problema ou queira mapear uma chave que não é lida pelo sistema operacional, continue lendo.

Abra um terminal e corra dmesg | grep -A 1 -i setkeycodes. Isso fornecerá 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 nos interessa é o valor hexadecimal após "setkeycodes", neste caso é e03e. Se você tiver vários deles, poderá executar tail -f /var/log/kern.log. Depois de fazer isso, você pode tocar no botão que procura, e isso fornecerá a mesma linha acima e, novamente, precisamos apenas do valor hexadecimal. Anote isso.

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

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Se você não encontrar o que está interessado, leia a resposta do @Gilles também, como também pode definir mapeamentos personalizados e continue a ler (se o kernel lê, você não precisará adicioná-lo ao xorg.conf. d)

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

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

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

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

207 NoSymbol

Obviamente, isso estava errado, como solicitei o código da chave 199, por isso é mapeado para XF86TouchpadToggle. Eu verifiquei xmodmap -pkenovamente e notei que keycode 207realmente está mapeado para NoSymbol, e notei que havia uma diferença de deslocamento de 8, então tentei o setkeycodescomando novamente, mas a chave está mapeada para keycode 191.

sudo setkeycodes e03e 191

Isso funcionou perfeitamente.

EDIT - a solução que eu forneci para trabalhar na inicialização não funciona. Eu vou descobrir isso amanhã e atualizar esta resposta. Por enquanto, suponho que você possa executar isso ao iniciar manualmente.

Hosh Sadiq
fonte
1
como torná-lo permanente da maneira agradável? (ou seja, após redefinição / inicialização)
vak 11/11
4

Pelo que parece, o dispositivo é um teclado (reconhecido no software como separado do teclado “principal”), mas o servidor X não está ouvindo.

Tente adicionar uma seção de entrada em/etc/X11/xorg.conf.d . Ou seja, crie um diretório /etc/X11/xorg.conf.dse ele ainda não existir e crie um arquivo extra-keyboard-buttonsnesse diretório que contenha

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

Não tenho certeza sobre essa MatchProductlinha; se não funcionar, tente mexer nas MatchXXXdiretivas .

Depois que esse arquivo é configurado corretamente, quando você inicia o servidor X, ele deve processar eventos deste teclado e você deve ver eventos em xeve em outros lugares. Observe o código de chave (não tenho certeza se o código de chave X11 será o mesmo que o código de chave de hardware nesse caso) e associe um código de chave a ele. Você pode fazer isso através de um arquivo chamado .Xmodmapem seu diretório pessoal contendo

keycode 190 = XF86_Launch5

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

Para alternar o touchpad, use o comando xinput. Corra xinput listpara ver quais dispositivos de entrada estão disponíveis e anote o nome do seu touchpad (chamarei Touchpadabaixo). Execute xinput list-props Touchpadpara listar suas propriedades; um deles deve ser chamado de "Dispositivo ativado" com um número ao lado (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-touchpade torne-o executável ( chmod +x ~/bin/toggle-touchpad). Para vinculá-lo a uma chave, instale xbindkeys e configure-o para executar seu script, colocando as seguintes linhas ~/.xbindkeysrc:

"toggle-touchpad"
  XF86_Launch5
Gilles 'SO- parar de ser mau'
fonte
Obrigado pela resposta. Infelizmente isso não funcionou. Eu consegui funcionar, então fique à vontade para dar uma olhada na minha própria resposta! :)
Hosh Sadiq