#include #include #include #include #include #ifdef unix /* #include */ /* Ovo gornje bash i nije tocno! */ #include #else #include #include #endif #define MAXMENUITEMS 256 #define KEY_ESCAPE 27 #define KEY_RETURN 13 #define MAXCOLS 80 struct { char item[MAXCOLS]; int row; int col; char klett; char action[MAXCOLS]; } menu[MAXMENUITEMS]; int nitems; void tracex(char *fmt, ...) { FILE *fp; va_list argptr; if ((fp = fopen("trace", "a")) != NULL) { va_start (argptr, fmt); (void) vfprintf (fp, fmt, argptr); va_end (argptr); fclose(fp); } } void initcurses (void) { #ifdef unix WINDOW *win; win = initscr (); keypad (win, 1); #else initscr (); #endif raw (); cbreak (); noecho (); nonl (); } void endcurses (void) { clear (); refresh (); endwin (); #ifdef unix /* * Treba znati da je doticno samo za `multiple terminal applications'. RTFM! * I uostalom, ne pise se tako, vec je prototip void delscreen(SCREEN* sp); delscreen (); */ #endif } void activate (int iitem) { move (menu[iitem].row, menu[iitem].col); attron (A_REVERSE); addstr (menu[iitem].item); attroff (A_REVERSE); move (menu[iitem].row, menu[iitem].col); refresh (); } void deactivate (int iitem) { move (menu[iitem].row, menu[iitem].col); addstr (menu[iitem].item); move (menu[iitem].row, menu[iitem].col); refresh (); } void repaint (int iitem) { int i; for (i = 0; i < nitems; i++) { move (menu[i].row, menu[i].col); addstr (menu[i].item); } activate (iitem); } void execute (int iitem) { endcurses (); if (iitem==0) { fread(&zapis, sizeof(zapis), 1, fi); } if (iitem==1){ if (iitem==2) if (iitem==3) { exit(1); } system (menu[iitem].action); (void) getch (); initcurses (); repaint (iitem); } int main (int argc, char *argv[]) { int iitem, i, j, c; FILE *fi; fi = fopen (argv[1], "r"); if (!fi) { fprintf (stderr, "Ne mogu otvoriti %s\n", argv[1]); exit (1); } nitems = 0; while (nitems < MAXMENUITEMS && fscanf (fi, "%d#%d#%c#%80[^#]%*c%80[^\n]%*c", &menu[nitems].row, &menu[nitems].col, &menu[nitems].klett, menu[nitems].item, menu[nitems].action) > 0) { tracex ("%d %d %c %s %s\n", menu[nitems].row, menu[nitems].col, menu[nitems].klett, menu[nitems].item, menu[nitems].action); nitems++; } initcurses (); i = 0; repaint (i); while (1) { c = getch (); #ifndef unix if (c == 0 ) c = 255+getch (); #endif switch (c) { case KEY_ESCAPE: endcurses (); exit (1); case KEY_DOWN: /* down */ deactivate (i); i = (i + 1) % nitems; activate (i); break; case KEY_UP: /* up */ deactivate (i); if (i == 0) i = nitems - 1; else i--; activate (i); break; case KEY_RETURN: execute (i); break; default: /* klett */ for (j = 0; j < nitems; j++) { if (toupper(menu[j].klett) == toupper(c)) { deactivate (i); i = j; activate (i); execute (i); break; } } } } }