Guida di Riferimento alle ncurses in italiano
Vista la difficoltà di recuperare documentazione buona in italiano sulle ncurses, a molti queste librerie appaiono alquanto ostiche anche se in realtà sono di una faciltà e comodità sconcertante. Ho quindi deciso di impiegare una parte del mio tempo per raccogliere e tradurre la documentazione ufficiale al fine di creare una guida di riferimento di rapido consulto.


1 - Introduzione alle ncurses, nuovi tipi e funzioni di base.
2 - Inizializzazione del terminale
3 - Le Finestre
4 - Funzioni di Output
5 - Funzioni di Input
6 - I Colori
6 - Opzioni Avanzate
7 - Scrolling e gestione del cursore


Introduzione alle ncurses, nuovi tipi e funzioni di base.

window - E' una rappresentazione contenente un'immagine di una parte di schermo.
screen - è una finestra con le dimensioni dell'intero schermo.
terminal - è uno screen speciale con informazioni riguardo all'aspetto dello schermo.

WINDOW *curscr - è una variabile che punta allo schermo corrente
WINDOW *stdscr - è una variabile che punta allo schermo di default
int LINES - è una variabile contenente il numero di linee che il terminale può visualizzare
int COLS - è una variabile contenente il numero di colonne che il terminale pò visualizzare

Al fine di compilare un programma creato con le ncurses, è necessario passare al linker attraverso gcc di linkare il programma alla libreria stessa.
Aggiungete quindi -lncurses come opzione di gcc quando compilate il vostro programma per evitare errori di linking.


Inizializzazione del terminale.

Per poter usare le funzioni di grafica delle ncurses, la prima funzione da chiamare è initscr() la quale inizializza tutte le strutture della libreria dopo aver determinato il tipo di terminale ecc. initscr() causa anche la cancellazione dello schermo ed il refresh.

Una volta terminato di usare le ncurses, potremo chiudere la libreria usando la funzione endwin()

Qualsiasi modifica si faccia allo schermo, non viene solitamente visualizzata finché non si fa l'update dello stesso, in questo modo si guadagna molta velocità ridisegnando lo schermo un'unica volta invece che ogni volta che lo si modifica. L'aggiornamento dello stesso può essere eseguito con la funzione refresh()


Le Finestre

Attraverso l'uso di finestre, il terminale può essere diviso in altri "sottoschermi" potendo così ottenere risultati ordinati e graficamente più soddisfacenti.

WINDOW *newwin(int nlines, int ncols, int begy, int begx)
Ha lo scopo di creare una nuova finestra dalle dimensioni indicate da nlines ed ncols, i quali indicano rispettivamente il numero di linee e colonne che la finestra deve avere. begy e begx indicano poi le coordinate a partire dall'angolo superiore sinistro ove la finestra va posizionata. newwin ritorna poi un puntatore alla nuova finestra creata che andrà salvato se si ha intenzione di poter fare ancora operazioni su detta finestra(scrittura, lettura, chiusura ecc.).

int delwin(WINDOW *win)
Distrugge la finestra win. Prima di distruggere una finestra è bene distruggere tutte le finestre che derivano da questa e prima di chiudere lo schermo con delwin() è bene distruggere tutte le finestre create.

int wrefresh(WINDOW *win)
Aggiorna il contenuto della finestra win

int mvwin(WINDOW *win, int y, int x)
Questa funzione permette di spostare la finestra win alle coordinate x e y.

WINDOW *subwin(WINDOW *orig, int nlines, int ncols, int begy, int begx)
Subwin ci permette di creare una sottofinestra di una finestra madre. orig indica la finestra madre a cui questa deve appartenere, nlines e ncols indicano il numero di linee e colonne che la finestra deve avere e begy, begx indicano la posizione della sottofinestra rispetto allo schermo. La funzione ci ritornerà un puntatore alla sottofinestra che andrà poi cancellata con delwin(WINDOW *subwin)

WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begy, int begx);
Questa funzione equivale a subwin, però le coordinate begx e begy sono relative all'angolo superiore sinistro della finestra orig che è la madre della sottofinestra creata.

int mvderwin(WINDOW *win, int par_y, int par_x)
Questa funzione ci permette di spostare una sottofinestra creata con derwin rispetto alle coordinate della finestra madre.

WINDOW *dupwin(WINDOW *win)
Come da nome dupplica una finestra ritornandoci un puntatore ad una nuova finestra identica all'originale.

int overlay(WINDOW *win1, WINDOW *win2)
Sovrascrive i punti in cui win1 coincide con win2, scrivendoci il testo di win1, senza però cancellare gli spazi vuoti. Possiamo dire che porta avanti di un piano win1 rispetto a win2 tenendo gli spazi vuoti (' ') come se fossero trasparenti.

int overwrite(WINDOW *win1, WINDOW *win2)
Uguale ad overlay, ma non considera gli spazi vuoti come trasparenti.

int copywin(WINDOW *win1, WINDOW *win2, int sminrow, int smincol, int dminrow, int dmincol, int dmaxrow, int dmaxcol, int overlay)
Copia win1 in un rettangolo di win2, sminrow e smincol indicano le coordinate dell'angolo superiore sinistro di win1, mentre dminrow, dmincol, dimaxrow e dmaxcol definiscono il rettangolo in win2. overlay definisce infine se la finestra deve essere copiata con il metodo di overlay ciò considerando gli spazi come trasparenti o no.


Funzioni di Output

int addch(ch)
int waddch(win, ch)
int mvaddch(y, x, ch)
int mvwaddch(win, y, x, ch)
Queste funzioni hanno lo scopo di inserire una carattere sullo schermo. addch e waddch lo aggiungono rispettivamente sullo schermo ed in una finestra alle coordinate correnti del cursore, mentre mvaddch e mvwaddch permettono di inserire il carattere in una posizione a nostra scelta.

int addstr(str)
int addnstr(str, n)
int waddstr(win, str)
int waddnstr(win, str, n)
int mvaddstr(y, x, str)
int mvaddnstr(y, x, str, n)
int mvwaddstr(win, y, x, str)
int mvwaddnstr(win, y, x, str, n)
Queste funzioni inseriscono invece una stringa sullo schermo od in una finestra. Come sempre le funzioni con prefisso MV indicano che la stringa può essere posizionata in coordinate passate alla funzione, quelle con W indicano che la stringa è inserita all'interno di una particolare finestra, e quelle contenenti N(tipo addnstr) inseriscono n caratteri della stringa soltanto

int addchstr(chstr)
int addchnstr(chstr, n)
int waddchstr(win, chstr)
int waddchnstr(win, chstr, n)
int mvaddchstr(y, x, chstr)
int mvaddchnstr(y, x, chstr, n)
int mvwaddchstr(win, y, x, chstr)
int mvwaddchnstr(win, y, x, chstr, n)
Queste funzioni sono simili a quelle della famiglia addstr, solo che non vanno a capo dopo aver scritto la stringa, non elidono i caratteri speciali quali \n, \t ecc. e se la stringa è più lunga del margine della finestra la tagliano invece di proseguirla a capo.

int echochar(ch)
int wechochar(win, ch)
Queste funzioni equivalgono ad addch e waddch, ma dopo la loro esecuzione viene chiamato rispettivamente refresh o wrefresh in automatico

int printw(fmt, ...)
int wprintw(win, fmt, ...)
int mvprintw(y, x, fmt, ...)
int mvwprintw(win, y, x, fmt, ...)
int vwprintw(win, fmt, ...)
Questo set di funzioni si occupa di gestire l'output formattato in maniera del tutto identica a printf.

int insch(c)
int winsch(win, c)
int mvinsch(y,x,c)
int mvwinsch(win,y,x,c)
Queste funzioni inseriscono un carattere o nella posizione corrente del cursore o in posizione x,y spostando avanti tutti i caratteri che seguono.

int insertln()
int winsertln(win)
Inseriscono una linea vuota prima di quella corrente

int insdelln(n)
int winsdelln(win, n)
Con n maggiore 0 queste funzioni inseriranno n linee vuote sopra la corrente, quando n minore 0 verranno cancellate n linee e quelle seguenti sostate in su

int insstr(str)
int insnstr(str, n)
int winsstr(win, str)
int winsnstr(win, str, n)
int mvinsstr(y, x, str)
int mvinsnstr(y, x, str, n)
int mvwinsstr(win, y, x, str)
int mvwinsnstr(win, y, x, str, n)
Queste funzioni inseriranno str nella linea corrente a sinistra del cursore, spostandi in avanti i caratteri che seguono. Se questi superano il limite della riga verranno cancellati.

int delch()
int wdelch(win)
int mvdelch(y, x)
int mvwdelch(win, y, x)
delch cancella il carattere sotto il cursore oppure quello presente nelle posizioni x,y. I caratteri che seguono quello cancellato verranno spostati a sinistra di una posizione

int deleteln()
int wdeleteln(win)
Queste funzioni si occupano di cancellare la linea sotto il cursore e muovere quelle seguenti su di una posizione

int border(ls, rs, ts, bs, tl, tr, bl, br)
int wborder(win, ls, rs, ts, bs, tl, tr, bl, br)
int box(win, vert, hor)
Border costruisce un bordo in torno allo schermo o una finestra. ls,rs,ts,bs sono rispettivamente il carattere da usare per il lato sinistro, lato destro, lato superiore e lato inferiore. mentre tl, tr, bl, br sono i caratteri da usare rispettivamente per l'angolo superiore sinistro, superiore destro, inferiore sinistro ed inferiore destro. Box disegnerà un quadrato usando 0 agli angoli e vert, hor come caratteri per le linee verticali e orizzontali.

int vline(ch, n)
int wvline(win, ch, n)
int hline(ch, n)
int whline(win, ch, n)
vline ed hline generano una linea di n caratteri del tipo ch. Con vline la linea sarà verticale, con hline sarà orizzontale.

void bkgdset(ch)
void wbkgdset(win, ch)
Queste due funzioni impostano il carattere di sfondo per la finestra o schermo. Tutte le zone della finestra non aventi niente scritto sopra avranno quel carattere, ed esso farà parte integrante della finestra senza essere perso né con lo scrolling né con input/output.

int bkgd(ch)
int wbkgd(win, ch)
Queste due funzioni impostano gli attributi di background dello schermo o di una finestra e poi li passano a tutte le posizioni dello schermo o finestra