Programowanie z ncurses (index)


Programowanie z ncurses (5) - używanie kolorów

ZADANIE 5.1

W katalogu domowym utworzyć podkatalog kolor. Utworzyć w nim pliki Makefile i kolor.c postaci:


/*
*  kolor.c
*/

#include <unistd.h>   /* sleep() */
#include <stdlib.h>   /* exit() */
#include <curses.h>

int main(void) 
{
int xmax, ymax;

initscr();
getmaxyx(stdscr, ymax, xmax);

if (has_colors() == FALSE) {
	printw("Terminal does not support color\n");
	refresh();
	sleep(2);
	endwin(); /* konczymy curses */
	exit(1);
}
if (start_color() == ERR) {
	printw("Error: start_color()\n");
	refresh();
	sleep(2);
	endwin(); /* konczymy curses */
	exit(1);
}
/* Standardowe ustawienia par kolorow. */
/* Wpisalem liczby zgodne z numerami kolorow, jak w Introduction. */
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
init_pair(3, COLOR_YELLOW, COLOR_BLACK);
init_pair(4, COLOR_BLUE, COLOR_BLACK);
init_pair(5, COLOR_MAGENTA, COLOR_BLACK);
init_pair(6, COLOR_CYAN, COLOR_BLACK);
init_pair(7, COLOR_WHITE, COLOR_BLACK);

box(stdscr,0,0); /* ramka na cale okno */

attron(COLOR_PAIR(1));
mvprintw(2, 5, "Ramka jest domyslna, a ten napis RED = 1");

attron(COLOR_PAIR(2));
mvprintw(3, 5, "Napis GREEN = 2");

attron(COLOR_PAIR(3));
mvprintw(4, 5, "Napis YELLOW = 3");

attron(COLOR_PAIR(4));
mvprintw(5, 5, "Ten napis bedzie BLUE = 4");

attron(COLOR_PAIR(5));
mvprintw(6, 5, "Ten napis bedzie MAGENTA = 5");

attron(COLOR_PAIR(6));
mvprintw(7, 5, "Krotka linia pozioma CYAN = 6");
mvhline(8,5,ACS_HLINE,xmax/2); /* krotka linia pozioma */

attron(COLOR_PAIR(7));
mvprintw(9, 5, "Krotka linia pionowa WHITE = 7");
mvvline(5,2,ACS_VLINE,ymax/4);  /* krotka linia pionowa */

/* Bezposrednie zastosowanie koloru do jednego znaku */
mvaddch(10, 5, 'X' | COLOR_PAIR(1));

mvprintw(11,5,"Zmienna COLORS = %d",COLORS);
mvprintw(12,5,"Zmienna COLOR_PAIRS = %d",COLOR_PAIRS);

refresh();
sleep(2);

endwin();
return 0;
}

Skompilować i uruchomić program.

FUNKCJE


bool has_colors(void);  /* wartość TRUE lub FALSE */
start_color();
/* Numery par zgodne z numerami kolorow, jak w Introduction. */
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
init_pair(3, COLOR_YELLOW, COLOR_BLACK);
init_pair(4, COLOR_BLUE, COLOR_BLACK);
init_pair(5, COLOR_MAGENTA, COLOR_BLACK);
init_pair(6, COLOR_CYAN, COLOR_BLACK);
init_pair(7, COLOR_WHITE, COLOR_BLACK);

attron(COLOR_PAIR(1)); /* zastosowanie - ustawienie koloru */
attrset(COLOR_PAIR(3));      /* zastosowanie - ustawienie koloru */

chgat(n,at,kolor,NULL);
	/* Zmiana atrybutu "at" od bieżącego położenia dla n znaków. */
	/* "kolor" oznacza indeks koloru, 0 to brak koloru. */
	/* Na końcu zawsze musi być NULL. */
chgat(-1,A_BLINK,0,NULL); 
	/* zmiana atrybutu od bieżącego położenia kursora do końca linii */

init_color(COLOR_RED,700,0,0);
	/* Wzmocnienie koloru czerwonego domyślnego. */
	/* Parametry 2, 3 i 4 to RGB min = 0, max = 1000. */
	/* Standardowo czerwony ma 1000(r), 0(g), 0(b). */
can_change_color();       /* sprawdzenie możliwości terminala */

Dodatkowe informacje:
man curs_color(3x)

UŻYWANIE KOLORU

Funkcja has_colors() sprawdza, czy terminal obsługuje kolor. Funkcja start_color() uruchamia podsystem kolorów w ncurses.

Maksymalna liczba kolorów obsługiwana przez terminal przechowywana jest w zmiennej COLORS, a maksymalna liczba par kolorów w zmiennej COLOR_PAIRS.


Programowanie z ncurses (index)