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

8

Quero conectar um script em lote a um atalho. Quando o vinculo em Configurações do sistema> Teclado> Atalhos, ele funciona com todas as teclas, exceto as teclas de brilho do teclado Apple externo.

As teclas de brilho são reconhecidas na showkey com os códigos 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 eu posso fazer?

remi
fonte

Respostas:

6

Solução usando halevt

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

EDIT: depois de um suor grave, eu consegui fazer isso udev. Veja minha outra resposta .

Usarei vimpara editar arquivos, mas se você não souber, vimpoderá substituí-lo por nanoou gedit.

Instalando o halevt

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

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

sudo /etc/init.d/halevt stop

Agora veja se halevtconsegue 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 ao qual deseja vincular o script. Eu sei que o OP quer que suas teclas de brilho funcionem, então vamos com isso. A saída para as teclas 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-downe brightness-upsão transmitidos.

Vincular 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 na parte inferior, logo antes </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 mudar valuepara o evento que recebeu do ouvinte e execpelo comando que deseja executar.

Conceda ao usuário halevt permissão para executar o comando ou script
Como o halevtdaemon é executado como o halevtusuário, você deve conceder permissão para fazer o que especificou exec.

Executar (lembre-se de substituir vimpor 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 halevt novamente

sudo /etc/init.d/halevt start

E deveria estar funcionando!

Gerhard Burger
fonte
funcionou perfeitamente. obrigado novamente por sua resposta precisa.
remi
De nada, veja também minha nova resposta usando udev. Mas sinta-se livre para ficar com a outra solução, o importante é que ele está trabalhando;)
Gerhard Burger
E: Unable to locate package halevtem 14.04.
umpirsky
Desde Ubuntu 13.10 HALevt não está mais incluído ( packages.ubuntu.com/search?keywords=halevt )
Gerhard Burger
11

Solução usando udev

Como o HAL está obsoleto e udevagora é usado, essa abordagem é preferida à minha outra resposta (embora eu ache que a solução usando o HAL é mais simples).

No entanto, para muitas teclas de função, você pode simplesmente usar Configurações do Sistema> Teclado> Atalhos para vincular um script, tente isso primeiro! Isso economiza muitos problemas. Por exemplo, as teclas de brilho não funcionam (não faço idéia do por que não); portanto, se você quiser saber como alterar o comportamento das teclas de brilho, continue lendo.

NOTA : Se você estiver executando um notebook Samsung, poderá corrigir todas as teclas de função (dependendo do modelo) instalando o samsung-toolspacote em http://www.voria.org/forum/

Este tutorial pressupõe que você saiba como usar um terminal e usa o vimeditor. Se você não souber vim, substitua-o nos comandos por geditou nano.


Determinando seu teclado

/lib/udev/findkeyboards

deve imprimir os teclados 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ê deseja remapear seu teclado USB, inspecione-os executando

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

    onde você deve substituir o 9 na instruçã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 meu teclado é manuseado por meio do meu Logitech USB Receiver (entrada / evento7 acabou por ser o mouse Logitech G9 que possui alguns botões programáveis).

  • Teclado do laptop :
    se você deseja remapear o teclado do laptop, lembre-se do número AT keyboard4 no meu caso. Obtenha também as informações dmi do seu laptop:

    cat /sys/class/dmi/id/sys_vendor
    

    que é no meu caso

    SAMSUNG ELECTRONICS CO., LTD.
    

    e

    cat /sys/class/dmi/id/product_name
    

    que é no meu caso

    305U1A
    

Determine seu mapeamento atual de suas teclas de função

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

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

você pode sair desse comando usando Esco teclado ou Ctrl+ cem outro teclado.

Se sua tela começar a rolar para baixo com muita força, pressione Esce Ctrl+ calgumas 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ções, elas deverão entrar ~/keymap.logonde você poderá lê-las mais tarde.

Agora podemos verificar o mapeamento atual de suas teclas de função pressionando-as, o que deve fornecer uma lista como (este é meu Fn+ F1a 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 deseja alterar o comportamento.


Alterando os códigos de tecla dos códigos de digitalização

Se você ver o código da chave claramente não cobre o que você espera a chave para que você pode ter um olhar em /usr/include/linux/input.hsob Teclas 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 das teclas estão no formato KEY_KEYCODEe você deve anotar a peça KEY_em minúsculas. Às vezes, alterar isso é suficiente para resolver o problema.

As teclas de brilho, no entanto, geralmente têm o código de tecla correto associado a elas, e é isso que não permite que elas sejam remapeadas. Então, precisamos alterá-los para outros códigos-chave. Usaremos prog1e prog2para este exemplo, porque eles não estão em uso no meu computador; no entanto, você também pode usá-lo f13através f24ou f20através de f24um teclado Apple que possua teclas F1através F19.

  1. Crie um mapa de chaves customizado :
    Crie um arquivo de mapa de chaves no diretório /lib/udev/keymapscom um nome adequado. Consulte a saída de ls /lib/udev/keymapspara ver nomes adequados. Eu vou com custom-brightnesso propósito desta pergunta.

    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 de verificação que deseja que eles tenham. Minha custom-brightnessaparência é assim:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Crie um arquivo de liberação de chave personalizado. Somente se você estiver alterando o teclado do laptop :
    Às vezes, o evento de liberação da tecla não é enviado corretamente, causando uma interrupção no computador. Para evitar isso, também escreveremos um arquivo de liberação 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
    

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

Novamente, temos duas opções:

  • Teclados USB :
    como você possui um teclado USB, você deve adicionar sua entrada LABEL="keyboard_usbcheck"e ela deve passar das outras entradas do fabricante do teclado. Isso ocorre 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, é substituído.
    Adicione a seguinte regra, onde você deve mudar o ID_VENDOR_IDe ID_MODEL_IDe o nome do seu mapa de teclado appropiately

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Teclado do laptop :
    se você /lib/udev/findkeyboardsinformou que o teclado do laptop AT keyboarddeve estar abaixo da regra LABEL="keyboard_vendorcheck", caso contrário, coloque-o abaixo LABEL="keyboard_modulecheck". Mais uma vez, coloque-o nas outras entradas do fabricante do seu laptop. Adicione a regra a seguir ( SAMSUNG ELECTRONICS CO., LTD.é um pouco longo, usei um curinga)

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

    Agora também adicione uma regra para /lib/udev/rules.d/95-keyboard-force-release.rulesdepois 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 reportar as teclas de brilho

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

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

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

Aproveitar



Notas :

  • Se suas chaves tinham o código de chave errado e foram 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 aos seus resultados os endereços de email mencionados lá, as alterações poderão ser incluídas na próxima versão. Muitos usuários serão beneficiados!

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

Gerhard Burger
fonte
1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directorytambém$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky
Obrigado pelo seu comentário, eu olhei para ele e parece que o udev será mesclado no systemd e as configurações do keymap serão gerenciadas no hwdb. De acordo com bbs.archlinux.org/viewtopic.php?id=168720 é possível extrair findkeyboards de uma versão mais antiga do systemd, mas não estou certo o resto da resposta ainda se aplica ...
Gerhard Burger