/*
 * Ejemplo de uso de curses
 * Para compilar el archivo y generar un ejecutable use
 * gcc -lncurses cursexample.c -o ejemplo
 * Autor: Igor Támara P.
 * Fecha: 26/07/2000
 * Emplee este programa para el uso que requiera, la única restricción es 
 * no cambiar el autor original del mismo
 */

#include<ncurses.h>
#include <signal.h>

static void finish(int sig);

main(int argc, char *argv[])
{
  int y=0,x=0;  //Manejo del posicionamiento del cursor
  WINDOW *win1,  //Ventana de movimiento y escritura
    *win2;  //Ventana de Instrucciones
  signal(SIGINT, finish);   //Cuando el programa sale invoca esta función

  initscr();   // Inicialización de curses
  win1=newwin(LINES-2,COLS,0,0);  //Definicion de la ventana de escritura
  win2=newwin(2,COLS,LINES-2,0);  //Definicion de la ventana de instrucciones
  keypad(stdscr, FALSE);  
  keypad(win1, TRUE);   //Las entradas de teclado se redireccionan a win1
  keypad(win2, FALSE);
  nonl();         // Se evita cambio de línea con el enter
  cbreak();       // Se evita partir las líneas
  noecho();       // No se muestran caracteres apenas son digitados
  
  mvwprintw(win2,0,0,"c Limpiar Pantalla\t Mueva con las flechas del teclado numérico");
  mvwprintw(win2,1,0,"q Salir");
  wrefresh(win2);  //Actualización de la ventana de instrucciones
  for (;;)
    {
      int c = wgetch(win1);    //Se pide una tecla al usuario
      switch (c) {
      case KEY_UP: case '8':   //Movimiento del cursor con rastro
	if (y!=0)
	  y--;
	else
	  y=LINES-3;
	mvwaddch(win1,y,x,'0');
	break;
      case KEY_DOWN: case '2':
	if (y<LINES-3)
	  y++;
	else
	  y=0;
	mvwaddch(win1,y,x,'0');
	break;
      case KEY_LEFT: case '4':
	if (x!=0)
	  x--;
	else
	  x=COLS-1;
	mvwaddch(win1,y,x,'0');
	break;
      case KEY_RIGHT: case '6':
	if (x<COLS-1)
	  x++;
	else
	  x=0;
	mvwaddch(win1,y,x,'0');
	break;
      case 'q': case 'Q':      //Salida del programa
	finish(0);
	break;
      case 'c': case 'C':      //Limpieza de la zona de escritura
	wclear(win1);
	x=0;
	y=0;
	break;
      default:                 //Escritura normal
	if (x<COLS-1)
	  x++;
	else
	  x=0;
	mvwaddch(win1,y,x,c);
	break;
      }
      wrefresh(win1);
    }
    finish(0);             
}

static void finish(int sig)
{
    endwin();
    printf("   Por hacer:\n\n1. Funcionalidad de flechas\n2. Colocar el cursor en el sitio correcto\n3. Probar con un pad\n       Igor Támara\n");
    exit(0);
}
