ncurses 3
Transkrypt
ncurses 3
Laboratorium nr 3 Instrukcja laboratoryjna 3 1) 1/4 Programowanie w języku C 2 Temat: Edycja zawartości okna, zarządzanie oknami Przygotował: mgr inż. Maciej Lasota Edycja zawartości okna Kasowanie znaków (znajdujących się w oknie): • int delch(void) • int wdelch(WINDOW *okno) • int mvdelch(int y, int x) • int mvwdelch(WINDOW *okno, int y, int x) Funkcje delch() oraz wdelch() kasują znak w miejscu znajdowania się kursora przesuwając pozostałe znaki w linii w prawo o jeden łącznie ze znakiem ramki okna. Linia z lewej strony uzupełniana jest pustym znakiem (spacją). Funkcje mvdelch() oraz mvwdelch() działają analogicznie z możliwością ustawienia pozycji kursora przed usunięciem znaku. Wstawianie znaków: • int insch(chtype ch) • int winsch(WINDOW *okno, chtype ch) • int mvinsch(int y, int x, chtype ch) • int mvwinsch(WINDOW *okno, int y, int x, chtype ch) Funkcje insch() oraz winsch() wstawia znak w miejscu znajdowania się kursora przesuwając pozostałe znaki w linii. Ostatni znak w linii jest kasowany. Funkcje mvinsch() oraz mvwinsch() działają analogicznie z możliwością ustawienia pozycji kursora przed wstawianiem znaku. Laboratorium nr 3 2/4 Kasowanie linii: • int deleteln(void) • int wdeleteln(WINDOW *okno) Funkcje deleteln() oraz wdeleteln() usuwa linię w miejscu znajdowania się kursora przesuwając pozostałe linie znajdujące się poniżej do góry. Ostatnia linia uzupełniana jest pustą linią. Wstawianie linii: • int insertln(void) • int winsertln(WINDOW *win) Funkcje insertln() oraz winsertln() wstawia pustą linię w miejscu znajdowania się kursora przesuwając pozostałe linie znajdujące się poniżej w dół. Ostatnia linia jest kasowana. 2) Odczyt danych z okna Biblioteka ncurses oprócz odczytywania danych (parametrów) utworzonego okna umożliwia również odczytywanie zawartości okna z podanego miejsca (współrzędnych). Służy do tego rodzina funkcji: • chtype inch(void) • chtype winch(WINDOW *okno) • chtype mvinch(int y, int x) • chtype mvwinch(WINDOW *okno, int y, int x) Funkcje inch() oraz winch() odczytują zawartość okna w miejscu znajdowania się kursora. Funkcje mvinch() oraz mvwinch() również odczytują zawartość okna z możliwością podania współrzędnych z których chcemy odczytać dane. Wszystkie przedstawione funkcje zwracają kod ASCII odczytanego znaku wraz z atrybutami. Laboratorium nr 3 3) 3/4 Kolory Przed uruchomieniem trybu obsługi kolorów w ncurses należy wywołać funkcje: bool has_colors(void); Jest to bezparametrowa funkcja, która zwraca wartość TRUE lub FALSE. Funkcja ta sprawdza czy nasz terminal obsługuje kolory i czy można uruchomić tryb obsługi kolorów. Następnie po poprawnym sprawdzeniu obsługi kolorów możemy wywołać funkcję: int start_color(void); Funkcja ta inicjalizuje i uruchamia tryb obsługi kolorów (oczywiście w przypadku gdy terminal obsługuje kolory). Organizacja oraz używanie kolorów zawsze odbywa się w postaci tzw. par kolorów. Para kolorów składa się z koloru tła (ang. background) oraz koloru znaku (ang. foreground). Funkcją służąca do generowania par kolorów jest. int init_pair(short pair, short f, short b); Funkcja ta przyjmuje trzy parametry. Pierwszy parametr to identyfikator par kolorów (numer pary kolorów). Dwa kolejne do kolory (f – kolor znaku, b – kolor tła). Tak wygenerowaną parę kolorów możemy później używać do ustawiania atrybutów dla tekstu. Przykład: int main(int argc, char *argv[]) { initscr(); if(has_colors() == FALSE) { endwin(); printf("Twoj terminal nie obsluguje kolorow ...\n"); exit(1); } start_color(); Laboratorium nr 3 4/4 init_pair(1, COLOR_RED, COLOR_BLACK); init_pair(2, COLOR_GREEN, COLOR_BLACK); getch(); endwin(); } Gdy posiadamy już wygenerowane pary kolorów możemy je użyć do ustawiania atrybutów dla tekstu. Atrybutu tekstu ustawiamy za pomocą funkcji attrset(), wattrset(), attron(), wattron() oraz specjalnego makra służącego do pobierania pary kolorów COLOR_PAIR(). Przykład: init_pair(1, COLOR_RED, COLOR_BLACK); attron(COLOR_PAIR(1)); printw("Dowolny tekst"); attroff(COLOR_PAIR(1)); Przykład: wattrset(okno,COLOR_PAIR(1)); wattrset(okno,COLOR_PAIR(1) | A_BOLD);