Programowanie z ncurses (index)
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.
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)
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.