[FLUG] [CODE] ncurses

  • From: Michele Mei - <mVentisette@xxxxxxxxx>
  • To: fanolug@xxxxxxxxxxxxx
  • Date: Sun, 23 Feb 2003 18:22:32 +0100

Ciao a tutti

PREMESSA
... in questa e nello scorso fine settimana ho avuto due pomeriggi
liberi nei quali mi sono divertito un po con Linux... in particolare ho
provato a programmare le ncurses, cioe' delle semplicissime, quanto
potentissime librerie semi-grafiche, per fare un esempio man, less,
mutt, BitchX, etc.. ect.. usano queste librerie per fare della
semi-grafica sulla console, utilizzare nei propri programmi queste
librerie e' molto semplice, anche per la mole di informazioni che si
posso avere delle numerose pagine man che si hanno a disposizione,
avventurarsi nelle ncurses e' davvero esaltante, una esperienza che
consiglio a tutti!
A conclusione della breve avventura, purtroppo superficiale, ho 
preparato un programmino per ricordarmi in futuro le basi
fondamentali per utilizzarele.

...credo quindi che questo programmino possa interessare qualcuno... se
cosi' non fosse... scusatemi vi ho fatto scaricare qualche byte inutile
... :((

BODY
Il codice e' molto semplice per il fatto che non viene fatto uso di
nessun tipo di algoritmo, sono solo una serie di comandi in pieno stile
"Programmazione Imperativa", il passaggio piu' impegnativo sono una
while e un for.
Il codice e' stato commentato e indentato con "indent" per renderlo
maggiormente leggibile.
L'unica funzione non commentata e' mvprintw(X,Y,"Ciao Mondo");
e' uguale ad un printf solo che accetta due argomenti, la posizione da
cui incominciare a scrivere verticale e orizzontale, comunque per tutte
le funzioni potete fare il man nome_funzione.

Per compilare bisogna dire al compilatore che ci vogliono le librerie
ncurses in questo modo:

$ gcc -lncurses nome_programma.c

Il programmino di esempio e' un quiz ... :))
Io l'ho messo in esecuzione ogni volta che avvio ... mi ricorda come
sono fortunato ad avere una GNU/Linux :))

Allego il codice.
Saluti a tutti.

-- 
"... Dopo la battaglia il re potra' disporre a suo piacimento della mia testa, 
ma durante la battaglia vorra' gentilmente permettermi di usarla." [cit.]
Michele Mei -m27- <mVentisette@xxxxxxxxx>
/*
 * file:        boot_faq.c
 * author:      Michele Mei <mVentisette@xxxxxxxxx>
 * info:        Giochino di esempio per imparare le minime cose indispensabili 
per programmare le ncurses
 * */
#include<ncurses.h>
/*
 * ATTENZIONE:
 * Precisazione.
 *      Ho deciso di utilizzare questo sistema di riferimento:
 *       ----(-)---Y---(+)--->
 *       |
 *       |
 *      (-)
 *       |
 *       X
 *       |
 *      (+)
 *       |
 * */

#define X_POS_WIN       15
#define Y_POS_WIN       30
#define X_POS           15
#define Y_POS           30

int
main (void)
{
  short my_green = 1;           //Ogni set di colori che si usa deve avere un 
suo riferimento
  short my_win = 2;
  short my_winr = 3;
  char option = 0;              //Ci leggo il valore di ritorno di getch();
  int control;                  //Lo uso come contatore nella FOR

  initscr ();                   //Se si usano le ncurses ci vuole sempre
  start_color ();               //Se si usano i colori ci vuole sempre

  /*init_pair(variabile,TESTO,SFONDO) */
  init_pair (my_green, COLOR_GREEN, COLOR_BLACK);
  init_pair (my_win, COLOR_WHITE, COLOR_BLUE);
  init_pair (my_winr, COLOR_BLUE, COLOR_WHITE);

  attrset (COLOR_PAIR (my_green));      //Utilizza il set di colori chiamato 
my_green
  noecho ();                    //Non visualizza cio che scrivi a tastiera

  mvprintw (X_POS, Y_POS,
            "********************* BOOT - FAQ *********************");
  mvprintw (X_POS + 1, Y_POS,
            "*                                                    *");
  mvprintw (X_POS + 2, Y_POS,
            "* # Quale tra questi e' sicuramente il miglior       *");
  mvprintw (X_POS + 3, Y_POS,
            "* # sistema operativo che si possa trovare ?         *");
  mvprintw (X_POS + 4, Y_POS,
            "*                                                    *");
  mvprintw (X_POS + 5, Y_POS,
            "* < A > GNU/Linux                                    *");
  mvprintw (X_POS + 6, Y_POS,
            "* < B > GNU/HURD                                     *");
  mvprintw (X_POS + 7, Y_POS,
            "* < C > *BSD                                         *");
  mvprintw (X_POS + 8, Y_POS,
            "* < D > Microsoft Windows                            *");
  mvprintw (X_POS + 9, Y_POS,
            "*                                                    *");
  mvprintw (X_POS + 10, Y_POS,
            "******************************************************");
  mvprintw (X_POS + 11, Y_POS,
            "*    < A >        < B >        < C >        < D >    *");
  mvprintw (X_POS + 12, Y_POS,
            "******************************************************");

  mvprintw (47, 0,
            "----- SPACE per confermare la tua risposta 
-----------------------------------------------------------------------------------------");

  mvprintw (X_POS + 11, Y_POS + 45, " ");       //Riporta il cursore in < D >

  /*Legge ... fino a che non SPACE */
  option = getch ();
  while (option != 32)
    {
      option = getch ();
    }
  attrset (COLOR_PAIR (my_win));        //Cambio colori
  mvprintw (0, 0, "");          //Riporto il cursore in 0,0
  for (control = 0; control < 50; control++)    //Metto uno sfondo BLU
    {
      printw
        ("                                                                      
                                                         \n");
    }

  attrset (COLOR_PAIR (my_winr));       //Cambio colori
  mvprintw (X_POS_WIN, Y_POS_WIN + 25, "Slackware GNU/Linux 8.1");
  attrset (COLOR_PAIR (my_win));        //Cambio colori

  mvprintw (X_POS_WIN + 2, Y_POS_WIN,
            "Si e' verificato un errore irreversibile 06 in 07E7:0000075F");
  mvprintw (X_POS_WIN + 3, Y_POS_WIN,
            "L'applicazione corrente verra' terminata.");
  mvprintw (X_POS_WIN + 5, Y_POS_WIN,
            " * Premere qualsiasi tasto per far terminare l'applicazione.");
  mvprintw (X_POS_WIN + 6, Y_POS_WIN,
            " * Premere CTRL-ALT-CANC per riavviare il computer. Verranno");
  mvprintw (X_POS_WIN + 7, Y_POS_WIN,
            "perse tutte le informazioni non salvate di tutte le 
applicazioni.");
  mvprintw (X_POS_WIN + 9, Y_POS_WIN,
            "               Premere un tasto per continuare");

  getch ();                     //Aspetto un carattere
  endwin ();                    //Chiudo tutto cio che e' ncurses ... 
  return 0;                     //Amato kernel ... a te il controllo ... :))
}

Other related posts:

  • » [FLUG] [CODE] ncurses