domingo, 9 de outubro de 2016

Introdução a ncurses em C !



Intrudução ( hmm... ) a ncurses em C ... bom logo na imagem acima você vera um exemplo de um "menu" feito em ncurses ... ncurses é uma biblioteca que lhe fornece um API pare desenvolvimento de interfaces em modo texto ... é muito usado na maioria dos scripts para linux hoje em dia ...

Um bom exemplo é as man-pages do linux .

PS : O'que sera apresentado nesse texto foi testado nas distribuições manjaro e ubuntu usando o compilador gcc ... o procedimento dependendo da sua distribuição podera mudar um pouco ( somente na instalação da biblioteca ncurses )

PS/2 : Esse post tem próposito de apenas passar conhecimento , as explicações contidas aqui seram focadas principalmente em tentar alcançar a todos os leitores, fontes para estudos e links estarão no final do post!

Bom, para programar algo usando ncurses primeiramente tera que instalar a biblioteca ncurses no seu sistema caso não tenha instalada...

OBS : Algo importante , ao compilar um programa que utiliza essa biblioteca caso você use o gcc , tera que utilizar o parametro "-lncurses" como no exemplo abaixo :
gcc prog.c -o prog -lncurses

Bom , vamos aos nossos primeiros passos com essa excelente biblioteca tendo em mente que você ja tenha tudo instalado e pronto ...

Primeiramente e algo que é bem obvío , tera que adicionar ao seu script o header ncurses.h no caso #include <ncurses.h>

Bom ... para iniciar o modo "curses" ( inciar a lib ) teremos que usar a função
initscr();

Logo para fechar a lib , teremos que usar a função endwin();

O nósso codigo devera ficar entre essas duas funções ... vamos a um classico hello world utilizando essa lib...

<-- code
#include <ncurses.h>
int main(void){

initscr();
printw("Hello world");
endwin();

}
--- >code

Não parece tão dificil certo ? quase a mesma coisa que programar em C ! bem , ao compilar esse codigo , no caso gcc prog.c -o prog -lncurses ... você não vera quase nada ... porque ?

Bem, porquê o programa ira executar em uma velocidade alta ... teremos que interromper o programa para podermos ver claramente o hello world ... podemos usar a função getch(); pra isso...

O'que getch(); faz ? ele interrompe a execução do programa e vira esperando você digitar um tecla , sem a necessidade de você apertar ENTER ( creio que alguns pensaram em montar "keyloggers" agora haha ) ...

Bem , o nósso código ficara da seguinte forma...

<---code
#include <ncurses.h>
int main(void){

initscr();
printw("Hello world");
getch();
endwin();
}
-->code

Vamos a uma breve print a quem está aqui apenas para a prender e não tem os requesitos para testar ...






Perceberam que todo o espaço do terminal está reservado para o'que imprimirmos na tela ? bom , por várias vantagens que essa lib traz tem pessoas que criam até jogos encima dela ( eu ja fui um desses ) , é realmente bem bacana... mas continuando ...

Existe tambem uma função muito legal que você pode imprimir um ou mais caracters em uma determinada "posição" do terminal baseda em altura e largura...

essa função é semalhante a printw e se chama mvprintw();

Sua sintaxe é mvprintw(altura,largura,"sua frase ou caracter");

vamos a um exemplo de como ficaria com um print de resultado ...



<---code
#include <ncurses.h>
int main(void){

initscr();
mvprintw(10,10,"Hello world, Aqui eh da Mundo Unix!");
getch();
endwin();
}
-->code


Olhem o resultado abaixo !




Outra função interessante ... é chamada noecho(); se você ja usou a função getch(); mais de uma vez no mesmo script , percebeu que ao digitar uma tecla , ela ira aparecer na tela ... mas caso você não queira isso ? queira apenas que o script pegue a tecla digitada ? ae entra a utilidade da função noecho(); basta usar ela antes da função getch(); que o caracter não sera imprimido!

Bom , mas, vamos partir então para o sistema de coloração ... digamos que você queira selecionar cores expecificas para letra e fundo do terminal , como fica ?

Bem , veremos isso então !

primeiramente para iniciar o sistema do cores da biblioteca ncurses, você devera usar a função start_color();

logo depois para selecionar as cores que você quer aplicar ira usar a função init_pair(); e sua sintaxe é :

init_pair(short pair, cor da letras, cor de fundo);

short pair ? o'que diabos é isso ? vamos chamar de id então...

Digamos que a função init_pair(); possa ser usada várias vezes ... por exemplo...

init_pair(1,COLOR_RED,COLOR_GREEN);
init_pair(2,COLOR_GREEN,COLOR_BLACK);
init_pair(3,COLOR_BLUE,COLOR_BLACK);

E você pode selecionar qualquer um desses esquemas de cores apenas pelo seu id , utilizando a função attron();

a sua sintaxe é attron(id);

esse id é o id do init_pair(); que você quer ... se lembra que tinhamos definidos 3 ? e cada um tinha um numero como 1,2,3 ? então , podemos escolher qualquer um desses esquemas de cores para aplicar ...

vamos escolher um no caso... então por exemplo ficaria...
attron(COLOR_PAIR(1));

Lembrando que attron(COLOR_PAIR(1)); só ira aplicar cor as legras e ao cursos ...

Para aplicar cor ao fundo, usamos a função bkgd(COLOR_PAIR(1));

E agora veremos como o codigo ficaria !
<--code
#include <ncurses.h>
int main(void){

initscr();
start_color();
init_pair(1,COLOR_RED,COLOR_GREEN);
init_pair(2,COLOR_GREEN,COLOR_BLACK);
init_pair(3,COLOR_BLUE,COLOR_BLACK);
attron(COLOR_PAIR(1));
bkgd(COLOR_PAIR(1));
mvprintw(10,10,"Hello world, Aqui eh da Mundo Unix!");
getch();
endwin();
}
-->code
Print do resultado abaixo !






Bom , algumas utilidades agora ... existem 2 macros bem uteis que determinam o tamanho e largura da janela do terminal ...

Essas macros são LINES ( altura ) , COLS ( largura )...

Para medir o tamanho da janela do nosso terminal poderiamos usar o essas macros da seguinte forma !
<--code

#include <ncurses.h>
int main(void){

initscr();
start_color();
mvprintw(2,5,"Altura : %i",LINES);
mvprintw(3,5,"Largura : %i",COLS);
getch();
endwin();
}
-->

O resultado abaixo :


Como pode ver ele me retornou o valor altura 34 e o valor de largura 40 ...

Essas macros são bem uteis caso você queira criar janelas usando ncurses ou até mesmo centralizar algo na tela ...

Logo com o seguinte codigo : int algura = LINES / 2; int largura = COLS / 2;
Você tem o os valores de altura e largura correspondentes ao centro da tela :)

Bem , eu vou parando por aqui ... lembrando que essa é apenas uma introdução , em proximos post's pretendo trazer mais conteudo sobre essa biblioteca , como a criação de janelas, menus e até uns exemplos de alguns jogos utilizando ncurses =)

Fontes para estudo  --

Link1 ( ingles ) : http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/
Link2 ( pt-br ) : https://www.vivaolinux.com.br/artigo/Utilizando-a-biblioteca-NCURSES-Parte-I
Link3 ( ingles ) : http://pubs.opengroup.org/onlinepubs/7908799/xcurses/curses.h.html


Notou algo errado ou incorreto nesse post ? Nos informe -> Aqui!
Obrigado a todos que leram até aqui .

0 comentários:

Postar um comentário

Tecnologia do Blogger.

Popular Posts