]> git.decadent.org.uk Git - ap-utils.git/blob - lib/menu.c
86ca3a191d3b06fe6d3a0c83f237dc914fcfbf7a
[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
28 void uni_menu(struct umitems *umenu, int num)
29 {
30     ITEM **menu_item = calloc(num+1, sizeof(ITEM));
31     MENU *menu;
32     unsigned short int idx;
33     int c;
34
35     for (idx = 0; idx < num; idx++) {
36         menu_item[idx] = new_item(umenu[idx].item, 0);
37     }
38     menu = new_menu(menu_item);
39
40     set_menu_opts(menu, O_ONEVALUE);
41
42     curs_set(0);
43
44     post_menu(menu);
45
46     wrefresh(sub_for_menu);
47     print_help(umenu[0].help);
48
49     while (1) {
50         switch (getch()) {
51         case KEY_DOWN:
52         case 'j':
53         case 'J':
54             menu_driver(menu, REQ_NEXT_ITEM);
55             wrefresh(sub_for_menu);
56             break;
57         case KEY_RIGHT:
58         case 'l':
59         case 'L':
60             menu_driver(menu, REQ_LAST_ITEM);
61             wrefresh(sub_for_menu);
62             break;
63         case KEY_LEFT:
64         case 'h':
65         case 'H':
66             menu_driver(menu, REQ_FIRST_ITEM);
67             wrefresh(sub_for_menu);
68             break;
69         case KEY_UP:
70         case 'k':
71         case 'K':    
72             menu_driver(menu, REQ_PREV_ITEM);
73             wrefresh(sub_for_menu);
74             break;
75         case KEY_PPAGE:
76         case KEY_HOME:
77             menu_driver(menu, REQ_FIRST_ITEM);
78             wrefresh(sub_for_menu);
79             break;
80         case KEY_NPAGE:
81         case KEY_END:
82             menu_driver(menu, REQ_LAST_ITEM);
83             wrefresh(sub_for_menu);
84             break;
85         case 'q':
86         case 'Q':
87             idx = num - 2;
88             goto quitmenu;
89         /* Enter */
90         case 10:
91             idx = item_index(current_item(menu));
92 quitmenu:
93             if (idx == num - 2) {
94                 unpost_menu(menu);
95                 free_menu(menu);
96                 for (c = 0; c < num; c++)
97                     free_item(menu_item[c]);
98                 if (umenu[idx].func) 
99                     umenu[idx].func();
100                 else {
101                     free(menu_item);
102                     return;
103                 }
104             }
105             if (umenu[idx].is_menu)
106                 unpost_menu(menu);
107             umenu[idx].func();
108             if (umenu[idx].is_menu) {
109                 post_menu(menu);
110                 wrefresh(sub_for_menu);
111             }
112             break;
113         default:
114             continue;           
115         }    
116         print_help(umenu[item_index(current_item(menu))].help);
117     }
118 }