Nell’articolo precedente abbiamo introdotto l’uso delle librerie ncurses ed abbiamo fatto alcuni esempi per mostrare un approccio pratico alla programmazione del terminale in Linux. Questa volta approfondiremo l’argomento parlando dell’inizializzazione della libreria e l’uso dei caratteri speciali che la volta scorsa avevamo soltanto introdotto.
Vediamo innanzitutto le costanti ed i tipi di dato definiti nella libreria:
- NCURSES_VERSION – costante con il valore della versione delle librerie
- NCURSES_MOUSE_VERSION – costante con il valore della versione del protocollo di comunicazione con il mouse
- OK – costante con il valore ritornato da una funzione in caso di successo
- ERR – costante con il valore ritornato da una funzione in caso di errore
- bool – tipo di dato booleano che può avere valori true o false
- WINDOW – struttura dati che mantiene le informazioni sullo stato della finestra
- chtype – tipo di dato che in ncurses equivale a int e può contenere un carattere
- LINES – variabile con il numero di righe del terminale
- COLS – variabile con il numero di colonne del terminale
Per quanto riguarda i nomi delle funzioni, la libreria adotta alcune convenzioni utili a rendere più sintetici i programmi. Data una generica funzione di output, che chiameremo f(parametri), sono possibili le seguenti varianti:
- mvf( riga, colonna, parametri ) – sposta il cursore alla posizione specificata prima di chiamare f
- wf( finestra, parametri ) – chiama f generando l’output sulla finestra specificata
- mvwf( finestra, riga, colonna, parametri ) – sposta il cursore all’interno della finestra specificata ed esegue nella stessa finestra la funzione f
Normalmente, se non si specifica nessuna finestra, l’output avviene su stdscr. Se non si specifica nessuna posizione per il cursore, i caratteri sono scritti o letti a partire dalla posizione corrente. Da notare che le coordinate del cursore sono formate dalla riga e dalla colonna, il punto (0,0) si trova in alto a sinistra dello schermo, le x ( colonne ) crescono verso destra e le y ( righe ) verso il basso.
Come abbiamo visto nello scorso articolo, prima di utilizzare la libreria è necessario inizializzarla con la funzione initscr() che alloca lo spazio in memoria per le variabili curscr e stdscr ed inoltre inserisce i valori a LINES e COLS.
#include “ncursesw/curses.h”
int main(int argc, char** argv)
{
initscr();
printw(“Lo schermo ha %d righe e %d colonne\n\n”, LINES, COLS);
addstr(“Premere un tasto per chiudere l’applicazione”);
refresh();
getch();
endwin();
return 0;
}
Per compilare il programma ricordo che dovete dare il comando:
gcc -Wall -o test test.c -lncursesw
con il file sorgente che si chiama test.c ( maggiori informazioni sulla compilazione in Linux potete trovarli in questo articolo ). Dopo initscr() è facoltativa la chiamata di una o più delle seguenti funzioni:
- start_color() – se l’applicazione userà i colori
- noecho() per impedire che i caratteri digitati siano immediatamente visualizzati
- cbreak() – per leggere un carattere alla volta, senza attendere la pressione del tasto INVIO
- nonl() – per impedire la traduzione automatica del tasto INVIO ( CR codice ASCII 13 ) nella sequenza CR/LF, codici ASCII 13,10
- keypad(stdscr, TRUE) – per rendere visibili ai programmi i tasti speciali ( cursori, tasti funzioni, ecc… )
- meta(stdscr, TRUE) – per fare in modo che i caratteri siano significativi su 8 bit, non su 7, per gestire le lettere accentate
- scrollok(stdscr, TRUE) – per abilitare lo scroll ( scorrimento ) dello schermo nel caso in cui l’output vada oltre l’ultima riga disponibile
Ecco quindi una tipica inizializzazione che noi inseriremo in una funzione che verrà richiamata ogni volta che si deve inizializzare la libreria.
…
void InitLib()
{
initscr();
if (has_colors())
start_color();
cbreak();
nonl();
keypad(stdscr, TRUE);
meta(stdscr, TRUE);
noecho();
}
…
Ncurses dispone di alcune funzioni per il disegno di linee o bordi con dei caratteri speciali che possono essere inoltre inseriti tramite la funzione addch().
- border(left, right, top, bottom, tl_corner, tr_corner, bl_corner, br_corner ) – disegna una cornice attorno ad una finestra specificando quali caratteri utilizzare
- hline(char, num) – disegna un carattere in linea orizzontale
- vline(char, num) – disegna un carattere in linea verticale
Vediamo un esempio su come sfruttare quello che abbiamo imparato in questo articolo.
#include “ncursesw/curses.h”
void InitLib()
{
initscr();
if (has_colors())
start_color();
cbreak();
nonl();
keypad(stdscr, TRUE);
meta(stdscr, TRUE);
noecho();
}
int main(int argc, char** argv)
{
e=”font-size: x-small;”> InitLib();
mvhline(5, 20, ‘-‘, 40);
mvhline(15, 20, ‘-‘, 40);
mvvline(5, 20, ‘|’, 10);
mvvline(5, 60, ‘|’, 10);
mvaddstr(10, 30, “BENVENUTI IN NCURSES”);
mvaddstr(19, 1, “Premere un tasto per chiudere il programma…”);
refresh();
getch();
endwin();
return 0;
}
In questo semplicissimo esempio abbiamo utilizzato le funzioni che abbiamo spiegato in questo articolo, come si può notare è ottimizzato solo per terminali 80 x 20, ma in futuro prenderemo in esame altre funzioni ed altre caratteristiche di questa potente libreria per terminali Linux e potremmo così creare dei programmi molto più elaborati.