/*
Przyklad CURSES uzywajacy kolorow i obslugujacy proste MENU
autor: Grzegorz Lukawski
*/
#include <stdlib.h>
#include <stdio.h>
#include <curses.h>
// Opcje menu
#define MENU_NTITLES 3
const char *menu_titles[]={"Pozycja1", "Pozycja2", "Koniec"};
// Okna programu
WINDOW *okno, *menu;
// Procedura odswiezajaca caly ekran
void odswiez_ekran() {
wnoutrefresh(okno);wnoutrefresh(menu);
doupdate();
}
// Glowna procedura programu
main() {
int wybrane_menu = 0, n, znak, koniec_programu = 0;
initscr();curs_set(0);noecho(); // Rozpoczecie pracy z CURSES
start_color(); // Proba rozpoczecia pracy z kolorami
if(has_colors()) { // Przygotowanie par kolorow
init_pair(1, COLOR_WHITE, COLOR_BLUE);
init_pair(2, COLOR_WHITE, COLOR_GREEN);
}
okno = newwin(LINES-1, COLS, 1, 0);
if(has_colors()) wbkgdset(okno, COLOR_PAIR(1) | A_BOLD);
werase(okno); // Wyczyszczenie tla (wypelnienie kolorem)
box(okno, 0, 0); // Standardowe ramki
mvwprintw(okno, 1, 1, "%s", "Przykladowe okno");
mvwprintw(okno, 2, 1, "%s", "Opcja menu \"Koniec\" konczy program");
menu = newwin(1, COLS, 0, 0);
if(has_colors()) wbkgdset(menu, COLOR_PAIR(2) | A_BOLD);
werase(menu);
keypad(menu, 1); // Kody klawiszy kursora
odswiez_ekran(); // Odswiezenie calosci zawartosci ekranu
while(!koniec_programu) {
for(n=0;n < MENU_NTITLES;n++) { // Obsluga pozycji menu
if(wybrane_menu == n) wattrset(menu, A_REVERSE);
else wattrset(menu, A_NORMAL);
mvwprintw(menu, 0, n*16, "%s", menu_titles[n]);
}
znak = wgetch(menu); // Oczekiwanie na klawisz
if((znak == KEY_LEFT) && (wybrane_menu>0))
wybrane_menu--;
if((znak == KEY_RIGHT) && (wybrane_menu<MENU_NTITLES-1))
wybrane_menu++;
if(znak == '\n') {
mvwprintw(okno, 3, 1, "Wybrano nr %d", wybrane_menu+1);
if(wybrane_menu == 2) koniec_programu = 1;
}
odswiez_ekran();
}
delwin(menu);delwin(okno);endwin(); // Koniec pracy z CURSES
return(0); // Koniec programu (bez kodu bledu)
}