NOME
console_codes − Sequëncias de controle e saída do console Linux
DESCRIÇÃO
O console Linux implementa um vasto subconjunto de controles de terminais VT102, ECMA-48/ISO, 6429/ANSI X3.64, adicionando certas seqüencias em modo privativo para mudar a paleta de cor, conjunto de mapeamento de caracteres, etc. Na tabela abaixo, a segunda coluna fornece os mneumônicos ECMA-48 ou DEC (se prefixado com DEC) para a função fornecida. Seqüencias sem um menumônico não são ECMA-48 ou VT102.
Após o resultado do processamento normal ter sido concluido e uma seqüencia de caracteres ter chegado ao driver de console para a impressão real, a primeira coisa que acontece é uma tradução do código usado para o processamento para o código usado para impressão.
Se o console está no modelo UTF-8, então o bytes de entrada são primeiramente montados em códigos Unicode de 16bits. Caso contrário, cada byte é transformado de acordo com a tabela de mapeamento atual (o qual é traduzido para um valor Unicode). Veja a seção CONJUNTO DE CARACTERES abaixo para um discussão a respeito.
No caso normal, o valor Unicode é convertido para um índice de fonte e armazenado na memória de video, de forma que o símbolo correspondente (como encontrado na ROM de vídeo) aparece na tela. Note que o uso do Unicode (e o projeto do PC) nos permite usar 512 símbolos simultaneamente.
Se o valor Unicode atual é um caractere de controle ou nós estamos processando uma seqüencia de escape, o valor será tratado especialmente. No lugar de ir sendo transformado em um índice de fonte e desenhado como um símbolo, ele pode disparar o movimento do cursor ou outras funções de controle. Veja a seção CONTROLES DE CONSOLE LINUX abaixo para um discussão a respeito.
Geralmente não é uma boa prática fixar códigos de controles de terminais dentro de programas. O Linux suporta uma base de dados terminfo(5) de capacidades de terminais. Ao invés de emitir manualmente uma seqüencia de escape, você irá quase sempre procurar usar uma biblioteca de tela terminfo ou utilitários como por exemplo ncurses(3), tput(1), ou reset(1).
CONTROLES DE CONSOLE LINUX
Esta seção descreve todos os caracteres de controle e seqüencias de escape que chamam funções especiais (isto é, qualquer coisa exceto escrever um símbolo na localização atual do cursor) no console do Linux.
Caracteres
de Controle
Um caracter é dito de controle se (antes da
transformação de acordo com a tabela de
mapeamento) ele tem um dos 14 códigos 00 (NUL), 07
(BEL), 08 (BS), 09 (HT), 0a (LF), 0b (VT), 0c (FF), 0d (CR),
0e (SO), 0f (SI), 18 (CAN), 1a (SUB), 1b (ESC), 7f (DEL). Um
conjunto pode selecionar um modo de ’caracter de
controle de exibição’ (veja abaixo), e
permitir que 07, 09, 0b, 18, 1a, 7f sejam exibidos como
símbolos. Por outro lado, em modo UTF-8 todos os
códigos de 00-1f são respeitados como
caracteres de controle, sem ligação com
qualquer modo
Se nós temos um caracter de controle, ele é manipulado imediatamente e então descartado (mesmo que no meio de um seqüencia de escape) e a seqüencia de escape continua com o próximo caracter. (De qualquer forma, ESC inicia uma nova seqüencia de escape, possivelmente abortando uma seqüência anterior inacabada, CAN e SUB abortam qualquer seqüencia de escape). Os caracteres de controle reconhecidos são: BEL, BS, HT, LF, VT, FF, CR, SO, SI, CAN, SUB, ESC, DEL, CSI. Eles fazem o que é esperado:
BEL (0x07, ^G) Emite um bip; | |
BS (0x08, ^H) Retorna uma coluna (mas não passa do inicio da linha); | |
HT (0x09, ^I) Vai para a próxima parada de tabulação ou para o fim da linha se estiver na última tabulação; | |
LF (0x0A, ^J), VT (0x0B, ^K) e FF (0x0C, ^L) todos fornecem uma avanço de linha; | |
CR (0x0D, ^M) envia um retorno de carro; | |
SO (0x0E, ^N) ativa o conjunto de caracteres G1, e se LF/NL (modo nova linha) é selecionado, envia também um retorno de carro; | |
SI (0x0F, ^O) ativa o conjunto de caracteres G0; | |
CAN (0x18, ^X) e SUB (0x1A, ^Z) interrompem a seqüencia de escape | |
ESC (0x1B, ^[) inicia uma seqüencia de escape; | |
DEL (0x7F) é ignorado; | |
CSI (0x9B) é equivalente a ESC [. |
ESC - mas não a seqüencia CSI
Seqüências
ECMA-48 CSI
CSI (ou ESC [) é seguido por uma seqüência
de parâmetros na maioria NPAR (16), que são
números decimais separados por
ponto-e-vírgula. Um parâmetro vazio ou ausente
é interpretado como 0. A seqüência de
parâmetros pode ser precedida pelo sinal de
interrogação.
Entretanto, após o CSI [ (ou ESC [ [) um único caracter é lido e a seqüência inteira é ignorada. (A idéia é ignorar uma tecla de função que seja ecoada).
A ação de uma seqüência CSI é determinada pelo seu caracter final.
ECMA-48
Define a Apresentação Gráfica
O ECMA-48 SGR seqüência ESC [
<parâmetros> m define os atributos de
exibição. Vários atributos podem ser
definidos na mesma seqüência.
Opções
do Modo ECMA-48
ESC [ 3 h
DECCRM (Padrão Desativado): Caracteres de Controle de Exibição.
ESC [ 4 h
DECIM (Padrão Desativado): Define Modo de Inserção.
ESC [ 20 h
LF/NL (Padrão Desativado): Automáticamente segue o eco do LF, VT ou FF com CR.
ECMA-48
Comandos de Resultado de Estado
ESC [ 5 n
Informa o estado do dispositivo (DSR): A resposta é ESC [ 0 n (Terminal OK).
ESC [ 6 n
Informa a posição do cursor (CPR): A resposta é ESC [ y ; x R, onde x,y é a localização do cursor.
DEC
Seqüência do Modo Privado (DECSET/DECRST).
Ele não é descrito no ECMA-48. Nós
listamos a seqüência dos modos de
configuração; as seqüências do Modo
de Reinicialização são obtidas pela
troca do ’h’ final por ’l’.
ESC [ ? 1 h
DECCKM (Padrão Desativado): Quando definido, as teclas de cursor enviam um prefixo ESC O, ao invés de ESC [.
ESC [ ? 3 h
DECCOLM (Padrão Desativado = 80 colunas): Alterna de 80/132 colunas. Este parâmetro sozinho nem sempre é suficiente, alguns utilitários em modo usuá rio como o resizecons(8) altera os registradores do equipamento na placa de vídeo.
ESC [ ? 5 h
DECSCNM (Padrão Desativado): Define o modo de vídeo reverso.
ESC [ ? 6 h
DECOM (Padrão Desativado): Quando definido, o endereçamento do cursor é relativo ao canto superior esquerdo da região de rolagem.
ESC [ ? 7 h
DECAWM (Padrão Ativo): Define quebra de linha automática. neste modo, um caracter gráfico emitido após a coluna 80 (ou coluna 132 se DECCOLM ativo) força uma quebra para o inicio da primeira linha seguinte.
ESC [ ? 8 h
DECARM (Padrão Ativo): Define autorepetição do teclado ativo.
ESC [ ? 9 h
X10 Informações do Mouse (Padrão Desativado): Define o modo de informações para 1 (ou reinicia para 0) − veja abaixo.
ESC [ ? 25 h
DECCM (Padrão Ativo): Torna o cursor visivel.
ESC [ ? 1000 h
X11 Informações do Mouse (Padrão Desativado): Define o modo de informações para 2 (ou reinicia para 0) − veja abaixo.
Seqüência
de Console Linux Privada - CSI
As seqüências a seguir não são
ECMA-48 nem VT102 nativa. Elas são nativas para o
driver de console Linux. As cores estão nos
parâmetros SGR: 0 = preta, 1 = vermelha, 2 = verde, 3
= marrom, 4 = azul, 5 = magenta, 6 = ciano, 7 = branca.
CONJUNTO DE CARACTERS
O Linux conhece entorno de 4 traduções de bytes em símbolos de console de tela. As 4 tabelas são: a) Latin1 -> PC, b) VT100 gráfico -> PC, c) PC -> PC, d) definição-usuário.
Existem dois conjuntos de caracteres chamados G0 e G1 e um deles é o conjunto corrente. (Inicialmente G0.) Digitar ^N torna o G1 o corrente, ^O torna o G0 corrente.
Estas variáveis G0 e G1 estão na tabela de tradução e podem ser alteradas pelo usuário. Inicialmente elas apontam a tabela a) e b), respectivamente. As seqüências ESC ( B e ESC ( 0 e ESC ( U e ESC ( K fazem G0 apontar para a tabela de tracução a), b), c) e d), respectivamente. As seqüências ESC ) B e ESC ) 0 e ESC ) U e ESC ) K fazem G1 apontar para a tabela de tradução a), b), c) e d), respectivamente.
A seqüência ESC c reinicializa o terminal, que é o que você vai querer se a tela está com sujeiras. O aviso "echo ^V^O" tornará apenas G0 corrente, mas não há garantias de que G0 aponta a tabela a). Em algumas distribuições há um programa reset(1) que apenas executa um "echo ^[c". Se sua entrada terminfo para a console está correta (e tem uma entrada rs1=\Ec), então "tput reset" funcionará.
A tabela de mapeamento definida pelo usuário pode ser usada através do mapscrn(8). O resultado do mapeamento é que se o símbolo c é impresso, o símbolo s = map[c] é enviado para a memória de vídeo. O bitmap que corresponde a s é encontrado na ROM de caracter e pode ser alterado usando o setfont(8).
RASTREAMENTO DO MOUSE
A facilidade de rastreamento do mouse pretende retornar informações de estado do mouse compatível com xterm. Devido ao controlador de console não ter como saber o dispositivo e o tipo do mouse, estas informações são retornadas na seqüência de entrada da console apenas quando o controlador de terminal virtual recebe uma atualização através do ioctl. Estes ioctls são gerados pela aplicação relacionada ao mouse em modo usuário, tal como, o gpm(8).
Parâmetros para todas as seqüências escape de rastreamento do mouse geradas pelo xterm codificam parâmetros numéricos em um simples caracter como valor+040. Por exemplo, ’!’ is 1. O sistema de coordenada de tela é baseado em 1.
O modo de compatibilidade X10 envia um seqüência escape ao pressionar um botão codificando a localização e o botão pressionado. Isto é habilitado enviando ESC [ ? 9 h e desativado com ESC [ ? 9 l. Ao pressionar o botão, o xterm envia ESC [ M bxy (6 caracteres). Aqui b é o botão−1, e x e y são as coordenadas x e y do mouse quando o botão foi pressionado. Este é o mesmo código que o núcleo também produz.
O modo de rastreamento normal (não implementado no Linux 2.0.24) envia uma seqüência escape quando o botão é pressiondo e liberado. Modificadores de informações também são enviados. Isto é habilitado enviado ESC [ ? 1000 h e desativado com ESC [ 1000 l. Ao pressionar e liberar o botão, o xterm envia ESC [ M bxy. Os dois bits baixos de b codifica informações do botão: 0=MB1 pressionado, 1=MB2 pressionado, 2=MB3 pressionado, 3=liberado. Os bits altos codificam que os modificadores foram teclados quando o botão foi pressionado e acrescentado junto: 4=Shift, 8=Meta, 16=Control. De novo x e y são as coordenadas x e y do mouse. O canto superior esquerdo é (1,1).
COMPARAÇÃO COM OUTROS TERMINAIS
Diferentes tipos de terminais são descritos, com a console Linux sendo ’VT100-compatível’. Aqui nós discutimos diferenças entre a console Linux e outros dois mais importantes, o DEC VT102 e xterm(1).
Tratamento
dos caracteres de controle
O vt102 também reconhece os seguintes caracteres de
controle:
NUL (0x00) foi ignorado; | |
ENQ (0x05) resposta disparada; | |
DC1 (0x11, ^Q, XON) transmissão reiniciada; | |
DC3 (0x13, ^S, XOFF) faz o vt100 ignorar (e parar de transmitir) todos os códigos exceto XOFF e XON. |
O processamento DC1/DC3 similar ao VT100 pode ser habilitado pelo driver tty.
(no modo vt100) reconhece os caracteres de controle BEL, BS, HT, LF, VT, FF, CR, SO, SI, ESC. |
Seqüências
Escape
Seqüências de console VT100 não
implementadas na console Linux:
O programa xterm (no modo vt100) reconhece ESC c, ESC # 8, ESC >, ESC =, ESC D, ESC E, ESC H, ESC M, ESC N, ESC O, ESC P ... ESC ESC Z (ele responde ESC [ ? 1 ; 2 c, ’Eu sou um vt100 com opções avançadas de vídeo’) e ESC ^ ... ESC com o mesmo significado indicado acima. Ele aceita ESC (, ESC ), ESC *, ESC + seguido por 0, A, B para o caracter especial DEC e a definição do desenho de linha, UK, e USASCII, respectivamente. Ele aceita ESC ] para a definição de certos recursos:
Ele reconhece as seqüências a seguir com significado ligeiramente diferente:
Ele também reconhece
Ele não reconhece ESC % ...
Seqüência
CSI
O programa xterm (como o do XFree86 3.1.2G)
não reconhece os modos: piscante ou invisível
SGRs. Algumas versões do X11R6 não reconhecem
o conjunto de cores SGRs. Todas as demais
seqüências ECMA-48 CSI reconhecidaas pelo Linux,
também são reconhecidas pelo xterm, e
vice-versa.
O programa xterm reconhecerá todas as seqÜências do modo privado DEC listadas acima, mas, não as seqüências do modo privado Linux. Para uma discussão das seqüências de modo privado do xterm’s , refira-se ao documento Seqüências de Controle do Xterm de Edward Moy e Stephen Gildea, disponível com a distribução do X.
PROBLEMAS
Na versão 2.0.23, o CSI é interrompido e o NUL não é ignorado dentro da seqüência escape.
VEJA TAMBÉM
console(4), console_ioctl(4), charsets(7)
TRADUZIDO POR LDP-BR em 21/08/2000.
Fábio Henrique F. Silva <fabiohfs [AT] eol.br> (tradução) André L. Fassone Canova <lonelywolf [AT] blv.br> (revisão)