Programowanie z ncurses (index)
W katalogu domowym utworzyć podkatalog menu2dim. Utworzyć w nim pliki Makefile i menu2dim.c postaci:
/*
* menu2dim.c
*
* Program z HOWTO zmodyfikowany.
* Przyklad okna z mozliwoscia poruszania kursorem i wprowadzania znakow.
*/
#include <ncurses.h>
/* Obliczenie rozmiaru okna stosownie do liczby pozycji w menu */
#define YLICZBA 9
#define XLICZBA 15
#define YSIZE (YLICZBA+2)
#define XSIZE (2*XLICZBA+1)
void print_menu(WINDOW *win, int yrewers, int xrewers);
/* Globalna tablica do przechowywania etykiet */
char etykiety[YLICZBA][XLICZBA];
int main(void)
{
int i, j;
WINDOW *win;
int startx, starty; /* polozenie okna menu */
int xmax, ymax; /* rozmiary stdscr */
int yrewers= 1; /* zakres od 1 do YLICZBA (nr etykiety w rewersie) */
int xrewers= 1; /* zakres od 1 do XLICZBA (nr etykiety w rewersie) */
int ypozycja= 0; /* zakres od 0 do YLICZBA (0 gdy nic nie wybrano) */
int xpozycja= 0; /* zakres od 0 do XLICZBA (0 gdy nic nie wybrano) */
int c;
/* Inicjalizacja etykiet. */
for (i= 0; i < YLICZBA; ++i)
for (j= 0; j < XLICZBA; ++j)
etykiety[i][j]= '.';
initscr();
clear();
noecho();
cbreak();
mvprintw(0, 0, "Uzyj kursora do poruszania. Nacisnij ENTER aby skonczyc.");
refresh();
getmaxyx(stdscr, ymax, xmax);
startx= (xmax - XSIZE) / 2;
starty= (ymax - YSIZE) / 2;
win= newwin(YSIZE, XSIZE, starty, startx);
keypad(win, TRUE);
print_menu(win, yrewers, xrewers);
while (ypozycja == 0 || xpozycja == 0) {
c= wgetch(win); /* troche magiczne obliczenia */
if (c == KEY_UP) {
yrewers= (yrewers + YLICZBA -2) % YLICZBA + 1;
} else if (c == KEY_DOWN) {
yrewers= yrewers % YLICZBA + 1;
} else if (c == KEY_LEFT) {
xrewers= (xrewers + XLICZBA -2) % XLICZBA + 1;
} else if (c == KEY_RIGHT) {
xrewers= xrewers % XLICZBA + 1;
} else if (c == '\n') {
ypozycja= yrewers;
xpozycja= xrewers;
} else {
etykiety[yrewers-1][xrewers-1]= c;
}
print_menu(win, yrewers, xrewers);
}
mvprintw(ymax-2, 0, "Wybrano pozycje (y,x) = (%d,%d) \n", ypozycja, xpozycja);
refresh();
delwin(win);
endwin();
return 0;
}
void print_menu(WINDOW *win, int yrewers, int xrewers)
{
int x, y, i, j;
box(win, 0, 0); /* ramka na okno */
for (i= 0; i < YLICZBA; ++i)
for (j= 0; j < XLICZBA; ++j) {
y= 1+i;
x= 1+2*j;
if ((yrewers == i+1) && (xrewers == j+1)) {
/* wyswietl te pozycje w rewersie */
wattron(win, A_REVERSE);
mvwprintw(win, y, x, "%c", etykiety[i][j]);
wattroff(win, A_REVERSE);
} else {
mvwprintw(win, y, x, "%c", etykiety[i][j]);
}
}
wrefresh(win);
}
Skompilować i uruchomić program.