Programación con Ncurses
Febrero 14 de 2.005.
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:
- http://lists.debian.org/debian-user-spanish/2001/04/msg00520.html=>Ejemplos sencillos y prácticos
- http://www.hackemate.com.ar/ezines/disidents/disidents004/disidents004/0X10.txt => Ejemplos con curses.
- http://sai.azc.uam.mx/apoyodidactico/ps/Apendice1/psape1.html=>Mucha teoría y algunos ejemplos
- http://ditec.um.es/~piernas/manpages-es/otros/tutorial-ncurses.html = > Para avanzados
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í.