terça-feira, 15 de fevereiro de 2011

Como mudar o tamanho e a cor do cursor do modo texto do Linux

Você está cansado de ver aquele tracinho piscando no console do Linux? Em emuladores como Konsole ou Gnome-Terminal, é fácil mudá-lo. Mas e no modo texto puro? Neste tutorial, vamos aprender a mudar a aparência do cursor.
Este texto foi originalmente publicado no site Linux Gazette e está sob os termos da Open Publication License.

Copyright (c) 2007 by Anonymous. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/).

Sequências de escape para controlar a aparência do cursor no console do Linux (modo texto, não X11) ainda estão sendo incluídas na página do manual do console_codes, mas elas estão tentativamente documentadas no arquivo /usr/src/linux/Documentation/VGA-softcursor.txt [Nota: este arquivo apenas estará disponível se você tiver os fontes do kernel instalados em sua máquina. Em todo caso, eu encontrei uma versão do arquivo aqui.].

Este artigo é principalmente uma versão interpretada do arquivo acima, com exemplos adicionados, O arquivo foi escrito em 1999; se você o ler, entenderá por que ele precisa de interpretação.

Os seguntes arquivos também são relevantes:
/usr/src/linux/drivers/char/vt.c
/usr/src/linux/include/linux/console-struct.h

o primeiro das quais, infelizmente, é bastante difícil de digerir.

Cursor de hardware vs. cursor de software


O cursor do Linux é, por padrão, o cursor normal do modo texto do PC. Ele parece um curto underscore piscando ( _ ) esbranquiçado no preto, com o contraste fraco durante o dia. Este é o cursor de hardware, ou seja, ele é gerado pelo hardware.

Porém, o Linux tem a capacidade de manipular a aparência do cursor usando, por exemplo, um cursor de bloco não piscante gerado por software. Isto é feito com a sequência de escape

e[?p1;p2;p3;c


Onde e é o caractere de escape e p1, p2 e p3 são parâmetros. O último ponto-e-vírgula é opcional. Ele é usado aqui para dizer 'c' da carta fecho dos parâmetros. Se você omitir quaisquer dos parâmetros, será assumido o padrão 0. Apenas decimais são aceitos e você nunca obtém um erro: sua entrada vai ser restringida ao intervalo válido.

Cada console pode ter seu próprio cursor de software diferente.

Parâmetros


O parâmetro 3 configura os bits de cor no registro do adaptador VGA, o parâmetro 2 alterna os bits de cor e configurar vai anter de alternar. O que isso significa na prática teremos que descobrir.

O parâmetro 1 especifica o tamanho do cursor:

0   default
1 invisible
2 underscore
3 lower_third
4 lower_half
5 two_thirds
6 full block


O tamanho se refere à celula de caractere no cursor. Como um exemplo, emitindo

echo -e "e[?3c"


da linha de comando vai transformar o cursor em um underscore mais espesso, recuperando um terço da célula de caractere.

[ Assim, para fazer um cursor que pareça um retângulo piscante, chamado de bloco, basta digitar echo -e "e[?6c". ]

Os valores de 7 a 15 também são aceitos, mas eles são o mesmo que o 6. O cursor padrão é definido em console-struct.h como underscore, então, por padrão, os valores 0 e 2 são iguais.

Se o primeiro parâmetro é menor do que 16, os parâmetros 2 e 3 serão configurados para 0 e você terá o cursor de hardware, branco no preto. Se estiver visível, ele piscará.

Como para o tamanho, a boa notícia é que o parâmetro 1 realmente funciona. A má notícia é que os parâmetros 2 e 3 dependem das peculiaridades da placa VGA susceptíveis de ser implementados de forma diferente do adaptador gráfico para placa gráfica. Podemos assumir que os programadores do kernel estavam escrevendo seu código de acordo com o padrão VGA oficial, mas que especificações VGA raramente usadas são implementadas de uma forma não-padrão.

Um cursor de software é obtido configurando o parâmetro 1 para 16. Os valores de 17 a 31 são o mesmo que 16. Um cursor de software é um bloco completo não piscante na mesma cor.

Por exemplo: vamos tentar:

echo -e "e[?16c"


Nós não vemos nada. Como assim? Muito simples: o cursor é, agora, um bloco de uma célula de caractere cheia. Os parâmetros 2 e 3 estão ausentes, então eles são configurados para o padrão 0. Aquele bloco usa cor 0, que é preta. Preto no preto dá o quê? Isso é o que você está vendo.

Lição aprendida: se quisermos ver o cursor de software, precisamos especificar os parâmetros 2 e 3 de uma forma adequada. Vamos tentar de novo:

echo -e "e[?16;0;16c"


Você pode atravessar toda a gama de cores (0-7), deixando o segundo parâmetro a 0 e definir o terceiro parâmetro para um múltiplo de 16, ou melhor, um múltiplo com o fator 1-7. O fator 0 já nos ensinou uma lição. Apenas obteremos cores escuras.

Tão longe, tão bom. Nós podemos obter um cursor piscante em diferentes tamanhos; sua cor será a cor do texto do console. Nós podemos obter um cursor não piscante em uma faixa de cores, infependente das cores do texto e do fundo do console.

Surpresas


Os valores que você entrou para o parâmetro 1 são reduzidos módulo 32. Isso significa que 0-31, 32-63, 64-95 são os mesmos. Porém, de acordo com a documentação:

48-63   (range 16-31 plus 32)
gives a softcursor using the console foreground colour,
making the character at the cursor invisible

112-127 (range 16-31 plus 32 plus 64)
gives a softcursor using the console foreground colour
but allowing the character at the cursor to be read


Tente o seguinte:

    (i)     echo -e "e[?48c"
(ii) echo -e "e[?112c"


Note que você não está especificando os parâmetros 2 e 3. Se o fizer, eles serão aplicados.

Note também que uma cor de primeiro plano forte será reduzida quando usada como plano de fundo pelo cursor de software. Assim, se você mudar o padrão do console para um branco forte no preto, ambos (i) e (ii) vão lhe dar um bloco branco escuro não piscante.

Se você tentar obter algumas cores interessantes apenas brincando com os parâmetros, certifique-se de que suas opções são limitadas, e você estará desperdiçando muito tempo para nada. Essencialmente, o que você tem que lembrar é:

O parâmetro 3 determina a cor do fundo do cursor de software;

O parâmetro 2 determina a cor do primeiro plano do cursor de software;

Esta regra, no entanto, não é 100% correta, desde que o parâmetro 3 afeta o status de fraco/forte do primeiro plano. Por exemplo: vamos tentar a faixa 64-79 com o parâmetro 2 fixo em 0. O fundo do cursor de software, neste caso, é vermelho. O que muda quando o parâmetro corre de 64 a 79 é a cor do caractere no qual o cursor está em cima.

Estamos iniciando dos padrões branco fraco no preto e emitimos:

echo -e "e[?16;0;64c"


O fundo do cursor é vermelho; o caractere no cursor é branco fraco. Subimos de 64 a 71 e o resultado é o mesmo. Porém, de 72 a 79, o caractere sob o cursor fica forte; nós temos branco forte no vermelho.

O resultado é simples: com o parâmetro 2 fixo em 0, o parâmetro 3 terá
primeiro plano fraco para 16*k+l (0primeiro plano forte para 16*k+l (8

Onde 1

Tudo bem, mas e se nós mantivermos o parâmetro 3 fixo e deixarmos o 2 correr? Em nosso exemplo, nós mantivemos o parâmetro 3 em 64 e deixamos o parâmetro 2 ir de 1 a 15. O resultado é o primeiro plano do cursor em diferentes cores, enquanto o fundo não muda.

Isto é o máximo que podemos aspirar. Os próprios primeiro e segundo planos do cursor de software podem ser diferentes do primeiro e do segundo planos do console, mostrando a você quatro cores diferentes em todos os tempos.

Nenhum comentário:

Postar um comentário