Porque ações não-modificadoras são promulgadas no evento key-down.
Na verdade, isso não tem nada a ver com hardware de teclado. Os teclados USB e PS / 2 operam da mesma forma a esse respeito. Não há nada no hardware que torna as chamadas "teclas modificadoras" especiais. Qualquer chave, com uma exceção, pode ser uma tecla modificadora ou não.
O que determina o que é uma tecla modificadora é o mapa do teclado empregado no software em um sistema operacional. O hardware apenas envia o que está em vigor (encobrindo os detalhes do protocolo de relatório de entrada USB HID sendo na verdade um bitmap de chaves atualmente pressionadas que são parcialmente codificadas em um formulário de dentro para fora para mantê-lo curto).
Em um mapa de teclado do FreeBSD, por exemplo, encontram-se linhas como esta:
# alt # scan cntrl alt alt cntrl lock # code base shift cntrl shift alt shift cntrl shift state # ------------------------------------------------------------------ … 029 lctrl lctrl lctrl lctrl lctrl lctrl lctrl lctrl O … 042 lshift lshift lshift lshift lshift lshift lshift lshift O … 054 rshift rshift rshift rshift rshift rshift rshift rshift O … 056 lalt lalt lalt lalt lalt lalt lalt lalt O … 083 del '.' '.' '.' '.' '.' boot boot N …
029, 042, 054 e 056 são os códigos de teclado (normalizados em um sistema comum a partir dos números de uso da USB HID e dos números de scancode do PS / 2), mas são lctrl
, lshift
, rshift
e lalt
ações no mapa que definem essas chaves como teclas modificadoras. Defina-os com ações diferentes e mova essas ações para outro lugar, como de fato vários mapas do FreeBSD prontos para uso, e chaves totalmente diferentes são modificadores.
(A exceção à regra é a tecla Fn , que é o modificador que é implementado no hardware. É implementada inteiramente no hardware e não é vista pelo software . Ele não gera nenhum evento através do fio. Na verdade, há outro modificador de hardware. Não é uma chave. É o estado do LED NumLock.)
A ação , quando é uma ação modificadora como essa, altera o estado modificador atual , que (simplesmente) é um conjunto de sinalizadores gravados na operação sistema que registra quais modificadores estão atualmente "ligados". Como você pode ver nos títulos das colunas no mapa do teclado, o estado do modificador atual - em termos de sinalizadores "on" para estados "shift", "altgr", "control" e "alt" - influencia o que ação pressiona mais o mapa para.
Na linha do código 083, que é o que está gravado . del no teclado numérico, você pode ver que somente se o estado modificador atual for pelo menos "alt cntrl" a ação mapeada será boot
.
Os drivers de teclado executam as ações do modificador ao receber os principais eventos press ou release . Outras ações, entretanto, somente surtem efeito após os eventos chave press ou autorepeat . Este é o caso da ação boot
, por exemplo. Somente se um pressionamento de tecla ou evento de repetição automática para a chave 083 ocorrer e o estado do modificador atual já for "alt cntrl" / "alt cntrl shift", ocorrerá a ação boot
.
Deve ficar óbvio a partir disso que, para obter o estado do modificador atual do sistema operacional nesse estado, as ações lalt
e lctrl
/ rctrl
devem ter ocorrido , por primeiro pressionando as teclas que foram mapeadas para eles. (O sistema do FreeBSD também permite modificadores locks , além do sistema usual de modificadores shifts , embora apenas dois mapas de teclado possam ser usados em O padrão de teclado ISO também permite modificadores latches , mas o FreeBSD não fornece este mecanismo.
O FreeBSD é, como eu disse, um exemplo aqui. Mas a maioria dos sistemas operacionais com dispositivos PS / 2 ou USB HID, do MS / PC-DOS (onde o estado do modificador atual é um byte bem conhecido na memória) para o Windows NT (onde mapas de teclado são DLLs no modo kernel contendo código e dados ), trabalhe aproximadamente desta maneira.
Leitura adicional
- link
- link
- Jonathan de Boyne Pollard. "Mapeamento do teclado".
console-fb-realizer
. páginas de manual do conjunto de ferramentas. - Kazutaka Yokota (2008-01-29).
atkbd
. Páginas de manual do FreeBSD. -
kbdmap
. §5. Páginas de manual do FreeBSD.