Programación con Ncurses

De Grupo GNU/Linux de la Universidad del Cauca
Saltar a: navegación, buscar

Febrero 14 de 2.005.

Por Wilson Libardo Pantoja Y.

Las ncurses son librerías que permiten trabajar funciones similares a las contenidas en la librería conio.h del viejo turboC de Borland, entre las cuales están: gotoxy(), clrscr(), textcolor(), getch(), etc. Con ncurses se pueden hacer aplicaciones gráficas elegantes en modo texto y de forma muy fácil.

En Internet he encontrado mucha documentación sobre ncurses, sin embargo, para un principiante, la información es tan profunda que resulta complicado su entendimiento. Mi intención es brindar un documento sencillo e introductorio sobre esta librería.


Un Programa sencillo: “Hola linux..”


Utiliza un editor de texto cualquiera y copia (o digita) este programa y grábalo con el nombre programa.c:


#include <ncurses.h>
int main() {
       initscr();
       printw("Hola linux!");
       refresh();
       getch();
       endwin();
       return 0;
}


Nótese que en este programa se ha incluído: #include <ncurses.h> , con lo cual se tiene acceso al uso de las siguientes funciones:


  • initscr(): se la utiliza para inicializar un ventana en modo ncurses.


  • printw(): es para imprimir texto en la ventana. Es importante usar printw y scanfw en lugar de printf, scanf, porque se tendrían salidas erróneas debido a los buffers intermedios de linux.


  • refresh(): sirve para refrescar la pantalla, todos los printw se muestran efectivamente al hacer refresh.


  • getch(): espera una sola pulsación de una sola tecla (sin tener que presionar “Enter”), devolviendo el código ASCII de la tecla pulsada como un entero.


  • endwin(): finaliza el modo de ncurses. Es importante colocar esta instrucción, de lo contrario el terminal queda desconfigurado, obligando a cerrar la consola.


Compilar el programa “Hola Linux”

Para compilar desde consola este programa se debe utilizar el parámetro –lncurses, que indica al compilador que el programa está utilizando curses; el comando completo es:


gcc -lncurses programa.c


Ejemplos

A continuación he elaborado algunos ejemplos sencillos y prácticos que ilustran como trabajar curses.


/*dibujar_cuadro.c
ESTE PROGRAMA DIBUJA UN CUADRO. UTILIZA LA LIBRERIA curses.h QUE SUSTITUYE DE ALGUNA FORMAA LA      CONIO.H DEL VIEJO TURBO C
COMPILE ESTE PROGRAMA CON LA INSTRUCCION:  gcc dibujar_cuadro.c -o ejecutable -lncurses*/
#include <curses.h> //Incluiremos una librería a nuestro sistemas
#include <stdio.h>
void salir (void);  //Esta funcion hará que nuestro programa se cierre
int main(void)
{
   int i;char c;
   initscr();   /*Esta función  inicializa  ncurses. Para todos los programas
                  debemos siempre inicializar  ncurses y luego finalizarla, como
                 veremos adelante. */
   c=95;//caracter ascci horizontal
   for(i=1;i<=120;i++)
   {
      //linea horizontal superior
      move(1,i);  //Aqui estamos moviendo el cursor para a linea 1 columna i.
      printw("%c",c);  //Imprimimos un texto en la posición establecida.
      //linea horizontal inferior
      move(40,i);  //Aqui estamos moviendo el cursor para a linea 40 columna i.
      printw("%c",c);  //Imprimimos un  texto en la posición establecida.
   }
   c=124 ; //caracter ascci vertical
   for(i=2;i<=40;i++)
   {
      //linea vertical izquierda
      move(i,1);
      printw("%c",c);
      //linea vertical derecha
      move(i,120);
      printw("%c",c);
   }
   refresh();
   //getch(); //si se desea hasta que se pulse una tecla
   sleep(3);//se detiene tres segundo
   salir();    // Salir del programa
}
/*********************************************************************/
void salir()
{
   endwin(); /*Siempre que finalizamos un programa con una biblioteca curses,
                    debemos ejecutar este comando.*/
   exit(0);
}

A continuación un segundo ejemplo:

/*Este ejemplo captura las teclas y muestra el valor devuelto
por cada uno de ellas. La tecla <Esc> parece más lenta pero eso
es debido a que existe la necesidad de distinguir un caracter <Esc>
aislado de una secuencia de caracteres que empiece por <Esc> y que
podría venir de una tecla de función por ejemplo.*/
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
WINDOW *win; /** manejaremos una única ventana de pantalla completa **/
/*********************************************************************/
void IniVideo(){
       win=initscr(); /* Crea la ventana */
       clear();  /* Borra la pantalla entera bajo ncurses */
       refresh(); /* Actualiza la ventana con los cambios */
       noecho();
       cbreak();
       keypad(win, TRUE);
}
/*************************/
Exit(){
       refresh();
       endwin();
       exit(1);
}
/*****************************************************************/
main () {
       IniVideo();
       move(7, 30); /* x , y */
       printw("Ctrl-C  para terminar");
       for(;;){
               move(12, 30); /* x , y */
               printw("%3d", getch());
               refresh();
       }
       Exit();
}

Ahora un tercer ejemplo, bastante elegante porque utiliza colores.


#include <curses.h>
#include <stdio.h>
void sair (void);  //Esta función se utiliza al Salir del programa
int main(void)
{
   initscr();   /*Esta función inicializa los ncurses
   start_color(); //Esta función inicia los colores
//Define pares de colores que serán definidos en el programa
init_pair(1,COLOR_WHITE,COLOR_BLUE); //Texto(Blanco) | Fondo(Azul)
   init_pair(2,COLOR_BLUE,COLOR_WHITE); //Texto(Azul) | Fondo(Branco)
   init_pair(3,COLOR_RED,COLOR_WHITE);  //Texto(rojo) | Fundo(Blanco)
   bkgd(COLOR_PAIR(1));  /*Aqui define el color de fondo del programa
   attron(COLOR_PAIR(3));
   move(2,1);  //Aqui mueve el cursor a linea 2 columna 1.
   printw("Olá mundo!!!");  //Imprimimos el texto en la posición especificada 
                              en la linea anterior.
   attroff(COLOR_PAIR(3));  /*Esta alterando el par de colores por omisión*/
   attron(COLOR_PAIR(2));
   move(3,1);
   printw("Cualquier tecla para salir"); /*Imprime el texto en la posición
                                         especificada en la línea anterior */
   attroff(COLOR_PAIR(2));
   refresh();    //Actualiza la ventana
   getch();      //Espera que el usuario presione un tecla
   sair();    // llama a la función salir
}
/*********************************************************************/
void salir()
{
   endwin(); /*Siempre que finalizamos un programa con una biblioteca curses,
                    debemos ejecutar este comando.*/
   exit(0);
}

Y si aparte de esto todavía quieres trabajar con la conio.h que funcionaba con el Turbo C de DOS, recomiendo esta página en la cual se implementa dicha función a partir de ncurses:


Con lo descrito en este artículo entenderás lo básico para programar con curses en Linux. Ahora, si ya quieres profundizar más recomiendo visitar las siguientes páginas:



El contenido del material publicado por nuestros columnistas es responsabilidad de sus autores.

Para saber más sobre la programación y naturaleza de nuestros artículos, columnas y pistas técnicas, haga clic aquí.