Como os códigos de chave são mapeados para a ação apropriada?

18

Depois de descobrir como alterar o mapeamento de códigos de verificação para códigos-chave usando udev, consulte esta pergunta . Eu estava pensando como esses códigos-chave (ou eventos, se você quiser) são mapeados para a ação apropriada.

Por exemplo, se você pressionar volume upo teclado, um código de digitalização será enviado, que será convertido no volumeupcódigo da tecla. Mas como esse código de chave é interceptado, o volume aumenta e a notificação apropriada é exibida?

Meu palpite é que em algum lugar um script deve ser chamado, então eu gostaria de saber onde estão esses scripts.

EDIT: Os códigos-chave que menciono não devem ser confundidos com os xevretornos dos códigos-chave , mas também estou interessado neles;)

Gerhard Burger
fonte
3
Não concordo, por exemplo, a notificação é muito específica para o Ubuntu, então quero saber como a notificação foi enviada. Meu palpite é que em algum lugar um script deve ser chamado, então quero saber onde estão esses scripts.
precisa saber é o seguinte
2
Esta é uma pergunta específica específica do Ubuntu, pois a maneira como o Ubuntu lida com isso mudou nos anos IIRC. É muito interessante saber qual é a sequência de eventos no Ubuntu no evento pressionando uma tecla de atalho que aciona as ações apropriadas. Possíveis propósitos: controles personalizados de brilho , depuração de problemas de teclas de atalho, etc.
gertvdijk
2
@Seth Parece desatualizado. O HAL está obsoleto há muito tempo, desde 10.04 . Também não há informações sobre como as notificações da área de trabalho são acionadas.
precisa saber é o seguinte
11
Hoje me deparei com wiki.ubuntu.com/Hotkeys/Trou Troubleshooting , que fornece algumas dicas interessantes (há um link para wiki.ubuntu.com/Hotkeys/Architecture que é muito informativo). Eu acho que a resposta de Stephen Ostermiller está na direção certa, mas eu quero encontrar esses scripts e ser capaz de alterá-los;)
Gerhard Burger
11
^^ esta informação parece estar desatualizada, sem atalhos de teclado no gnome-settings-daemon aqui ... Muitos hits de brilho na seção de compiz (embora eu esteja achando que é a unidade?) Quem sabe como notify-osdfunciona? Eu acho que é onde as notificações de brilho estão send ...
Gerhard Burger

Respostas:

6

Ok, encontrei isso em https://help.ubuntu.com/community/MultimediaKeys

Quando você pressiona uma tecla do teclado, o kernel do linux gera um scancode bruto para ela (se estiver atribuído). Cada scancode pode ser mapeado para um código de chave. Isso está no nível do kernel. X possui uma maneira (quase) total independente de mapear chaves: X lê a tabela de códigos de chave do kernel na inicialização e depois mapeia o código de chave para sua tabela de códigos de chave independente (é o mesmo que os códigos de chave do kernel, mas diferente :)). Em seguida, cada código-chave pode ser mapeado para um código-chave, ou seja, uma string que representa uma chave ou sugere uma ação. Portanto, para que nossas chaves estejam totalmente funcionais, elas precisam de um código de chave / código de chave do kernel mais um código de chave / código de chave X. Pode parecer estranho, mas os desenvolvedores do X têm motivos para manter um mapeamento de teclado separado do kernel. Não é nada difícil, apenas um procedimento bastante tedioso.

Então, os códigos de chave são mapeados para os chaves, então onde estão os códigos? Encontrei e respondo a esta pergunta: Onde encontro uma lista de todos os X academias de ginástica atualmente? Já que estamos falando sobre as teclas de volume, isso seria encontrado no XF86keysym.hcódigo-fonte mencionado na resposta.

Nesse arquivo no meu computador, encontrei o seguinte para volume:

#define XF86XK_AudioLowerVolume 0x1008FF11   /* Volume control down        */
#define XF86XK_AudioMute    0x1008FF12   /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13   /* Volume control up          */

Estranho ... valores diferentes de qualquer outra coisa, talvez haja vários sistemas para manipular chaves? http://crunchbang.org/forums/viewtopic.php?id=16656


Estou usando o Xubuntu e, para controlar as teclas, preciso mapear as ações manualmente (como esta: Como altero os atalhos do teclado no xubuntu? ). No entanto, as notificações parecem independentes, como se estivessem pressionando a tecla e agindo de acordo. Isso pode significar que outros programas no Ubuntu são configurados dessa maneira, portanto, não há necessidade de mapear scripts para as teclas.

Portanto, tenho certeza de que os programas estão pegando a chave (portanto, nenhum script foi encontrado).

No Xubuntu, tive esse problema com o Pulse Audio e usando scripts personalizados para alterar o volume. Parecia que o Pulse estava interceptando a tecla Mute , a tecla Mute silencia Alsa e PulseAudio, mas reativa o som apenas Alsa para soluções alternativas interessantes.


Verifique isso no NotifyOSD https://wiki.ubuntu.com/NotifyOSD#Volume_changes

Se você olhar para Estes diagramas: https://wiki.ubuntu.com/NotifyOSD#Architecture

Especialmente este: insira a descrição da imagem aqui

Isso mostra que existe um "ouvinte de chaves de hardware" que recebe o formulário DBus ou HAL? Em seguida, "recupera o elemento visual do sistema", onde os ícones de som e brilho estão na fonte do Notify-OSD, e então faz a bolha a partir daí.


Isso tudo é muito confuso, mas até onde eu entendi (até agora):

scancode bruto (por exemplo, e016)> código-chave (por exemplo, 160)> keysym (por exemplo, XF86AudioMute)> gnome-settings-daemon (por exemplo, aumento de volume)> sinal DBus> sinal de escuta de hardware para o OSD de notificação (ou outro escuta de programa)

Mateo
fonte
Parece que isso está chegando a algum lugar! Marcado como CW desde o início, então eu acho que você ainda está melhorando? :)
gertvdijk
sim, preciso examinar um pouco mais, o diagrama tem muitos pontos de interrogação.
Mateo
A propósito, você acidentalmente transformou-o em uma resposta do wiki da comunidade? Talvez peça a um mod para desfazê-lo ... Ah, e esses gráficos provavelmente estão um pouco desatualizados, porque o HAL está obsoleto há muito tempo ... Bem, pelo menos, estamos chegando a algum lugar: D
Gerhard Burger
@gertvdijk Eu sei, mas seria uma vergonha para todos os upvotes que ele sentirá falta;)
Gerhard Burger
1

Na maioria dos casos, não há scripts executados. Eles fazem com que os eventos sejam enviados ao gerenciador de janelas ou ao daemon de configurações. A única vez que conheço scripts no processo é quando você configura as ligações de teclas personalizadas. Para ligações de teclas personalizadas, você pode adicionar linhas de comando (executáveis ​​ou scripts) e vinculá-las às chaves.

Por favor, veja esta resposta que escrevi para uma pergunta sobre como fazer backup de atalhos de teclado no Ubuntu: Onde estão armazenados os atalhos de teclado do GNOME? Eu tenho um script que faz backup ou restaura todas as combinações de teclas, incluindo as combinações de teclas personalizadas. Se você executar o script, poderá ver onde no dconf as combinações de teclas estão armazenadas e qual aplicativo é notificado sobre o evento-chave.

Stephen Ostermiller
fonte
então, como as notificações da área de trabalho são acionadas?
Gerhard Burger
Eu acredito que o daemon de configuração do gnome é responsável por acionar aqueles no caso de volume e brilho, por exemplo.
Stephen Ostermiller
2
Eu executei o seu script, mas tudo o que parece fazer é obter os atalhos que você pode acessar em Configurações do sistema> Teclado> Atalhos ; não encontrei nenhuma referência ao brilho, por exemplo.
Gerhard Burger
script legal para obter chaves de corte de voz.
Mateo
0

A resposta está relacionada a Drivers .

Todo hardware deve ter um driver para interagir com o sistema operacional.

Citando http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/ :

Um motorista dirige, gerencia, controla, dirige e monitora a entidade sob seu comando. O que um driver de barramento faz com um barramento, um driver de dispositivo faz com um dispositivo de computador (qualquer peça de hardware conectada a um computador) como mouse, teclado, monitor, disco rígido, câmera Web, relógio e muito mais.

Além disso, um “piloto” pode ser uma pessoa ou até um sistema automático monitorado por uma pessoa (um sistema de piloto automático em aviões, por exemplo). Da mesma forma, uma peça específica de hardware pode ser controlada por um software (um driver de dispositivo) ou por outro dispositivo de hardware, que por sua vez pode ser gerenciado por um driver de dispositivo de software. Neste último caso, esse dispositivo de controle é comumente chamado de controlador de dispositivo. Por ser um dispositivo propriamente dito, muitas vezes também precisa de um motorista, geralmente chamado de motorista de ônibus.

Um dispositivo possui um registro de dispositivo que armazena os bits de Controle / Status e Dados. Sempre que alguns dados precisam ser transferidos, geralmente são enviados configurando os bits de dados.

Portanto, sempre que você pressiona alguma tecla do teclado, alguns dados são gravados no registro. Esses bits são lidos pelo driver do dispositivo e a ação apropriada é executada. Esta é a breve explicação.

Ligações:

verde
fonte
3
Uhm ... acho que os motoristas não têm noção do significado da tecla que pressiono no teclado. Alguns dispositivos especiais de teclas de atalho nos notebooks podem precisar de um driver para isso - mas isso não cobre as teclas de atalho comuns de multimídia, como "aumentar o volume". Isso deve ser coberto em uma área mais comum do kernel / X / DE. Também acho que as referências são muito amplas sobre a programação de drivers de dispositivos Linux kerner.
precisa saber é o seguinte
Acho que para a maioria dos teclados modernos Ubuntu usa o evdevmotorista, mas eu não vejo como isso seria útil aqui ...
Gerhard Burger