2 Ejemplitos de ncurses
Son varios los interesados y en previsión de nuevas solicitudes
lo envío a la lista. Además son dos ejemplos muy cortitos.
El primer 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.
=====8<------(cortar por aqui) -----------------------------------
/****************************************************************
Usa cbreak(3ncurses) keypad(3ncurses) *getch(3ncurses)
cc pruncurses.c -lncurses -o pruncurses
*****************************************************************/
#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();
}
=====8<------(cortar por aqui) -----------------------------------
El segundo ejemplo muestra en el centro de la pantalla una
serie de cadenas en varios colores distintos.
LINES tomara el valor del número de líneas de nuestro terminal
y COLS el número de columnas.
Ninguno de los cambios en la ventana de ncurses se hace efectivo
hasta que no se use la función refresh() momento en el que todos
se hacen visibles a la vez. Este diseño se hace para no ralentizar
demasiado las aplicaciones que usen ncurses.
ncurses supondrá que nuestro terminal es el que figura en la variable
TERM. Un valor de TERM que no corresponda a nuestro terminal provocará
seguramente un caos en la pantalla. En linux se usa TER='linux' derivado
y muy similar a 'vt100'.
=====8<------(cortar por aqui) -----------------------------------
/****************************************************************
*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#define NORMAL 0
#define BRILLO 1
#define SEMIBRILLO 2
#define INTERMITENTE 5
#define INVERSO 7
#define NEGRO 30
#define ROJO 31
#define VERDE 32
#define MARRON 33
#define AZUL 34
#define ROSA 35
#define CELESTE 36
#define BLANCO 37
#define MAXLINEAS 15
#define MAXCAD 70
WINDOW *win; /** manejaremos una única ventana de pantalla completa **/
/*********************************************************************/
void IniVideo(){
win=initscr();
clear();
refresh();
noecho();
cbreak();
keypad(win, TRUE);
if(has_colors()) {
start_color();
init_pair(1, COLOR_YELLOW, COLOR_BLUE);
init_pair(2, COLOR_BLACK, COLOR_RED);
init_pair(3, COLOR_BLACK, COLOR_GREEN);
init_pair(4, COLOR_WHITE, COLOR_RED);
init_pair(5, COLOR_WHITE, COLOR_GREEN);
}
}
/*************************/
Exit(){
clear();
refresh();
endwin();
exit(1);
}
/**************************************/
void Disp(){
int posY, posX, i;
posY=(LINES/2)-((2+MAXLINEAS)/2);
posX=(COLS/2)-4;
for (i=0; i<MAXLINEAS; i++){
attrset(COLOR_PAIR(1+(i%5)));
move(posY+i, posX);
printw("%03d %03d %03d", i, i, i);
}
refresh();
}
/*****************************************************************/
main () {
IniVideo();
Disp();
getch();
Exit();
}
=====8<------(cortar por aqui) -----------------------------------
Un saludo
Antonio Castro
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/\ /\ Ciberdroide Informática (Tienda de Linux)
\\W// <<< http://www.ciberdroide.com >>>
_|0 0|_
+-oOOO--(___o___)--OOOo----------------------------------------------------+
| . . . . U U . . . . Antonio Castro Snurmacher acastro@ciberdroide.com |
| . . . . . . . . . . |
+()()()----------()()()----------------------------------------------------+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** |
| <<< http://www.ciberdroide.com/misc/donde/dondelinux.html >>> |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Reply to: