Ncurses nr 2

by Maciej Lasota published 2018/12/13 16:45:01 GMT+1, last modified 2018-12-13T16:45:02+01:00
/* 
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)
}