[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: