Attributi e Colori con Ncurses

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.

<< Lezione Precedente – Lezione Successiva >>

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in Linux e contrassegnata con . Contrassegna il permalink.