Ogni carattere può essere visualizzato in diversi modi: lampeggiante, sottolineato, in negativo, evidenziato, ecc. Vediamo gli attributi associabili ad un carattere:
- A_NORMAL – Attributo di default
- A_STANDOUT – Corrisponde al miglior modo che ha il terminale di evidenziare un carattere. Di solito equivale a reverse video
- A_UNDERLINE – Sottolineatura
- A_REVERSE – Reverse video: il colore dello sfondo si inverte con quello dei caratteri
- A_BLINK – Lampeggio
- A_DIM – Oscurato. I caratteri sono mostrati con una luminosità minore del normale o con un colore più tenue
- A_BOLD – Grassetto. I caratteri sono mostrati con una maggiore luminosità o negli ambienti grafici con un font grassetto vero e proprio
- A_INVIS – Invisibilità. I caratteri scritti non appaiono sul terminale
- A_ALTCHARSET – Set di caratteri alternativo. Sui PC è utile per accedere ai caratteri della ROM video come i segni delle carte
Questi attributi sono utilizzabili in due modi:
- abbinandoli direttamente ad un carattere, ad esempio: addch(‘G’ |A_BOLD|A_UNDERLINE) si ottiene una G maiuscola in grassetto sottolineata
- passandoli come parametri alle funzioni attron(), attroff() o attset(). La prima funzione attiva gli attributi passati come parametro, la seconda disattiva gli attributi e la terza disabilita tutti gli attributi attivando solo quelli passati.
I colori non sono altro che attributi per ncurses. La prima cosa da fare è chiamare la funzione start_color(), che abbiamo visto nella nostra funzione di inizializzazione della libreria, prima di utilizzare i colori che in ncurses si specificano a coppie ed ognuna indica il colore dei caratteri e dello sfondo. Per creare gli attributi corrispondenti alle coppie di colori è sufficiente una chiamata alla funzione: int init_pair(int numero, int caratteri, int sfondo). Il primo argomento è il numero dell’attributo che si vuole inizializzare e deve essere compreso tra 1 e COLOR_PAIRS – 1, il numero zero rappresenta sempre i caratteri bianchi su sfondo nero. Il secondo è il colore dei caratteri e deve essere compreso tra 0 e COLORS. Il terzo argomento lo sfondo da utilizzare, soggetto alle stesse limitazioni di quello dei caratteri. Al posto delle costanti numeriche, difficilmente associabili ad un colore, si possono utilizzare le costanti simboliche:
- COLOR_BLACK
- COLOR_RED
- COLOR_GREEN
- COLOR_YELLOW
- COLOR_BLUE
- COLOR_MAGENTA
- COLOR_CYAN
- COLOR_WHITE
Dopo aver definito gli attributi desiderati si possono utilizzare grazie alla macro COLOR_PAIR(n) dove n è il numero dell’attributo definito in precedenza. Vediamo un esempio utilizzando le nozioni che abbiamo visto finora:
/* File color.c
compilare con: gcc -Wall -o color color.c -lncursesw */
#include “stdio.h”
#include “ncursesw/curses.h”
void InitLib()
{
initscr();
if (has_colors())
start_color();
cbreak();
nonl();
keypad(stdscr, TRUE);
meta(stdscr, TRUE);
noecho();
}
void Draw()
{
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_YELLOW, COLOR_BLACK);
init_pair(3, COLOR_CYAN, COLOR_BLACK);
attron(COLOR_PAIR(1));
mvhline(5, 20, ‘-‘, 40);
mvhline(15, 20, ‘-‘, 40);
mvvline(5, 20, ‘|’, 10);
mvvline(5, 60, ‘|’, 10);
attrset(COLOR_PAIR(2));
attron(A_UNDERLINE|A_BOLD);
mvaddstr(10, 30, “BENVENUTI IN NCURSES”);
attron(A_NORMAL);
attrset(COLOR_PAIR(3));
mvaddstr(19, 1, “Premere un tasto per chiudere il programma…”);
attroff(COLOR_PAIR(3));
}
int main(int argc, char** argv)
{
InitLib();
Draw();
refresh();
getch();
endwin();
return 0;
}
Le prime chiamate creano tre attributi di colore e di formattazione che vengono settate con attron() e poi cambiate con attrset() ed alla fine terminate con attroff(). Per cambiare il colore dello sfondo del terminale occorre utilizzare la funzione bkgd(attributo), dove ovviamente l’argomemto è un attributo di colore.