Como remapear a chave XF86Sleep para o espaço --- xmodmap, xkbcomp & udev fail

0

Estou executando o Ubuntu 16.04.1 LTS. Eu tenho um controle remoto semelhante a um aqui (embora o meu é chamado apenas de "Vista MCE Remote Control"), que atua como um teclado, junto com um teclado real. Eu estou tentando remapear o botão no controle remoto que envia XF86Sleep para enviar um espaço, mas xkbcomp e xmodmap não estão se comportando como eu esperava.

Primeiro, eu tentei o xkbcomp, já que eu poderia dar a ele um dispositivo com a opção -i:

xid='xinput list | grep 05a4:9881 | grep keyboard | perl -pe 's/^.*=([0-9]+).*//''
xkbcomp -i $xid ~/remote.xkb $DISPLAY

Consegui alterar a chave que envia um KP_Multiply para enviar um sublinhado sem problemas, alterando:

 key <KPMU> {
     type= "CTRL+ALT",
     symbols[Group1]= [     KP_Multiply,     KP_Multiply,     KP_Multiply,     KP_Multiply,   XF86ClearGrab ]
 };

para:

 key <KPMU> {
     type= "CTRL+ALT",
     symbols[Group1]= [      underscore,      underscore,      underscore,      underscore,   XF86ClearGrab ]
 };

Mas quando eu mudei a linha que dizia:

 key <I150> {         [       XF86Sleep ] };

para

 key <I150> {         [           space ] };

isso não teve efeito; apertar o botão de suspensão ainda colocar meu computador para dormir, mesmo que xev relata a chave envia um espaço (depois que eu acordar):

KeyRelease event, serial 29, synthetic NO, window 0x1a00001,
     root 0x1d7, subw 0x0, time 1621457, (99,102),  root:(1797,144),
     state 0x0, keycode 150 (keysym 0x20, space), same_screen YES,
     XKeysymToKeycode returns keycode: 65
     XLookupString gives 1 bytes: (20) " "
     XFilterEvent returns: False

Então eu tentei o xmodmap, assim:

% xmodmap -e 'keycode 150 = space'

(Isso afetaria o teclado real também, mas tudo bem, pois o meu teclado não tem um botão de suspensão e, se funcionasse, eu gostaria de desativá-lo mesmo assim.) Depois disso, o botão de suspensão não faz nada programas como emacs e konsole --- o computador não vai dormir, mas não há espaço gerado --- enquanto xev ainda relata um espaço (como acima).

Ainda mais estranho, eu tentei as mesmas coisas com outra chave, a tecla "home page". O tipo de esquema xkbcomp funciona, mas sempre que uso meu teclado real, a tecla é revertida para XF86HomePage até que eu use outra tecla no controle remoto. (Isso não acontece com a chave XF86Sleep; não importa o quanto eu toquei as teclas no controle remoto, ele ainda coloca o computador em repouso a menos que eu faça o comando xmodmap também.) Por outro lado, neste caso, o comando xmodmap funciona, pelo menor custo de ter o botão home no teclado também envia um espaço.

Alguma idéia do que está acontecendo aqui, ou como eu poderia remapear a verdadeira chave do sono para o espaço? Eu olhei para várias questões semelhantes aqui, mas nenhuma parece corresponder. (Além de este , que não tem resposta.

editar:

Finalmente tive a chance de tentar a resposta do ssokolow abaixo. Com base nos links fornecidos, deveria ter funcionado. Infelizmente, isso não acontece. Não há mensagens de erro, mas não há alterações nos códigos de teclas ou no teclado que vejo em (por exemplo) xev.

Veja o que eu fiz:

(1) Use o lsusb para encontrar o dispositivo em questão:

Bus 005 Device 002: ID 05a4:9881 Ortek Technology, Inc. IR receiver [VRC-1100 Vista MCE Remote Control]

(2) Use evtest para encontrar os códigos MSC_SCAN para algumas chaves:

sudo evtest ... /dev/input/event5: HID 05a4:9881 /dev/input/event6: HID 05a4:9881 ... (Observe dois / dev / input / events separados. As teclas em que estou interessado no momento estão no # 6, mas tentar as teclas no event5 também não funciona). Eles são as chaves "página inicial" e "poder":

Event: time 1514752612.650320, type 4 (EV_MSC), code 4 (MSC_SCAN), value c0223 Event: time 1514752612.650320, type 1 (EV_KEY), code 172 (KEY_HOMEPAGE), value 1 Event: time 1514752612.650320, -------------- SYN_REPORT ------------ Event: time 1514752612.690312, type 4 (EV_MSC), code 4 (MSC_SCAN), value c0223 Event: time 1514752612.690312, type 1 (EV_KEY), code 172 (KEY_HOMEPAGE), value 0 Event: time 1514752612.690312, -------------- SYN_REPORT ------------ Event: time 1514752615.826339, type 4 (EV_MSC), code 4 (MSC_SCAN), value 10082 Event: time 1514752615.826339, type 1 (EV_KEY), code 142 (KEY_SLEEP), value 1 Event: time 1514752615.826339, -------------- SYN_REPORT ------------ Event: time 1514752615.826366, type 1 (EV_KEY), code 142 (KEY_SLEEP), value 0 Event: time 1514752615.826366, -------------- SYN_REPORT ------------

Compile um arquivo /etc/udev/hwdb.d/99-vrc1100-remote.hwdb, certificando-se de que haja apenas um espaço nas linhas KEYBOARD_KEY:

evdev:input:b0003v05a4p9881* KEYBOARD_KEY_10082=playpause KEYBOARD_KEY_C0223=q

Eu tenho o udev versão 229, então um dos links na resposta diz que esse é o formato correto (evdev: input:).

Executar:

sudo systemd-hwdb update

Se eu correr

sudo systemd-hwdb query 'evdev:input:b0003v05a4p9881*'

Eu recebo as últimas duas linhas do meu arquivo, então isso parece ter funcionado.

Eu então corro:

sudo udevadm trigger --verbose

e vejo o que parecem ser os dispositivos relevantes sendo impressos:

%código% ...

Mas as chaves ainda não funcionam. A chave da home page ainda produz:

/sys/devices/pci0000:00/0000:00:1a.2/usb5/5-1/5-1:1.0/0003:05A4:9881.0005/input/input8/event5 /sys/devices/pci0000:00/0000:00:1a.2/usb5/5-1/5-1:1.1/0003:05A4:9881.0006/input/input9/event6

Evento KeyRelease, serial 28, NO sintético, janela 0x4600001,     raiz 0x1d7, subw 0x0, hora 8090016, (127,61), raiz: (998,540),     estado 0x10, keycode 180 (keysym 0x1008ff18, XF86HomePage), same_screen YES,     XLookupString dá 0 bytes:     XFilterEvent retorna: False

A chave power (sleep) não parece fazer nada. (Em algum momento, acho que consegui desativar o sono, embora não me lembre como).

Eu também tentei reiniciar, isso também não ajudou. Eu tentei correr:

KeyPress event, serial 28, synthetic NO, window 0x4600001, root 0x1d7, subw 0x0, time 8089976, (127,61), root:(998,540), state 0x10, keycode 180 (keysym 0x1008ff18, XF86HomePage), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False

Depois disso, examinei / var / log / syslog, mas não encontrei nada que parecesse útil.

    
por Zeggpold 29.01.2017 / 03:44

1 resposta

0

A coisa a entender é que a manipulação de entrada funciona assim no Ubuntu:

hardware --scancode--> kernel --keycode--> X11 --> keysym --> application

Eu tive um problema semelhante e acabei andando na pilha e voltando no tempo até encontrar uma solução que funcionasse para o meu 14.04 LTS.

Eu não consegui fazer a camada X11 mudar as coisas, então eu acabei de usar uma camada usada udev para redefinir como o kernel mapeia scancodes para códigos de teclas.

Já que você está no 16.04, você não precisa ir tão longe como eu fiz

(14.04 está em um estado intermediário estranho no qual ele tem a última versão do udev listada como exigindo um auxiliar externo, mas não inclui esse auxiliar externo e algo que descobri mais tarde sugere que ele pode realmente suportar o funcionamento interno caminho através de patches backported ... mas apenas com alguns comandos extras para forçar uma atualização de configuração.)

Aqui está um resumo da abordagem que deve funcionar em 16.04:

  1. Crie um arquivo /etc/udev/hwdb.d/whatever.hwdb de acordo com o formato resumido em qualquer um desses links: [1] [3] [4] [5]
  2. Execute sudo systemd-hwdb update se você tiver e sudo udevadm hwdb --update caso contrário.
  3. Executar sudo udevadm trigger , desconectar e reconfigurar o dispositivo ou reinicializar.

IMPORTANTE: use apenas um espaço para recuar as linhas KEYBOARD_KEY_ ou ele falhará silenciosamente.

    
por ssokolow 11.04.2017 / 00:42