Biblioteca de manejo de cursores ncurses
La biblioteca ncurses proporciona funciones para actualizar pantallas en modo texto
independientes del terminal en entornos UNIX y Linux.
Compilado y linkado
Para compilar un programa que use esta biblioteca hay que incluir el fichero de cabecera curses.h:
Para linkar un programa que use esta biblioteca hay que enlazar la biblioteca libncurses.a:
Las rutinas
Aunque esta biblioteca ofrece rutinas para múltiples aspectos, como manipulación de trozos de la pantalla, rutinas
de consulta del entorno, información sobre el terminal, etc., en este documento nos restringiremos a comentar las
funciones básicas necesarias para las prácticas de la asignatura. Por ejemplo, se pueden definir ventanas, que son
entidades lógicas que representan segmentos independientes de la pantalla y se pueden manipular independientemente.
Rutinas de inicialización y finalización
Antes de ejecutar las otras funciones de esta biblioteca es necesario llamar a las rutinas de inicialización.
WINDOW *initscr(void);
Esta función determina el tipo de terminal e inicializa todas las estructuras
de datos privadas de la biblioteca. También hace una primera llamada a la
función refresh, que actualiza el aspecto de la pantalla. Si se
produce algún error, imprime un mensaje indicándolo y acaba el programa. Si
finaliza correctamente, devuelve un puntero a una estructura que hace
referencia a la pantalla. Ese puntero se usará como parámetro en algunas
funciones.
int keypad(WINDOW *win, bool bf);
Esta rutina activa y desactiva la función de procesado de caracteres
especiales. Si está activada, el segundo parámetro es true, cuando se pulse una
tecla especial, las funciones de lectura, como getch, devuelven un único valor,
por ejemplo KEY_LEFT, para el cursor hacia arriba. Si está desactivada, la
lectura de una tecla especial requiere dos caracteres, y por tanto dos
lecturas, y es el usuario el que se tiene que encargar de interpretar los
caracteres de estas teclas especiales.
int nodelay(WINDOW *win, bool bf);
Esta rutina permite activar la opción que hace que las lecturas de datos de
teclado con getch no sean bloqueantes. Esto quiere decir que si se hace una
lectura con getch y no hay ningún carácter disponible en el buffer de
teclado, getch acaba y devuelve como resultado el valor constante ERR.
int noecho(void);
Las rutinas echo() y noecho() controlan si el carácter
tecleado es escrito en pantalla (eco) al leerse con la rutina getch.
int nonl(void);
La rutinas nl() y nonl() controlan el funcionamiento de la
tecla "retorno de carro" tanto en la lectura como en la escritura. Si se llama
a nonl(), la lectura del retorno de carro, no añade una nueva línea,
sino que su funcionamiento es controlado directamente por la aplicación.
int curs_set(int visibility);
Esta rutina set establece el aspecto del cursor: 0 -> invisible, 1 -> visible,
2 -> muy visible.
int endwin(void);
Al acabar de trabajar en el modo terminal, el programa debe llamar a esta
rutina para restaurar los valores apropiados de las variables de entorno y
seguir trabajando en el modo texto normal.
Rutinas de escritura
int move(int y, int x);
Este rutina mueve el cursor a la línea 'y' y la columna 'x'. Sin embargo, el
cursor físico no se mueve en el terminal hasta que se hace una llamada a la
función refresh(). La posición especificada es relativa a la esquina
superior izquierda de la ventana, que tiene las coordenadas (0,0).
int addch(chtype ch);
Esta rutina escribe el carácter que se pasa como parámetro en la posición en la
que esté el cursor y avanza el cursor a la siguiente posición. El carácter no
se muestra en la pantalla hasta que se hace una llamada a la función
refresh().
int echochar(chtype ch);
Esta rutina es equivalente a hacer una llamada a addch(ch) seguida de
una llamada a refresh().
int addstr(const char cad[]);
Esta rutina escribe la cadena de caracteres que se pasa como parámetro en la
pantalla. Es equivalenta a llamar a addch() para cada uno de los
caracteres de la cadena.
int refresh(void);
Esta rutina hace que se muestre la salida en la pantalla, ya que las otras
funciones simplemente manipulan estructuras de datos internas. El cursor se
queda tras el último carácter escrito.
int erase(void);
Esta rutina borra la pantalla escribiendo blancos en todas las posiciones.
Rutinas de lectura
int getch(void);
Esta rutina lee un carácter del buffer de teclado. Si se está en modo de no
espera (ver rutina nodelay), getch devuelve ERR si
no hay ningún valor disponible. Si se está en modo de espera, la rutina no
acaba hasta que se pulsa algún carácter.
Si el manejo de caracteres extendidos está activado (ver rutina
keypad), las teclas extendidas se leen como un solo caracter y se
identifican por un nombre que empieza por el prefijo KEY_. Por
ejemplo:
KEY_DOWN Los cuatro cursores
KEY_UP ...
KEY_LEFT ...
KEY_RIGHT ...
KEY_HOME Tecla Inicio
KEY_BACKSPACE Tecla Borrado
KEY_F0 Teclas de funci\'{o}n (hasta KEY_F63)
int getstr(char str[]);
Esta rutina lee una cadena de caracteres y la guarda en el parámetro.
Otras rutinas
void getmaxyx(WINDOW *win, int y, int x);
Esta rutina devuelve el tamaño de la ventana, medido en columnas y líneas.
Algunos enlaces con más información
- http://www.mkssoftware.com/docs/man3/ncurses.3.asp
- http://en.tldp.org/HOWTO/NCURSES-Programming-HOWTO/
- http://invisible-island.net/ncurses/man/ncurses.3x.html
Ejemplo:
El siguiente programa mueve el carácter '@' por la pantalla circularmente
siguiendo la pulsación de los cursores. El programa acaba cuando se pulsa la
tecla ESC, que corresponde al carácter 27.
La línea de compilación es la siguiente:
g++ prueba-ncurses.cpp -o prueba-ncurses -lncurses
#include <ncurses.h>
using namespace std;
int main()
{
WINDOW *w;
int tecla;
int max_x, max_y, pos_x, pos_y;
bool fin = false;
w = initscr();
keypad(w, TRUE);
noecho();
nonl();
curs_set(0);
erase();
getmaxyx(w, max_y, max_x);
pos_x = max_x / 2;
pos_y = max_y / 2;
do
{
move(pos_y, pos_x);
addch('@');
refresh();
tecla = getch();
move(pos_y, pos_x);
addch(' ');
refresh();
switch(tecla)
{
case KEY_UP:
pos_y = (pos_y + (max_y - 1)) % max_y;
break;
case KEY_LEFT:
pos_x = (pos_x + (max_x - 1)) % max_x;
break;
case KEY_RIGHT:
pos_x = (pos_x + 1) % max_x;
break;
case KEY_DOWN:
pos_y = (pos_y + 1) % max_y;
break;
case 27: // tecla ESC
fin = true;
break;
}
} while (!fin);
endwin();
return 0;
}
File translated from
TEX
by
TTH,
version 3.59.
On 28 Apr 2004, 11:38.