Por que a ordem em que as teclas de atalho são executadas é importante?

2

Pressione Ctrl e segure-o. Em seguida, pressione Alt e segure-o. Finalmente, pressione Excluir . Se você tem um sistema Ubuntu (talvez qualquer sistema baseado no Debian), é muito provável que sua sessão seja bloqueada, já que você executou a Ctrl + Alt + < kbd> Apagar atalho.

Agora, pressione Excluir e segure-o. Em seguida, pressione Ctrl e segure-o. Em seguida, pressione Alt . O atalho da sessão de bloqueio não será acionado .

Por que isso acontece? Onde esta configuração está codificada?

Meu palpite: tenho a impressão de que os atalhos funcionam praticamente "estendendo as teclas do teclado". Assim, selecionando Ctrl ou Alt , abre um "novo teclado", do qual você selecionou a chave Delete . Isso não é o mesmo quando você seleciona Delete primeiro, que pertence ao teclado físico e não a este teclado estendido virtual. É este o caso?

    
por luchonacho 12.09.2017 / 22:00

2 respostas

5

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.
por 13.09.2017 / 12:13
2

Assim como pressionar a e, em seguida, Shift não fornece A , pressionando Excluir antes de Alt e Ctrl não enviarão os códigos de teclas corretos.

As teclas modificadoras precisam ser pressionadas antes da chave que elas modificam. As teclas modificadoras nesta instância são Alt e Ctrl enquanto que Excluir não é uma tecla modificadora.

Se fosse permitido pressionar a antes de Shift para obter A , o software que ler as teclas pressionadas não seria capaz de produzir qualquer caractere até o próximo caractere tinha sido digitado.

É o hardware do teclado que envia códigos de verificação diferentes dependendo se uma tecla foi pressionada com ou sem um modificador ativo.

    
por 13.09.2017 / 00:40