Problema ao ligar um atalho a uma tecla de função / multimídia

8

Eu quero conectar um script em lote a um atalho. Quando eu o vinculo em Configurações do sistema & gt; Teclado & gt; Atalhos funciona com todas as teclas, exceto as minhas teclas de brilho do meu teclado externo da Apple.

As teclas de brilho são reconhecidas no showkey com o código de tecla 224 e 225 .

saída xev:

FocusOut event, serial 41, synthetic NO, window 0x4000001,
mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 41, synthetic NO, window 0x4000001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 41, synthetic NO, window 0x0,
    keys:  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 

Alguma sugestão do que posso fazer?

    
por remi 10.01.2013 / 15:09

2 respostas

6

Solução usando halevt

De acordo com as páginas do manual, halevt é um manipulador genérico para eventos do HAL. Ele está obsoleto e foi substituído por udev , mas como não sei o suficiente sobre udev , darei uma solução halevt .

EDITAR: depois de algum esforço sério, consegui fazer isso em udev . Veja minha outra resposta .

Eu usarei vim para editar arquivos, mas se você não souber vim , poderá substituí-lo por nano ou gedit .

Instalando o halevt

sudo apt-get update && sudo apt-get install halevt

Determinando quais eventos você deseja vincular a um script
Pare o daemon halevt que já está em execução:

sudo /etc/init.d/halevt stop

Agora veja se halevt pode reconhecer os eventos das chaves que você deseja usar, inicie o ouvinte:

sudo -u halevt halevt -fig:plugdev

Agora pressione a tecla de função no teclado para o qual deseja vincular o script. Eu sei que o OP quer que suas chaves de brilho funcionem, então vamos com isso. A saída para as chaves de brilho deve ser algo como isto:

Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-down)
Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-up)

Você pode ver que os eventos brightness-down e brightness-up são transmitidos.

Vincule o evento a um script
Agora edite o arquivo /etc/halevt/halevt.xml :

sudo vim /etc/halevt/halevt.xml

e adicione as seguintes linhas (eu fiz isso na parte inferior, pouco antes de </halevt:Configuration> ):

<halevt:Device match="hal.info.category = input">

    <halevt:Condition name="ButtonPressed" value="brightness-up" exec="sudo /home/user/brightness-script.sh up"/>

    <halevt:Condition name="ButtonPressed" value="brightness-down" exec="sudo /home/user/brightness-script.sh down"/>

</halevt:Device>

onde é claro que você deve alterar value para o evento que você recebeu do ouvinte e exec pelo comando que você deseja executar.

Dê permissão ao usuário para fazer o comando ou script
Como o daemon halevt é executado como o usuário halevt , é necessário dar permissão para fazer o que você especificou em exec .

Executar (lembre-se de substituir vim pelo seu editor de escolha)

sudo EDITOR=vim visudo

e adicione as seguintes linhas na parte inferior

halevt ALL=(root) NOPASSWD: /home/user/brightness-script.sh 

e salve e saia.

Verifique se o seu script é executável

sudo chmod +x /home/user/brightness-script.sh

Inicie o daemon do halevt novamente

sudo /etc/init.d/halevt start

E deve estar funcionando!

    
por Gerhard Burger 12.01.2013 / 19:23
11

Solução usando o udev

Como o HAL está obsoleto e o udev agora é usado, essa abordagem é preferível à minha outra resposta (embora eu acho que a solução usando HAL é mais simples).

No entanto, para muitas teclas de função, você pode simplesmente usar Configurações do sistema & gt; Teclado & gt; Atalhos para ligar um script, tente primeiro! Isso evita muitos problemas. Por exemplo, as teclas de brilho não funcionam (não sei por que não), portanto, se você quiser saber como alterar o comportamento de, por exemplo, as teclas de brilho, continue lendo.

OBSERVAÇÃO : Se você estiver executando um bloco de anotações Samsung, poderá corrigir todas as chaves de função (dependendo do modelo) instalando o pacote samsung-tools de link

Este tutorial pressupõe que você sabe como usar um terminal e usa o editor vim . Se você não souber vim , substitua-o nos comandos por gedit ou nano .

Determinando o seu teclado

/lib/udev/findkeyboards

deve imprimir os teclados que estão conectados ao computador, no meu caso

USB keyboard: input/event9
USB keyboard: input/event7
AT keyboard: input/event4

Agora existem duas opções:

  • teclados USB :
    Se você quiser remapear o teclado USB, inspecione-os executando

    udevadm info --export-db | awk '/event9/' RS="" | grep -P 'ID_(VENDOR|MODEL)(?!_ENC)'
    

    onde você tem que substituir o 9 na declaração awk pelo número correto. A saída deve ser semelhante a

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    que indica corretamente que o meu teclado é manipulado por meio do meu receptor USB da Logitech (a entrada / evento7 acabou sendo meu mouse Logitech G9, que possui alguns botões programáveis).

  • Teclado para portátil :
    Se você quiser remapear o teclado do laptop, lembre-se do número do AT keyboard , que é 4 no meu caso. Também obtenha as informações de dmi para o seu laptop:

    cat /sys/class/dmi/id/sys_vendor
    

    que está no meu caso

    SAMSUNG ELECTRONICS CO., LTD.
    

    e

    cat /sys/class/dmi/id/product_name
    

    que está no meu caso

    305U1A
    

Determine seu mapeamento atual das teclas de função

Agora podemos determinar nosso mapeamento de teclado atual ouvindo o teclado (inserir número correto)

sudo /lib/udev/keymap -i input/event4

você pode sair deste comando usando Esc no teclado, ou Ctrl + c em outro teclado.

Se sua tela começar a rolar muito, pressione Esc e Ctrl + c algumas vezes e tente novamente com

sudo /lib/udev/keymap -i input/event4 2> /dev/null

ou, se você ainda tiver o problema de rolagem

sudo /lib/udev/keymap -i input/event4 > ~/keymap.log

No último caso, você ainda terá a rolagem, mas se pressionar as teclas de função, elas deverão entrar em ~/keymap.log , onde você poderá lê-las mais tarde.

Agora podemos verificar o mapeamento atual de suas teclas de função pressionando-as, o que deve lhe dar uma lista como (esta é minha Fn + F1 a Fn + F12 ):

scan code: 0xCE   key code: kpplusminus
scan code: 0x89   key code: brightnessdown
scan code: 0x88   key code: brightnessup
scan code: 0x82   key code: switchvideomode
scan code: 0xF9   key code: f23
scan code: 0xA0   key code: mute
scan code: 0xAE   key code: volumedown
scan code: 0xB0   key code: volumeup
scan code: 0x43   key code: f9
scan code: 0x44   key code: f10
scan code: 0xB3   key code: prog3
scan code: 0x86   key code: wlan

Agora, anote os códigos de verificação para os quais você deseja que o comportamento mude.

Alterando os códigos de chave dos códigos de verificação

Se você ver claramente o código-chave, não cobre o que você espera que a chave faça. Dê uma olhada em /usr/include/linux/input.h em Chaves e botões para ver se há um código-chave que melhor corresponde ao que você realmente quer que aconteça. Os códigos de chave estão no formato KEY_KEYCODE e você precisa anotar a parte depois de KEY_ em minúsculas. Às vezes, mudar isso é suficiente para resolver o problema.

No entanto, as chaves de brilho têm o código-chave correto associado a elas, e é isso que não permite que sejam remapeadas. Então, precisamos alterá-los para outros códigos de teclas. Usaremos prog1 e prog2 para este exemplo porque eles não estão em uso no meu computador, mas você também pode usar f13 a f24 ou f20 a f24 se tiver uma Apple Teclado que tem F1 através das teclas F19 .

  1. Crie um mapa de teclado personalizado :
    Crie um arquivo de mapa de chaves no diretório /lib/udev/keymaps com um nome adequado, dê uma olhada na saída de ls /lib/udev/keymaps para ver os nomes adequados. Eu vou com custom-brightness para o propósito desta questão.

    sudo vim /lib/udev/keymaps/custom-brightness
    

    e insira os códigos de verificação das teclas que você deseja alterar, seguidos pelos códigos que você deseja que eles tenham. Meu custom-brightness é assim:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Crie um arquivo de lançamento de chave personalizado. Somente se você estiver mudando o teclado do seu laptop : Às vezes, o evento de lançamento da chave não é enviado corretamente, fazendo com que o computador seja interrompido. Para evitar isso, também escreveremos um arquivo de lançamento de chave personalizado

    sudo vim /lib/udev/keymaps/force-release/custom-brightness
    

    esse arquivo deve conter os mesmos códigos de verificação, o meu parece

    # /lib/udev/keymaps/force-release/custom-brightness
    
    0x89
    0x88
    

Verifique se os novos mapeamentos estão carregados nos arquivos de regras
Agora precisamos garantir que seus mapeamentos sejam carregados.Podemos fazer isso editando /lib/udev/rules.d/95-keymap.rules , então é inteligente fazer um backup

Mais uma vez, temos duas opções:

  • teclados USB :
    Como você tem um teclado USB, adicione sua entrada em LABEL="keyboard_usbcheck" e ela deve estar além das outras entradas do fabricante do seu teclado. Isso é porque meu teclado com

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    já é correspondido por uma das regras e, caso contrário, é sobrescrito.
    Adicione a regra a seguir, na qual você deve alterar o ID_VENDOR_ID e o ID_MODEL_ID e o nome do seu mapa de teclado de maneira apropriada

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Teclado para portátil :
    Se /lib/udev/findkeyboards informou o teclado do seu laptop como AT keyboard , sua regra deve estar abaixo de LABEL="keyboard_vendorcheck" , caso contrário, coloque-o em LABEL="keyboard_modulecheck" . Novamente, coloque-o sob as outras entradas para o seu fabricante de laptop. Adicione a regra a seguir ( SAMSUNG ELECTRONICS CO., LTD. é pouco, então usei um curinga))

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keymap $name custom_brightness"
    

    Agora também adicione uma regra a /lib/udev/rules.d/95-keyboard-force-release.rules depois de fazer o backup

    sudo cp /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/95-keyboard-force-release.rules.bak
    sudo vim /lib/udev/rules.d/95-keyboard-force-release.rules
    

    Novamente sob as outras entradas do seu fabricante, adicione

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keyboard-force-release.sh $devpath custom_test"
    

Verifique se o udev carrega as novas regras
Para carregar as novas regras, execute

sudo adevadm trigger

NOTA: udevadm control --reload-rules (ainda em instruções em muitos sites) não funciona.

Agora verifique se as regras foram aplicadas com sucesso por

sudo /lib/udev/keymap -i input/event4

que agora deve informar as chaves de brilho

scan code: 0x89   key code: prog1
scan code: 0x88   key code: prog2

Remapear as chaves em Configurações do sistema
Se a última etapa relatou os códigos de chave corretos, as chaves começam a funcionar automaticamente (no caso de terem os códigos de chave incorretos).

Para o brilho, você ainda precisa vincular as chaves a um script que agora é possível usando Configurações do sistema & gt; Teclado & gt; Atalhos .

Aproveite

Notas :

  • Se suas chaves tiverem o código de chave incorreto e forem corrigidas por essa abordagem, siga as instruções em /usr/share/doc/udev/README.keymap.txt.gz (você pode abrir isso sem extrair usando zless ) e envie seus resultados com os endereços de e-mail mencionados , então as alterações podem ser incluídas na próxima versão. Muitos usuários se beneficiarão!

  • Muito obrigado a este post útil de Vaidas Jablonskis.

por Gerhard Burger 13.01.2013 / 22:14