paulo1205
(usa Ubuntu)
Enviado em 30/06/2016 - 10:58h
A ConIO (de
CONsole Input and Output ) é uma versão reduzida e adaptada apenas para PCs da biblioteca Termcap (
TERMinal CAPabilities ) do mundo UNIX. Funcionalidades básicas da ConIO, tais como
clrscr (),
gotoxy () ou
textcolor (), podem ser substituídas por funções da Termcap ou de sua sucessora, chamada Terminfo (de
TERMinal INFOrmation ).
Algumas funções mais avançadas, como manipulação mais intensiva de elementos na tela, menus, painéis e até mesmo suporte rudimentar a mouse, são geralmente feitas através da biblioteca Curses (
CURSor addrESsing ).
Segue abaixo um exemplo de uso de Terminfo. O programa desenha cubos mostrando (parte) das cores disponíveis para uso, primeiro num terminal compatível com ANSI X3.64 (8 cores, de 0 a 7), e depois as 216 cores (16 a 231) de um terminal compatível com XTerm com 256 cores. No final, ele imprime texto usando todas as cores disponíveis. Programa típico de ConIO, mas usando as bibliotecas do UNIX.
#include <term.h>
#include <stdio.h>
#include <unistd.h>
inline void gotoxy(int x, int y){
putp(tparm(cursor_address, y, x));
}
int main(void){
int r, g, b;
int fg_color, bg_color;
const double sin60=0.86602540378444, cos30=sin60;
const double cos60=0.5, sin30=cos60;
int xc, yc;
int x, y;
int rep;
int n, step;
setupterm(NULL, STDOUT_FILENO, NULL); // Carrega parâmetros do terminal e associa a saída padrão (stdout).
// columns e lines são variáveis globais da terminfo.
xc=columns/2;
yc=lines/2;
// putp() envia para o terminal um parâmetro da Terminfo.
// Os parâmetros, por sua vez, são variáveis globais ou macros.
putp(exit_attribute_mode);
rep=0;
do {
step=1;
n=1;
while(n>0){
putp(exit_attribute_mode);
putp(clear_screen);
for(r=0; r<n; r++){
for(g=0; g<n; g++){
for(b=0; b<n; b++){
bg_color=4*b+2*g+r;
fg_color=(r+g+b>2? 0: 7);
x=xc+5*(g-r)*cos30;
y=yc-2*(b-(g+r)*sin30);
putp(tparm(set_a_foreground, fg_color));
putp(tparm(set_a_background, bg_color));
gotoxy(x, y-1);
printf(" ");
gotoxy(x, y);
printf(" %3d ", bg_color);
}
}
}
fflush(stdout); // Força atualização imediata do terminal (stdio normalmente bufferiza operações).
//sleep(1);
usleep(250000);
if(n==2)
step=-step;
n+=step;
}
} while(rep++<10);
rep=0;
if(max_colors>16){ // max_colors é uma variável global da Terminfo.
do {
step=1;
n=1;
while(n>0){
putp(exit_attribute_mode);
putp(clear_screen);
for(r=0; r<n; r++){
for(g=0; g<n; g++){
for(b=0; b<n; b++){
bg_color=16+36*r+6*g+b;
fg_color=16+(r+g+b>8? 0: 215);
x=xc+5*(g-r)*cos30;
y=yc-2*(b-(g+r)*sin30);
putp(tparm(set_a_foreground, fg_color));
putp(tparm(set_a_background, bg_color));
gotoxy(x, y-1);
printf(" ");
gotoxy(x, y);
printf(" %3d ", bg_color);
}
}
}
fflush(stdout);
//sleep(1);
usleep(250000);
if(n==6)
step=-step;
n+=step;
}
} while(rep++<10);
}
putp(exit_attribute_mode);
putp(tparm(cursor_address, lines-3, 0));
for(int cor=0; cor<max_colors; cor++){
putp(tparm(set_a_foreground, cor));
printf("Cor %d normal ", cor);
putp(enter_bold_mode);
printf("e \"bold\".\n");
putp(exit_attribute_mode);
}
putp(exit_attribute_mode);
printf("Cor reset normal ");
putp(enter_bold_mode);
printf("e \"bold\".\n");
putp(exit_attribute_mode);
return 0;
}
Para compilá-lo, não esqueça de linkar a biblioteca Terminfo (opção
-ltinfo na linha de comando). Por exemplo:
gcc -Wall -Werror -O2 -std=gnu99 colorcube.c -o colorcube -ltinfo
Se você o executar no terminal com o tipo definido como “
xterm ”, que é o mais comum, só vai obter 8 ou 16 cores. Se quiser forçar o uso de 256 cores, pode ter de mudar a variável de ambiente que indica o tipo do terminal.
env TERM=xterm ./colorcube # provavelmente usará 8 cores
env TERM=xterm-16color ./colorcube # provavelmente usará 16 cores
env TERM=xterm-256color ./colorcube # provavelmente usará 256 cores