]> git.decadent.org.uk Git - ap-utils.git/blob - lib/menu.c
e2cfaef3178235bfd66da2f78e2b46d771892cb6
[ap-utils.git] / lib / menu.c
1 /*
2  *      menu.c from Access Point SNMP Utils for Linux
3  *
4  * Copyright (c) 2002 Roman Festchook <roma at polesye dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License Version 2 from
8  * June 1991 as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  */
20
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <menu.h>
24 #include "ap-utils.h"
25
26 extern WINDOW *sub_for_menu;
27 extern char set_oeminfo_allowed;
28
29 void uni_menu(struct umitems *umenu, int num)
30 {
31     ITEM **menu_item = calloc(num+1, sizeof(ITEM));
32     MENU *menu;
33     unsigned short int idx;
34     int c;
35
36     for (idx = 0; idx < num; idx++) {
37         menu_item[idx] = new_item(umenu[idx].item, 0);
38     }
39     menu = new_menu(menu_item);
40
41     set_menu_opts(menu, O_ONEVALUE);
42
43     curs_set(0);
44
45     post_menu(menu);
46
47     print_help(umenu[0].help);
48
49     while (1) {
50         wrefresh(sub_for_menu);
51         switch (getch()) {
52         case KEY_DOWN:
53         case 'j':
54         case 'J':
55             menu_driver(menu, REQ_NEXT_ITEM);
56             break;
57         case KEY_RIGHT:
58         case 'l':
59         case 'L':
60             menu_driver(menu, REQ_LAST_ITEM);
61             break;
62         case KEY_LEFT:
63         case 'h':
64         case 'H':
65             menu_driver(menu, REQ_FIRST_ITEM);
66             break;
67         case KEY_UP:
68         case 'k':
69         case 'K':    
70             menu_driver(menu, REQ_PREV_ITEM);
71             break;
72         case KEY_PPAGE:
73         case KEY_HOME:
74             menu_driver(menu, REQ_FIRST_ITEM);
75             break;
76         case KEY_NPAGE:
77         case KEY_END:
78             menu_driver(menu, REQ_LAST_ITEM);
79             break;
80         case 'q':
81         case 'Q':
82             idx = num - 2;
83             goto quitmenu;
84         case 's':
85         case 'S':
86             if (set_oeminfo_allowed) {
87                 set_menu_mark(menu, " ");
88                 set_menu_fore(menu, A_NORMAL);
89                 wrefresh(sub_for_menu);
90                 atmel_set_oeminfo();
91                 set_menu_mark(menu, "-");
92                 set_menu_fore(menu, A_STANDOUT);
93             }
94             break;
95         /* Enter */
96         case 10:
97             idx = item_index(current_item(menu));
98 quitmenu:
99             if (idx == num - 2) {
100                 unpost_menu(menu);
101                 free_menu(menu);
102                 for (c = 0; c < num; c++)
103                     free_item(menu_item[c]);
104                 if (umenu[idx].func) 
105                     umenu[idx].func();
106                 else {
107                     free(menu_item);
108                     return;
109                 }
110             }
111             if (umenu[idx].is_menu)
112                 unpost_menu(menu);
113
114             umenu[idx].func();
115
116             if (umenu[idx].is_menu)
117                 post_menu(menu);
118
119             break;
120         default:
121             continue;           
122         }    
123         print_help(umenu[item_index(current_item(menu))].help);
124     }
125 }