Como descobrir a seqüência de escape que meus teclados enviam para o terminal?

5

Digamos que temos um teclado genérico com algumas chaves desconhecidas que podem enviar sequências de escape para o terminal.

O teclado está conectado a um emulador de terminal xterm rodando em um BSD / Linux genérico.

Para criar um mapeamento correto para as chaves desconhecidas, primeiro precisamos saber quais sequências de escape elas enviam para o xterm.

Mas como saber quais sequências de escape as chaves enviam?

    
por Howard 21.01.2014 / 11:11

1 resposta

11

Seu teclado não está conectado a xterm . Está conectado ao seu PC. Um driver de kernel sabe como decodificar o pressionamento e a liberação de teclas enviados pelo teclado e disponibilizá-los para aplicativos por meio de uma API genérica em um arquivo de dispositivo especial.

Um servidor X é um aplicativo desse tipo que usa essa API.

Ele traduz essas pressões e liberações de teclas nos eventos X "KeyPress" e "KeyRelease", que carregam com eles as informações da tecla pressionada como um keycode e um keysym. Essa é outra API.

xterm é um aplicativo X. Ele se conecta a um servidor X e informa: Estou interessado em todos os eventos KeyPress e KeyRelease . Quando tiver o foco e quando os eventos KeyPress e KeyRelease não forem sequestrados pelo Gerenciador de Janelas ou outros aplicativos que se registram globalmente em alguns eventos KeyPress, xterm receberá os eventos KeyPress e KeyRelease .

xterm traduz um keysym em um evento KeyPress em uma sequência de caracteres que envia para o lado mestre de um driver pseudo-terminal. Os aplicativos em execução no seu xterm eventualmente lerão do lado do escravo desse driver do pseudo-terminal os caracteres enviados por xterm , mas potencialmente alterados pelo driver do pseudo-terminal (por exemplo, sob algumas condições, os caracteres 0xd são convertidos para 0xa uns, 0x3 causaria o envio de uma SIGINT ...).

Com esses esclarecimentos fora do caminho. Para saber qual keycode ou keysym é enviado pelo servidor X em um determinado pressionamento de tecla, você pode usar xev .

Para saber qual seqüência de caracteres (se houver) é enviada por xterm , é necessário informar ao driver do pseudo-terminal para não se misturar com eles primeiro ( stty raw ) e, em seguida, usar cat -vt ou sed -n l ou od para vê-los:

{
  stty  raw min 1 time 20 -echo
  dd count=1 2> /dev/null | od -vAn -tx1
  stty sane
}

(acima, adicionando um min 1 time 20 e usando dd , para que ele saia depois de um pressionamento de tecla, pois você não seria capaz de sair com Ctrl-C ).

    
por 21.01.2014 / 12:05