1*53ee8cc1Swenshuai.xi /*
2*53ee8cc1Swenshuai.xi * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
3*53ee8cc1Swenshuai.xi * Released under the terms of the GNU GPL v2.0.
4*53ee8cc1Swenshuai.xi *
5*53ee8cc1Swenshuai.xi * Derived from menuconfig.
6*53ee8cc1Swenshuai.xi *
7*53ee8cc1Swenshuai.xi */
8*53ee8cc1Swenshuai.xi #define _GNU_SOURCE
9*53ee8cc1Swenshuai.xi #include <string.h>
10*53ee8cc1Swenshuai.xi #define LKC_DIRECT_LINK
11*53ee8cc1Swenshuai.xi #include "lkc.h"
12*53ee8cc1Swenshuai.xi #include "nconf.h"
13*53ee8cc1Swenshuai.xi #include <ctype.h>
14*53ee8cc1Swenshuai.xi
15*53ee8cc1Swenshuai.xi static const char nconf_readme[] = N_(
16*53ee8cc1Swenshuai.xi "Overview\n"
17*53ee8cc1Swenshuai.xi "--------\n"
18*53ee8cc1Swenshuai.xi "This interface let you select features and parameters for the build.\n"
19*53ee8cc1Swenshuai.xi "Features can either be built-in, modularized, or ignored. Parameters\n"
20*53ee8cc1Swenshuai.xi "must be entered in as decimal or hexadecimal numbers or text.\n"
21*53ee8cc1Swenshuai.xi "\n"
22*53ee8cc1Swenshuai.xi "Menu items beginning with following braces represent features that\n"
23*53ee8cc1Swenshuai.xi " [ ] can be built in or removed\n"
24*53ee8cc1Swenshuai.xi " < > can be built in, modularized or removed\n"
25*53ee8cc1Swenshuai.xi " { } can be built in or modularized (selected by other feature)\n"
26*53ee8cc1Swenshuai.xi " - - are selected by other feature,\n"
27*53ee8cc1Swenshuai.xi " XXX cannot be selected. Use Symbol Info to find out why,\n"
28*53ee8cc1Swenshuai.xi "while *, M or whitespace inside braces means to build in, build as\n"
29*53ee8cc1Swenshuai.xi "a module or to exclude the feature respectively.\n"
30*53ee8cc1Swenshuai.xi "\n"
31*53ee8cc1Swenshuai.xi "To change any of these features, highlight it with the cursor\n"
32*53ee8cc1Swenshuai.xi "keys and press <Y> to build it in, <M> to make it a module or\n"
33*53ee8cc1Swenshuai.xi "<N> to removed it. You may also press the <Space Bar> to cycle\n"
34*53ee8cc1Swenshuai.xi "through the available options (ie. Y->N->M->Y).\n"
35*53ee8cc1Swenshuai.xi "\n"
36*53ee8cc1Swenshuai.xi "Some additional keyboard hints:\n"
37*53ee8cc1Swenshuai.xi "\n"
38*53ee8cc1Swenshuai.xi "Menus\n"
39*53ee8cc1Swenshuai.xi "----------\n"
40*53ee8cc1Swenshuai.xi "o Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
41*53ee8cc1Swenshuai.xi " you wish to change use <Enter> or <Space>. Goto submenu by \n"
42*53ee8cc1Swenshuai.xi " pressing <Enter> of <right-arrow>. Use <Esc> or <left-arrow> to go back.\n"
43*53ee8cc1Swenshuai.xi " Submenus are designated by \"--->\".\n"
44*53ee8cc1Swenshuai.xi "\n"
45*53ee8cc1Swenshuai.xi " Searching: pressing '/' triggers interactive search mode.\n"
46*53ee8cc1Swenshuai.xi " nconfig performs a case insensitive search for the string\n"
47*53ee8cc1Swenshuai.xi " in the menu prompts (no regex support).\n"
48*53ee8cc1Swenshuai.xi " Pressing the up/down keys highlights the previous/next\n"
49*53ee8cc1Swenshuai.xi " matching item. Backspace removes one character from the\n"
50*53ee8cc1Swenshuai.xi " match string. Pressing either '/' again or ESC exits\n"
51*53ee8cc1Swenshuai.xi " search mode. All other keys behave normally.\n"
52*53ee8cc1Swenshuai.xi "\n"
53*53ee8cc1Swenshuai.xi " You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
54*53ee8cc1Swenshuai.xi " unseen options into view.\n"
55*53ee8cc1Swenshuai.xi "\n"
56*53ee8cc1Swenshuai.xi "o To exit a menu use the just press <ESC> <F5> <F8> or <left-arrow>.\n"
57*53ee8cc1Swenshuai.xi "\n"
58*53ee8cc1Swenshuai.xi "o To get help with an item, press <F1>\n"
59*53ee8cc1Swenshuai.xi " Shortcut: Press <h> or <?>.\n"
60*53ee8cc1Swenshuai.xi "\n"
61*53ee8cc1Swenshuai.xi "\n"
62*53ee8cc1Swenshuai.xi "Radiolists (Choice lists)\n"
63*53ee8cc1Swenshuai.xi "-----------\n"
64*53ee8cc1Swenshuai.xi "o Use the cursor keys to select the option you wish to set and press\n"
65*53ee8cc1Swenshuai.xi " <S> or the <SPACE BAR>.\n"
66*53ee8cc1Swenshuai.xi "\n"
67*53ee8cc1Swenshuai.xi " Shortcut: Press the first letter of the option you wish to set then\n"
68*53ee8cc1Swenshuai.xi " press <S> or <SPACE BAR>.\n"
69*53ee8cc1Swenshuai.xi "\n"
70*53ee8cc1Swenshuai.xi "o To see available help for the item, press <F1>\n"
71*53ee8cc1Swenshuai.xi " Shortcut: Press <H> or <?>.\n"
72*53ee8cc1Swenshuai.xi "\n"
73*53ee8cc1Swenshuai.xi "\n"
74*53ee8cc1Swenshuai.xi "Data Entry\n"
75*53ee8cc1Swenshuai.xi "-----------\n"
76*53ee8cc1Swenshuai.xi "o Enter the requested information and press <ENTER>\n"
77*53ee8cc1Swenshuai.xi " If you are entering hexadecimal values, it is not necessary to\n"
78*53ee8cc1Swenshuai.xi " add the '0x' prefix to the entry.\n"
79*53ee8cc1Swenshuai.xi "\n"
80*53ee8cc1Swenshuai.xi "o For help, press <F1>.\n"
81*53ee8cc1Swenshuai.xi "\n"
82*53ee8cc1Swenshuai.xi "\n"
83*53ee8cc1Swenshuai.xi "Text Box (Help Window)\n"
84*53ee8cc1Swenshuai.xi "--------\n"
85*53ee8cc1Swenshuai.xi "o Use the cursor keys to scroll up/down/left/right. The VI editor\n"
86*53ee8cc1Swenshuai.xi " keys h,j,k,l function here as do <SPACE BAR> for those\n"
87*53ee8cc1Swenshuai.xi " who are familiar with less and lynx.\n"
88*53ee8cc1Swenshuai.xi "\n"
89*53ee8cc1Swenshuai.xi "o Press <Enter>, <F1>, <F5>, <F7> or <Esc> to exit.\n"
90*53ee8cc1Swenshuai.xi "\n"
91*53ee8cc1Swenshuai.xi "\n"
92*53ee8cc1Swenshuai.xi "Alternate Configuration Files\n"
93*53ee8cc1Swenshuai.xi "-----------------------------\n"
94*53ee8cc1Swenshuai.xi "nconfig supports the use of alternate configuration files for\n"
95*53ee8cc1Swenshuai.xi "those who, for various reasons, find it necessary to switch\n"
96*53ee8cc1Swenshuai.xi "between different configurations.\n"
97*53ee8cc1Swenshuai.xi "\n"
98*53ee8cc1Swenshuai.xi "At the end of the main menu you will find two options. One is\n"
99*53ee8cc1Swenshuai.xi "for saving the current configuration to a file of your choosing.\n"
100*53ee8cc1Swenshuai.xi "The other option is for loading a previously saved alternate\n"
101*53ee8cc1Swenshuai.xi "configuration.\n"
102*53ee8cc1Swenshuai.xi "\n"
103*53ee8cc1Swenshuai.xi "Even if you don't use alternate configuration files, but you\n"
104*53ee8cc1Swenshuai.xi "find during a nconfig session that you have completely messed\n"
105*53ee8cc1Swenshuai.xi "up your settings, you may use the \"Load Alternate...\" option to\n"
106*53ee8cc1Swenshuai.xi "restore your previously saved settings from \".config\" without\n"
107*53ee8cc1Swenshuai.xi "restarting nconfig.\n"
108*53ee8cc1Swenshuai.xi "\n"
109*53ee8cc1Swenshuai.xi "Other information\n"
110*53ee8cc1Swenshuai.xi "-----------------\n"
111*53ee8cc1Swenshuai.xi "If you use nconfig in an XTERM window make sure you have your\n"
112*53ee8cc1Swenshuai.xi "$TERM variable set to point to a xterm definition which supports color.\n"
113*53ee8cc1Swenshuai.xi "Otherwise, nconfig will look rather bad. nconfig will not\n"
114*53ee8cc1Swenshuai.xi "display correctly in a RXVT window because rxvt displays only one\n"
115*53ee8cc1Swenshuai.xi "intensity of color, bright.\n"
116*53ee8cc1Swenshuai.xi "\n"
117*53ee8cc1Swenshuai.xi "nconfig will display larger menus on screens or xterms which are\n"
118*53ee8cc1Swenshuai.xi "set to display more than the standard 25 row by 80 column geometry.\n"
119*53ee8cc1Swenshuai.xi "In order for this to work, the \"stty size\" command must be able to\n"
120*53ee8cc1Swenshuai.xi "display the screen's current row and column geometry. I STRONGLY\n"
121*53ee8cc1Swenshuai.xi "RECOMMEND that you make sure you do NOT have the shell variables\n"
122*53ee8cc1Swenshuai.xi "LINES and COLUMNS exported into your environment. Some distributions\n"
123*53ee8cc1Swenshuai.xi "export those variables via /etc/profile. Some ncurses programs can\n"
124*53ee8cc1Swenshuai.xi "become confused when those variables (LINES & COLUMNS) don't reflect\n"
125*53ee8cc1Swenshuai.xi "the true screen size.\n"
126*53ee8cc1Swenshuai.xi "\n"
127*53ee8cc1Swenshuai.xi "Optional personality available\n"
128*53ee8cc1Swenshuai.xi "------------------------------\n"
129*53ee8cc1Swenshuai.xi "If you prefer to have all of the options listed in a single menu, rather\n"
130*53ee8cc1Swenshuai.xi "than the default multimenu hierarchy, run the nconfig with NCONFIG_MODE\n"
131*53ee8cc1Swenshuai.xi "environment variable set to single_menu. Example:\n"
132*53ee8cc1Swenshuai.xi "\n"
133*53ee8cc1Swenshuai.xi "make NCONFIG_MODE=single_menu nconfig\n"
134*53ee8cc1Swenshuai.xi "\n"
135*53ee8cc1Swenshuai.xi "<Enter> will then unroll the appropriate category, or enfold it if it\n"
136*53ee8cc1Swenshuai.xi "is already unrolled.\n"
137*53ee8cc1Swenshuai.xi "\n"
138*53ee8cc1Swenshuai.xi "Note that this mode can eventually be a little more CPU expensive\n"
139*53ee8cc1Swenshuai.xi "(especially with a larger number of unrolled categories) than the\n"
140*53ee8cc1Swenshuai.xi "default mode.\n"
141*53ee8cc1Swenshuai.xi "\n"),
142*53ee8cc1Swenshuai.xi menu_no_f_instructions[] = N_(
143*53ee8cc1Swenshuai.xi " You do not have function keys support. Please follow the\n"
144*53ee8cc1Swenshuai.xi " following instructions:\n"
145*53ee8cc1Swenshuai.xi " Arrow keys navigate the menu.\n"
146*53ee8cc1Swenshuai.xi " <Enter> or <right-arrow> selects submenus --->.\n"
147*53ee8cc1Swenshuai.xi " Capital Letters are hotkeys.\n"
148*53ee8cc1Swenshuai.xi " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
149*53ee8cc1Swenshuai.xi " Pressing SpaceBar toggles between the above options.\n"
150*53ee8cc1Swenshuai.xi " Press <Esc> or <left-arrow> to go back one menu,\n"
151*53ee8cc1Swenshuai.xi " <?> or <h> for Help, </> for Search.\n"
152*53ee8cc1Swenshuai.xi " <1> is interchangeable with <F1>, <2> with <F2>, etc.\n"
153*53ee8cc1Swenshuai.xi " Legend: [*] built-in [ ] excluded <M> module < > module capable.\n"
154*53ee8cc1Swenshuai.xi " <Esc> always leaves the current window.\n"),
155*53ee8cc1Swenshuai.xi menu_instructions[] = N_(
156*53ee8cc1Swenshuai.xi " Arrow keys navigate the menu.\n"
157*53ee8cc1Swenshuai.xi " <Enter> or <right-arrow> selects submenus --->.\n"
158*53ee8cc1Swenshuai.xi " Capital Letters are hotkeys.\n"
159*53ee8cc1Swenshuai.xi " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
160*53ee8cc1Swenshuai.xi " Pressing SpaceBar toggles between the above options\n"
161*53ee8cc1Swenshuai.xi " Press <Esc>, <F5> or <left-arrow> to go back one menu,\n"
162*53ee8cc1Swenshuai.xi " <?>, <F1> or <h> for Help, </> for Search.\n"
163*53ee8cc1Swenshuai.xi " <1> is interchangeable with <F1>, <2> with <F2>, etc.\n"
164*53ee8cc1Swenshuai.xi " Legend: [*] built-in [ ] excluded <M> module < > module capable.\n"
165*53ee8cc1Swenshuai.xi " <Esc> always leaves the current window\n"),
166*53ee8cc1Swenshuai.xi radiolist_instructions[] = N_(
167*53ee8cc1Swenshuai.xi " Use the arrow keys to navigate this window or\n"
168*53ee8cc1Swenshuai.xi " press the hotkey of the item you wish to select\n"
169*53ee8cc1Swenshuai.xi " followed by the <SPACE BAR>.\n"
170*53ee8cc1Swenshuai.xi " Press <?>, <F1> or <h> for additional information about this option.\n"),
171*53ee8cc1Swenshuai.xi inputbox_instructions_int[] = N_(
172*53ee8cc1Swenshuai.xi "Please enter a decimal value.\n"
173*53ee8cc1Swenshuai.xi "Fractions will not be accepted.\n"
174*53ee8cc1Swenshuai.xi "Press <RETURN> to accept, <ESC> to cancel."),
175*53ee8cc1Swenshuai.xi inputbox_instructions_hex[] = N_(
176*53ee8cc1Swenshuai.xi "Please enter a hexadecimal value.\n"
177*53ee8cc1Swenshuai.xi "Press <RETURN> to accept, <ESC> to cancel."),
178*53ee8cc1Swenshuai.xi inputbox_instructions_string[] = N_(
179*53ee8cc1Swenshuai.xi "Please enter a string value.\n"
180*53ee8cc1Swenshuai.xi "Press <RETURN> to accept, <ESC> to cancel."),
181*53ee8cc1Swenshuai.xi setmod_text[] = N_(
182*53ee8cc1Swenshuai.xi "This feature depends on another which\n"
183*53ee8cc1Swenshuai.xi "has been configured as a module.\n"
184*53ee8cc1Swenshuai.xi "As a result, this feature will be built as a module."),
185*53ee8cc1Swenshuai.xi nohelp_text[] = N_(
186*53ee8cc1Swenshuai.xi "There is no help available for this option.\n"),
187*53ee8cc1Swenshuai.xi load_config_text[] = N_(
188*53ee8cc1Swenshuai.xi "Enter the name of the configuration file you wish to load.\n"
189*53ee8cc1Swenshuai.xi "Accept the name shown to restore the configuration you\n"
190*53ee8cc1Swenshuai.xi "last retrieved. Leave blank to abort."),
191*53ee8cc1Swenshuai.xi load_config_help[] = N_(
192*53ee8cc1Swenshuai.xi "\n"
193*53ee8cc1Swenshuai.xi "For various reasons, one may wish to keep several different\n"
194*53ee8cc1Swenshuai.xi "configurations available on a single machine.\n"
195*53ee8cc1Swenshuai.xi "\n"
196*53ee8cc1Swenshuai.xi "If you have saved a previous configuration in a file other than the\n"
197*53ee8cc1Swenshuai.xi "default one, entering its name here will allow you to modify that\n"
198*53ee8cc1Swenshuai.xi "configuration.\n"
199*53ee8cc1Swenshuai.xi "\n"
200*53ee8cc1Swenshuai.xi "If you are uncertain, then you have probably never used alternate\n"
201*53ee8cc1Swenshuai.xi "configuration files. You should therefor leave this blank to abort.\n"),
202*53ee8cc1Swenshuai.xi save_config_text[] = N_(
203*53ee8cc1Swenshuai.xi "Enter a filename to which this configuration should be saved\n"
204*53ee8cc1Swenshuai.xi "as an alternate. Leave blank to abort."),
205*53ee8cc1Swenshuai.xi save_config_help[] = N_(
206*53ee8cc1Swenshuai.xi "\n"
207*53ee8cc1Swenshuai.xi "For various reasons, one may wish to keep different configurations\n"
208*53ee8cc1Swenshuai.xi "available on a single machine.\n"
209*53ee8cc1Swenshuai.xi "\n"
210*53ee8cc1Swenshuai.xi "Entering a file name here will allow you to later retrieve, modify\n"
211*53ee8cc1Swenshuai.xi "and use the current configuration as an alternate to whatever\n"
212*53ee8cc1Swenshuai.xi "configuration options you have selected at that time.\n"
213*53ee8cc1Swenshuai.xi "\n"
214*53ee8cc1Swenshuai.xi "If you are uncertain what all this means then you should probably\n"
215*53ee8cc1Swenshuai.xi "leave this blank.\n"),
216*53ee8cc1Swenshuai.xi search_help[] = N_(
217*53ee8cc1Swenshuai.xi "\n"
218*53ee8cc1Swenshuai.xi "Search for symbols and display their relations. Regular expressions\n"
219*53ee8cc1Swenshuai.xi "are allowed.\n"
220*53ee8cc1Swenshuai.xi "Example: search for \"^FOO\"\n"
221*53ee8cc1Swenshuai.xi "Result:\n"
222*53ee8cc1Swenshuai.xi "-----------------------------------------------------------------\n"
223*53ee8cc1Swenshuai.xi "Symbol: FOO [ = m]\n"
224*53ee8cc1Swenshuai.xi "Prompt: Foo bus is used to drive the bar HW\n"
225*53ee8cc1Swenshuai.xi "Defined at drivers/pci/Kconfig:47\n"
226*53ee8cc1Swenshuai.xi "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
227*53ee8cc1Swenshuai.xi "Location:\n"
228*53ee8cc1Swenshuai.xi " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
229*53ee8cc1Swenshuai.xi " -> PCI support (PCI [ = y])\n"
230*53ee8cc1Swenshuai.xi " -> PCI access mode (<choice> [ = y])\n"
231*53ee8cc1Swenshuai.xi "Selects: LIBCRC32\n"
232*53ee8cc1Swenshuai.xi "Selected by: BAR\n"
233*53ee8cc1Swenshuai.xi "-----------------------------------------------------------------\n"
234*53ee8cc1Swenshuai.xi "o The line 'Prompt:' shows the text used in the menu structure for\n"
235*53ee8cc1Swenshuai.xi " this symbol\n"
236*53ee8cc1Swenshuai.xi "o The 'Defined at' line tell at what file / line number the symbol\n"
237*53ee8cc1Swenshuai.xi " is defined\n"
238*53ee8cc1Swenshuai.xi "o The 'Depends on:' line tell what symbols needs to be defined for\n"
239*53ee8cc1Swenshuai.xi " this symbol to be visible in the menu (selectable)\n"
240*53ee8cc1Swenshuai.xi "o The 'Location:' lines tell where in the menu structure this symbol\n"
241*53ee8cc1Swenshuai.xi " is located\n"
242*53ee8cc1Swenshuai.xi " A location followed by a [ = y] indicate that this is a selectable\n"
243*53ee8cc1Swenshuai.xi " menu item - and current value is displayed inside brackets.\n"
244*53ee8cc1Swenshuai.xi "o The 'Selects:' line tell what symbol will be automatically\n"
245*53ee8cc1Swenshuai.xi " selected if this symbol is selected (y or m)\n"
246*53ee8cc1Swenshuai.xi "o The 'Selected by' line tell what symbol has selected this symbol\n"
247*53ee8cc1Swenshuai.xi "\n"
248*53ee8cc1Swenshuai.xi "Only relevant lines are shown.\n"
249*53ee8cc1Swenshuai.xi "\n\n"
250*53ee8cc1Swenshuai.xi "Search examples:\n"
251*53ee8cc1Swenshuai.xi "Examples: USB => find all symbols containing USB\n"
252*53ee8cc1Swenshuai.xi " ^USB => find all symbols starting with USB\n"
253*53ee8cc1Swenshuai.xi " USB$ => find all symbols ending with USB\n"
254*53ee8cc1Swenshuai.xi "\n");
255*53ee8cc1Swenshuai.xi
256*53ee8cc1Swenshuai.xi struct mitem {
257*53ee8cc1Swenshuai.xi char str[256];
258*53ee8cc1Swenshuai.xi char tag;
259*53ee8cc1Swenshuai.xi void *usrptr;
260*53ee8cc1Swenshuai.xi int is_visible;
261*53ee8cc1Swenshuai.xi };
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi #define MAX_MENU_ITEMS 4096
264*53ee8cc1Swenshuai.xi static int show_all_items;
265*53ee8cc1Swenshuai.xi static int indent;
266*53ee8cc1Swenshuai.xi static struct menu *current_menu;
267*53ee8cc1Swenshuai.xi static int child_count;
268*53ee8cc1Swenshuai.xi static int single_menu_mode;
269*53ee8cc1Swenshuai.xi /* the window in which all information appears */
270*53ee8cc1Swenshuai.xi static WINDOW *main_window;
271*53ee8cc1Swenshuai.xi /* the largest size of the menu window */
272*53ee8cc1Swenshuai.xi static int mwin_max_lines;
273*53ee8cc1Swenshuai.xi static int mwin_max_cols;
274*53ee8cc1Swenshuai.xi /* the window in which we show option buttons */
275*53ee8cc1Swenshuai.xi static MENU *curses_menu;
276*53ee8cc1Swenshuai.xi static ITEM *curses_menu_items[MAX_MENU_ITEMS];
277*53ee8cc1Swenshuai.xi static struct mitem k_menu_items[MAX_MENU_ITEMS];
278*53ee8cc1Swenshuai.xi static int items_num;
279*53ee8cc1Swenshuai.xi static int global_exit;
280*53ee8cc1Swenshuai.xi /* the currently selected button */
281*53ee8cc1Swenshuai.xi const char *current_instructions = menu_instructions;
282*53ee8cc1Swenshuai.xi
283*53ee8cc1Swenshuai.xi static void conf(struct menu *menu);
284*53ee8cc1Swenshuai.xi static void conf_choice(struct menu *menu);
285*53ee8cc1Swenshuai.xi static void conf_string(struct menu *menu);
286*53ee8cc1Swenshuai.xi static void conf_load(void);
287*53ee8cc1Swenshuai.xi static void conf_save(void);
288*53ee8cc1Swenshuai.xi static void show_help(struct menu *menu);
289*53ee8cc1Swenshuai.xi static int do_exit(void);
290*53ee8cc1Swenshuai.xi static void setup_windows(void);
291*53ee8cc1Swenshuai.xi static void search_conf(void);
292*53ee8cc1Swenshuai.xi
293*53ee8cc1Swenshuai.xi typedef void (*function_key_handler_t)(int *key, struct menu *menu);
294*53ee8cc1Swenshuai.xi static void handle_f1(int *key, struct menu *current_item);
295*53ee8cc1Swenshuai.xi static void handle_f2(int *key, struct menu *current_item);
296*53ee8cc1Swenshuai.xi static void handle_f3(int *key, struct menu *current_item);
297*53ee8cc1Swenshuai.xi static void handle_f4(int *key, struct menu *current_item);
298*53ee8cc1Swenshuai.xi static void handle_f5(int *key, struct menu *current_item);
299*53ee8cc1Swenshuai.xi static void handle_f6(int *key, struct menu *current_item);
300*53ee8cc1Swenshuai.xi static void handle_f7(int *key, struct menu *current_item);
301*53ee8cc1Swenshuai.xi static void handle_f8(int *key, struct menu *current_item);
302*53ee8cc1Swenshuai.xi static void handle_f9(int *key, struct menu *current_item);
303*53ee8cc1Swenshuai.xi
304*53ee8cc1Swenshuai.xi struct function_keys {
305*53ee8cc1Swenshuai.xi const char *key_str;
306*53ee8cc1Swenshuai.xi const char *func;
307*53ee8cc1Swenshuai.xi function_key key;
308*53ee8cc1Swenshuai.xi function_key_handler_t handler;
309*53ee8cc1Swenshuai.xi };
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi static const int function_keys_num = 9;
312*53ee8cc1Swenshuai.xi struct function_keys function_keys[] = {
313*53ee8cc1Swenshuai.xi {
314*53ee8cc1Swenshuai.xi .key_str = "F1",
315*53ee8cc1Swenshuai.xi .func = "Help",
316*53ee8cc1Swenshuai.xi .key = F_HELP,
317*53ee8cc1Swenshuai.xi .handler = handle_f1,
318*53ee8cc1Swenshuai.xi },
319*53ee8cc1Swenshuai.xi {
320*53ee8cc1Swenshuai.xi .key_str = "F2",
321*53ee8cc1Swenshuai.xi .func = "Sym Info",
322*53ee8cc1Swenshuai.xi .key = F_SYMBOL,
323*53ee8cc1Swenshuai.xi .handler = handle_f2,
324*53ee8cc1Swenshuai.xi },
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi .key_str = "F3",
327*53ee8cc1Swenshuai.xi .func = "Insts",
328*53ee8cc1Swenshuai.xi .key = F_INSTS,
329*53ee8cc1Swenshuai.xi .handler = handle_f3,
330*53ee8cc1Swenshuai.xi },
331*53ee8cc1Swenshuai.xi {
332*53ee8cc1Swenshuai.xi .key_str = "F4",
333*53ee8cc1Swenshuai.xi .func = "Config",
334*53ee8cc1Swenshuai.xi .key = F_CONF,
335*53ee8cc1Swenshuai.xi .handler = handle_f4,
336*53ee8cc1Swenshuai.xi },
337*53ee8cc1Swenshuai.xi {
338*53ee8cc1Swenshuai.xi .key_str = "F5",
339*53ee8cc1Swenshuai.xi .func = "Back",
340*53ee8cc1Swenshuai.xi .key = F_BACK,
341*53ee8cc1Swenshuai.xi .handler = handle_f5,
342*53ee8cc1Swenshuai.xi },
343*53ee8cc1Swenshuai.xi {
344*53ee8cc1Swenshuai.xi .key_str = "F6",
345*53ee8cc1Swenshuai.xi .func = "Save",
346*53ee8cc1Swenshuai.xi .key = F_SAVE,
347*53ee8cc1Swenshuai.xi .handler = handle_f6,
348*53ee8cc1Swenshuai.xi },
349*53ee8cc1Swenshuai.xi {
350*53ee8cc1Swenshuai.xi .key_str = "F7",
351*53ee8cc1Swenshuai.xi .func = "Load",
352*53ee8cc1Swenshuai.xi .key = F_LOAD,
353*53ee8cc1Swenshuai.xi .handler = handle_f7,
354*53ee8cc1Swenshuai.xi },
355*53ee8cc1Swenshuai.xi {
356*53ee8cc1Swenshuai.xi .key_str = "F8",
357*53ee8cc1Swenshuai.xi .func = "Sym Search",
358*53ee8cc1Swenshuai.xi .key = F_SEARCH,
359*53ee8cc1Swenshuai.xi .handler = handle_f8,
360*53ee8cc1Swenshuai.xi },
361*53ee8cc1Swenshuai.xi {
362*53ee8cc1Swenshuai.xi .key_str = "F9",
363*53ee8cc1Swenshuai.xi .func = "Exit",
364*53ee8cc1Swenshuai.xi .key = F_EXIT,
365*53ee8cc1Swenshuai.xi .handler = handle_f9,
366*53ee8cc1Swenshuai.xi },
367*53ee8cc1Swenshuai.xi };
368*53ee8cc1Swenshuai.xi
print_function_line(void)369*53ee8cc1Swenshuai.xi static void print_function_line(void)
370*53ee8cc1Swenshuai.xi {
371*53ee8cc1Swenshuai.xi int i;
372*53ee8cc1Swenshuai.xi int offset = 1;
373*53ee8cc1Swenshuai.xi const int skip = 1;
374*53ee8cc1Swenshuai.xi
375*53ee8cc1Swenshuai.xi for (i = 0; i < function_keys_num; i++) {
376*53ee8cc1Swenshuai.xi (void) wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]);
377*53ee8cc1Swenshuai.xi mvwprintw(main_window, LINES-3, offset,
378*53ee8cc1Swenshuai.xi "%s",
379*53ee8cc1Swenshuai.xi function_keys[i].key_str);
380*53ee8cc1Swenshuai.xi (void) wattrset(main_window, attributes[FUNCTION_TEXT]);
381*53ee8cc1Swenshuai.xi offset += strlen(function_keys[i].key_str);
382*53ee8cc1Swenshuai.xi mvwprintw(main_window, LINES-3,
383*53ee8cc1Swenshuai.xi offset, "%s",
384*53ee8cc1Swenshuai.xi function_keys[i].func);
385*53ee8cc1Swenshuai.xi offset += strlen(function_keys[i].func) + skip;
386*53ee8cc1Swenshuai.xi }
387*53ee8cc1Swenshuai.xi (void) wattrset(main_window, attributes[NORMAL]);
388*53ee8cc1Swenshuai.xi }
389*53ee8cc1Swenshuai.xi
390*53ee8cc1Swenshuai.xi /* help */
handle_f1(int * key,struct menu * current_item)391*53ee8cc1Swenshuai.xi static void handle_f1(int *key, struct menu *current_item)
392*53ee8cc1Swenshuai.xi {
393*53ee8cc1Swenshuai.xi show_scroll_win(main_window,
394*53ee8cc1Swenshuai.xi _("README"), _(nconf_readme));
395*53ee8cc1Swenshuai.xi return;
396*53ee8cc1Swenshuai.xi }
397*53ee8cc1Swenshuai.xi
398*53ee8cc1Swenshuai.xi /* symbole help */
handle_f2(int * key,struct menu * current_item)399*53ee8cc1Swenshuai.xi static void handle_f2(int *key, struct menu *current_item)
400*53ee8cc1Swenshuai.xi {
401*53ee8cc1Swenshuai.xi show_help(current_item);
402*53ee8cc1Swenshuai.xi return;
403*53ee8cc1Swenshuai.xi }
404*53ee8cc1Swenshuai.xi
405*53ee8cc1Swenshuai.xi /* instructions */
handle_f3(int * key,struct menu * current_item)406*53ee8cc1Swenshuai.xi static void handle_f3(int *key, struct menu *current_item)
407*53ee8cc1Swenshuai.xi {
408*53ee8cc1Swenshuai.xi show_scroll_win(main_window,
409*53ee8cc1Swenshuai.xi _("Instructions"),
410*53ee8cc1Swenshuai.xi _(current_instructions));
411*53ee8cc1Swenshuai.xi return;
412*53ee8cc1Swenshuai.xi }
413*53ee8cc1Swenshuai.xi
414*53ee8cc1Swenshuai.xi /* config */
handle_f4(int * key,struct menu * current_item)415*53ee8cc1Swenshuai.xi static void handle_f4(int *key, struct menu *current_item)
416*53ee8cc1Swenshuai.xi {
417*53ee8cc1Swenshuai.xi int res = btn_dialog(main_window,
418*53ee8cc1Swenshuai.xi _("Show all symbols?"),
419*53ee8cc1Swenshuai.xi 2,
420*53ee8cc1Swenshuai.xi " <Show All> ",
421*53ee8cc1Swenshuai.xi "<Don't show all>");
422*53ee8cc1Swenshuai.xi if (res == 0)
423*53ee8cc1Swenshuai.xi show_all_items = 1;
424*53ee8cc1Swenshuai.xi else if (res == 1)
425*53ee8cc1Swenshuai.xi show_all_items = 0;
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi return;
428*53ee8cc1Swenshuai.xi }
429*53ee8cc1Swenshuai.xi
430*53ee8cc1Swenshuai.xi /* back */
handle_f5(int * key,struct menu * current_item)431*53ee8cc1Swenshuai.xi static void handle_f5(int *key, struct menu *current_item)
432*53ee8cc1Swenshuai.xi {
433*53ee8cc1Swenshuai.xi *key = KEY_LEFT;
434*53ee8cc1Swenshuai.xi return;
435*53ee8cc1Swenshuai.xi }
436*53ee8cc1Swenshuai.xi
437*53ee8cc1Swenshuai.xi /* save */
handle_f6(int * key,struct menu * current_item)438*53ee8cc1Swenshuai.xi static void handle_f6(int *key, struct menu *current_item)
439*53ee8cc1Swenshuai.xi {
440*53ee8cc1Swenshuai.xi conf_save();
441*53ee8cc1Swenshuai.xi return;
442*53ee8cc1Swenshuai.xi }
443*53ee8cc1Swenshuai.xi
444*53ee8cc1Swenshuai.xi /* load */
handle_f7(int * key,struct menu * current_item)445*53ee8cc1Swenshuai.xi static void handle_f7(int *key, struct menu *current_item)
446*53ee8cc1Swenshuai.xi {
447*53ee8cc1Swenshuai.xi conf_load();
448*53ee8cc1Swenshuai.xi return;
449*53ee8cc1Swenshuai.xi }
450*53ee8cc1Swenshuai.xi
451*53ee8cc1Swenshuai.xi /* search */
handle_f8(int * key,struct menu * current_item)452*53ee8cc1Swenshuai.xi static void handle_f8(int *key, struct menu *current_item)
453*53ee8cc1Swenshuai.xi {
454*53ee8cc1Swenshuai.xi search_conf();
455*53ee8cc1Swenshuai.xi return;
456*53ee8cc1Swenshuai.xi }
457*53ee8cc1Swenshuai.xi
458*53ee8cc1Swenshuai.xi /* exit */
handle_f9(int * key,struct menu * current_item)459*53ee8cc1Swenshuai.xi static void handle_f9(int *key, struct menu *current_item)
460*53ee8cc1Swenshuai.xi {
461*53ee8cc1Swenshuai.xi do_exit();
462*53ee8cc1Swenshuai.xi return;
463*53ee8cc1Swenshuai.xi }
464*53ee8cc1Swenshuai.xi
465*53ee8cc1Swenshuai.xi /* return != 0 to indicate the key was handles */
process_special_keys(int * key,struct menu * menu)466*53ee8cc1Swenshuai.xi static int process_special_keys(int *key, struct menu *menu)
467*53ee8cc1Swenshuai.xi {
468*53ee8cc1Swenshuai.xi int i;
469*53ee8cc1Swenshuai.xi
470*53ee8cc1Swenshuai.xi if (*key == KEY_RESIZE) {
471*53ee8cc1Swenshuai.xi setup_windows();
472*53ee8cc1Swenshuai.xi return 1;
473*53ee8cc1Swenshuai.xi }
474*53ee8cc1Swenshuai.xi
475*53ee8cc1Swenshuai.xi for (i = 0; i < function_keys_num; i++) {
476*53ee8cc1Swenshuai.xi if (*key == KEY_F(function_keys[i].key) ||
477*53ee8cc1Swenshuai.xi *key == '0' + function_keys[i].key){
478*53ee8cc1Swenshuai.xi function_keys[i].handler(key, menu);
479*53ee8cc1Swenshuai.xi return 1;
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi }
482*53ee8cc1Swenshuai.xi
483*53ee8cc1Swenshuai.xi return 0;
484*53ee8cc1Swenshuai.xi }
485*53ee8cc1Swenshuai.xi
clean_items(void)486*53ee8cc1Swenshuai.xi static void clean_items(void)
487*53ee8cc1Swenshuai.xi {
488*53ee8cc1Swenshuai.xi int i;
489*53ee8cc1Swenshuai.xi for (i = 0; curses_menu_items[i]; i++)
490*53ee8cc1Swenshuai.xi free_item(curses_menu_items[i]);
491*53ee8cc1Swenshuai.xi bzero(curses_menu_items, sizeof(curses_menu_items));
492*53ee8cc1Swenshuai.xi bzero(k_menu_items, sizeof(k_menu_items));
493*53ee8cc1Swenshuai.xi items_num = 0;
494*53ee8cc1Swenshuai.xi }
495*53ee8cc1Swenshuai.xi
496*53ee8cc1Swenshuai.xi typedef enum {MATCH_TINKER_PATTERN_UP, MATCH_TINKER_PATTERN_DOWN,
497*53ee8cc1Swenshuai.xi FIND_NEXT_MATCH_DOWN, FIND_NEXT_MATCH_UP} match_f;
498*53ee8cc1Swenshuai.xi
499*53ee8cc1Swenshuai.xi /* return the index of the matched item, or -1 if no such item exists */
get_mext_match(const char * match_str,match_f flag)500*53ee8cc1Swenshuai.xi static int get_mext_match(const char *match_str, match_f flag)
501*53ee8cc1Swenshuai.xi {
502*53ee8cc1Swenshuai.xi int match_start = item_index(current_item(curses_menu));
503*53ee8cc1Swenshuai.xi int index;
504*53ee8cc1Swenshuai.xi
505*53ee8cc1Swenshuai.xi if (flag == FIND_NEXT_MATCH_DOWN)
506*53ee8cc1Swenshuai.xi ++match_start;
507*53ee8cc1Swenshuai.xi else if (flag == FIND_NEXT_MATCH_UP)
508*53ee8cc1Swenshuai.xi --match_start;
509*53ee8cc1Swenshuai.xi
510*53ee8cc1Swenshuai.xi index = match_start;
511*53ee8cc1Swenshuai.xi index = (index + items_num) % items_num;
512*53ee8cc1Swenshuai.xi while (true) {
513*53ee8cc1Swenshuai.xi char *str = k_menu_items[index].str;
514*53ee8cc1Swenshuai.xi if (strcasestr(str, match_str) != 0)
515*53ee8cc1Swenshuai.xi return index;
516*53ee8cc1Swenshuai.xi if (flag == FIND_NEXT_MATCH_UP ||
517*53ee8cc1Swenshuai.xi flag == MATCH_TINKER_PATTERN_UP)
518*53ee8cc1Swenshuai.xi --index;
519*53ee8cc1Swenshuai.xi else
520*53ee8cc1Swenshuai.xi ++index;
521*53ee8cc1Swenshuai.xi index = (index + items_num) % items_num;
522*53ee8cc1Swenshuai.xi if (index == match_start)
523*53ee8cc1Swenshuai.xi return -1;
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi }
526*53ee8cc1Swenshuai.xi
527*53ee8cc1Swenshuai.xi /* Make a new item. */
item_make(struct menu * menu,char tag,const char * fmt,...)528*53ee8cc1Swenshuai.xi static void item_make(struct menu *menu, char tag, const char *fmt, ...)
529*53ee8cc1Swenshuai.xi {
530*53ee8cc1Swenshuai.xi va_list ap;
531*53ee8cc1Swenshuai.xi
532*53ee8cc1Swenshuai.xi if (items_num > MAX_MENU_ITEMS-1)
533*53ee8cc1Swenshuai.xi return;
534*53ee8cc1Swenshuai.xi
535*53ee8cc1Swenshuai.xi bzero(&k_menu_items[items_num], sizeof(k_menu_items[0]));
536*53ee8cc1Swenshuai.xi k_menu_items[items_num].tag = tag;
537*53ee8cc1Swenshuai.xi k_menu_items[items_num].usrptr = menu;
538*53ee8cc1Swenshuai.xi if (menu != NULL)
539*53ee8cc1Swenshuai.xi k_menu_items[items_num].is_visible =
540*53ee8cc1Swenshuai.xi menu_is_visible(menu);
541*53ee8cc1Swenshuai.xi else
542*53ee8cc1Swenshuai.xi k_menu_items[items_num].is_visible = 1;
543*53ee8cc1Swenshuai.xi
544*53ee8cc1Swenshuai.xi va_start(ap, fmt);
545*53ee8cc1Swenshuai.xi vsnprintf(k_menu_items[items_num].str,
546*53ee8cc1Swenshuai.xi sizeof(k_menu_items[items_num].str),
547*53ee8cc1Swenshuai.xi fmt, ap);
548*53ee8cc1Swenshuai.xi va_end(ap);
549*53ee8cc1Swenshuai.xi
550*53ee8cc1Swenshuai.xi if (!k_menu_items[items_num].is_visible)
551*53ee8cc1Swenshuai.xi memcpy(k_menu_items[items_num].str, "XXX", 3);
552*53ee8cc1Swenshuai.xi
553*53ee8cc1Swenshuai.xi curses_menu_items[items_num] = new_item(
554*53ee8cc1Swenshuai.xi k_menu_items[items_num].str,
555*53ee8cc1Swenshuai.xi k_menu_items[items_num].str);
556*53ee8cc1Swenshuai.xi set_item_userptr(curses_menu_items[items_num],
557*53ee8cc1Swenshuai.xi &k_menu_items[items_num]);
558*53ee8cc1Swenshuai.xi /*
559*53ee8cc1Swenshuai.xi if (!k_menu_items[items_num].is_visible)
560*53ee8cc1Swenshuai.xi item_opts_off(curses_menu_items[items_num], O_SELECTABLE);
561*53ee8cc1Swenshuai.xi */
562*53ee8cc1Swenshuai.xi
563*53ee8cc1Swenshuai.xi items_num++;
564*53ee8cc1Swenshuai.xi curses_menu_items[items_num] = NULL;
565*53ee8cc1Swenshuai.xi }
566*53ee8cc1Swenshuai.xi
567*53ee8cc1Swenshuai.xi /* very hackish. adds a string to the last item added */
item_add_str(const char * fmt,...)568*53ee8cc1Swenshuai.xi static void item_add_str(const char *fmt, ...)
569*53ee8cc1Swenshuai.xi {
570*53ee8cc1Swenshuai.xi va_list ap;
571*53ee8cc1Swenshuai.xi int index = items_num-1;
572*53ee8cc1Swenshuai.xi char new_str[256];
573*53ee8cc1Swenshuai.xi char tmp_str[256];
574*53ee8cc1Swenshuai.xi
575*53ee8cc1Swenshuai.xi if (index < 0)
576*53ee8cc1Swenshuai.xi return;
577*53ee8cc1Swenshuai.xi
578*53ee8cc1Swenshuai.xi va_start(ap, fmt);
579*53ee8cc1Swenshuai.xi vsnprintf(new_str, sizeof(new_str), fmt, ap);
580*53ee8cc1Swenshuai.xi va_end(ap);
581*53ee8cc1Swenshuai.xi snprintf(tmp_str, sizeof(tmp_str), "%s%s",
582*53ee8cc1Swenshuai.xi k_menu_items[index].str, new_str);
583*53ee8cc1Swenshuai.xi strncpy(k_menu_items[index].str,
584*53ee8cc1Swenshuai.xi tmp_str,
585*53ee8cc1Swenshuai.xi sizeof(k_menu_items[index].str));
586*53ee8cc1Swenshuai.xi
587*53ee8cc1Swenshuai.xi free_item(curses_menu_items[index]);
588*53ee8cc1Swenshuai.xi curses_menu_items[index] = new_item(
589*53ee8cc1Swenshuai.xi k_menu_items[index].str,
590*53ee8cc1Swenshuai.xi k_menu_items[index].str);
591*53ee8cc1Swenshuai.xi set_item_userptr(curses_menu_items[index],
592*53ee8cc1Swenshuai.xi &k_menu_items[index]);
593*53ee8cc1Swenshuai.xi }
594*53ee8cc1Swenshuai.xi
595*53ee8cc1Swenshuai.xi /* get the tag of the currently selected item */
item_tag(void)596*53ee8cc1Swenshuai.xi static char item_tag(void)
597*53ee8cc1Swenshuai.xi {
598*53ee8cc1Swenshuai.xi ITEM *cur;
599*53ee8cc1Swenshuai.xi struct mitem *mcur;
600*53ee8cc1Swenshuai.xi
601*53ee8cc1Swenshuai.xi cur = current_item(curses_menu);
602*53ee8cc1Swenshuai.xi if (cur == NULL)
603*53ee8cc1Swenshuai.xi return 0;
604*53ee8cc1Swenshuai.xi mcur = (struct mitem *) item_userptr(cur);
605*53ee8cc1Swenshuai.xi return mcur->tag;
606*53ee8cc1Swenshuai.xi }
607*53ee8cc1Swenshuai.xi
curses_item_index(void)608*53ee8cc1Swenshuai.xi static int curses_item_index(void)
609*53ee8cc1Swenshuai.xi {
610*53ee8cc1Swenshuai.xi return item_index(current_item(curses_menu));
611*53ee8cc1Swenshuai.xi }
612*53ee8cc1Swenshuai.xi
item_data(void)613*53ee8cc1Swenshuai.xi static void *item_data(void)
614*53ee8cc1Swenshuai.xi {
615*53ee8cc1Swenshuai.xi ITEM *cur;
616*53ee8cc1Swenshuai.xi struct mitem *mcur;
617*53ee8cc1Swenshuai.xi
618*53ee8cc1Swenshuai.xi cur = current_item(curses_menu);
619*53ee8cc1Swenshuai.xi if (!cur)
620*53ee8cc1Swenshuai.xi return NULL;
621*53ee8cc1Swenshuai.xi mcur = (struct mitem *) item_userptr(cur);
622*53ee8cc1Swenshuai.xi return mcur->usrptr;
623*53ee8cc1Swenshuai.xi
624*53ee8cc1Swenshuai.xi }
625*53ee8cc1Swenshuai.xi
item_is_tag(char tag)626*53ee8cc1Swenshuai.xi static int item_is_tag(char tag)
627*53ee8cc1Swenshuai.xi {
628*53ee8cc1Swenshuai.xi return item_tag() == tag;
629*53ee8cc1Swenshuai.xi }
630*53ee8cc1Swenshuai.xi
631*53ee8cc1Swenshuai.xi static char filename[PATH_MAX+1];
632*53ee8cc1Swenshuai.xi static char menu_backtitle[PATH_MAX+128];
set_config_filename(const char * config_filename)633*53ee8cc1Swenshuai.xi static const char *set_config_filename(const char *config_filename)
634*53ee8cc1Swenshuai.xi {
635*53ee8cc1Swenshuai.xi int size;
636*53ee8cc1Swenshuai.xi
637*53ee8cc1Swenshuai.xi size = snprintf(menu_backtitle, sizeof(menu_backtitle),
638*53ee8cc1Swenshuai.xi "%s - %s", config_filename, rootmenu.prompt->text);
639*53ee8cc1Swenshuai.xi if (size >= sizeof(menu_backtitle))
640*53ee8cc1Swenshuai.xi menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
641*53ee8cc1Swenshuai.xi
642*53ee8cc1Swenshuai.xi size = snprintf(filename, sizeof(filename), "%s", config_filename);
643*53ee8cc1Swenshuai.xi if (size >= sizeof(filename))
644*53ee8cc1Swenshuai.xi filename[sizeof(filename)-1] = '\0';
645*53ee8cc1Swenshuai.xi return menu_backtitle;
646*53ee8cc1Swenshuai.xi }
647*53ee8cc1Swenshuai.xi
648*53ee8cc1Swenshuai.xi /* return = 0 means we are successful.
649*53ee8cc1Swenshuai.xi * -1 means go on doing what you were doing
650*53ee8cc1Swenshuai.xi */
do_exit(void)651*53ee8cc1Swenshuai.xi static int do_exit(void)
652*53ee8cc1Swenshuai.xi {
653*53ee8cc1Swenshuai.xi int res;
654*53ee8cc1Swenshuai.xi if (!conf_get_changed()) {
655*53ee8cc1Swenshuai.xi global_exit = 1;
656*53ee8cc1Swenshuai.xi return 0;
657*53ee8cc1Swenshuai.xi }
658*53ee8cc1Swenshuai.xi res = btn_dialog(main_window,
659*53ee8cc1Swenshuai.xi _("Do you wish to save your new configuration?\n"
660*53ee8cc1Swenshuai.xi "<ESC> to cancel and resume nconfig."),
661*53ee8cc1Swenshuai.xi 2,
662*53ee8cc1Swenshuai.xi " <save> ",
663*53ee8cc1Swenshuai.xi "<don't save>");
664*53ee8cc1Swenshuai.xi if (res == KEY_EXIT) {
665*53ee8cc1Swenshuai.xi global_exit = 0;
666*53ee8cc1Swenshuai.xi return -1;
667*53ee8cc1Swenshuai.xi }
668*53ee8cc1Swenshuai.xi
669*53ee8cc1Swenshuai.xi /* if we got here, the user really wants to exit */
670*53ee8cc1Swenshuai.xi switch (res) {
671*53ee8cc1Swenshuai.xi case 0:
672*53ee8cc1Swenshuai.xi res = conf_write(filename);
673*53ee8cc1Swenshuai.xi if (res)
674*53ee8cc1Swenshuai.xi btn_dialog(
675*53ee8cc1Swenshuai.xi main_window,
676*53ee8cc1Swenshuai.xi _("Error during writing of configuration.\n"
677*53ee8cc1Swenshuai.xi "Your configuration changes were NOT saved."),
678*53ee8cc1Swenshuai.xi 1,
679*53ee8cc1Swenshuai.xi "<OK>");
680*53ee8cc1Swenshuai.xi break;
681*53ee8cc1Swenshuai.xi default:
682*53ee8cc1Swenshuai.xi btn_dialog(
683*53ee8cc1Swenshuai.xi main_window,
684*53ee8cc1Swenshuai.xi _("Your configuration changes were NOT saved."),
685*53ee8cc1Swenshuai.xi 1,
686*53ee8cc1Swenshuai.xi "<OK>");
687*53ee8cc1Swenshuai.xi break;
688*53ee8cc1Swenshuai.xi }
689*53ee8cc1Swenshuai.xi global_exit = 1;
690*53ee8cc1Swenshuai.xi return 0;
691*53ee8cc1Swenshuai.xi }
692*53ee8cc1Swenshuai.xi
693*53ee8cc1Swenshuai.xi
search_conf(void)694*53ee8cc1Swenshuai.xi static void search_conf(void)
695*53ee8cc1Swenshuai.xi {
696*53ee8cc1Swenshuai.xi struct symbol **sym_arr;
697*53ee8cc1Swenshuai.xi struct gstr res;
698*53ee8cc1Swenshuai.xi char dialog_input_result[100];
699*53ee8cc1Swenshuai.xi char *dialog_input;
700*53ee8cc1Swenshuai.xi int dres;
701*53ee8cc1Swenshuai.xi again:
702*53ee8cc1Swenshuai.xi dres = dialog_inputbox(main_window,
703*53ee8cc1Swenshuai.xi _("Search Configuration Parameter"),
704*53ee8cc1Swenshuai.xi _("Enter " CONFIG_ " (sub)string to search for "
705*53ee8cc1Swenshuai.xi "(with or without \"" CONFIG_ "\")"),
706*53ee8cc1Swenshuai.xi "", dialog_input_result, 99);
707*53ee8cc1Swenshuai.xi switch (dres) {
708*53ee8cc1Swenshuai.xi case 0:
709*53ee8cc1Swenshuai.xi break;
710*53ee8cc1Swenshuai.xi case 1:
711*53ee8cc1Swenshuai.xi show_scroll_win(main_window,
712*53ee8cc1Swenshuai.xi _("Search Configuration"), search_help);
713*53ee8cc1Swenshuai.xi goto again;
714*53ee8cc1Swenshuai.xi default:
715*53ee8cc1Swenshuai.xi return;
716*53ee8cc1Swenshuai.xi }
717*53ee8cc1Swenshuai.xi
718*53ee8cc1Swenshuai.xi /* strip the prefix if necessary */
719*53ee8cc1Swenshuai.xi dialog_input = dialog_input_result;
720*53ee8cc1Swenshuai.xi if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
721*53ee8cc1Swenshuai.xi dialog_input += strlen(CONFIG_);
722*53ee8cc1Swenshuai.xi
723*53ee8cc1Swenshuai.xi sym_arr = sym_re_search(dialog_input);
724*53ee8cc1Swenshuai.xi res = get_relations_str(sym_arr);
725*53ee8cc1Swenshuai.xi free(sym_arr);
726*53ee8cc1Swenshuai.xi show_scroll_win(main_window,
727*53ee8cc1Swenshuai.xi _("Search Results"), str_get(&res));
728*53ee8cc1Swenshuai.xi str_free(&res);
729*53ee8cc1Swenshuai.xi }
730*53ee8cc1Swenshuai.xi
731*53ee8cc1Swenshuai.xi
build_conf(struct menu * menu)732*53ee8cc1Swenshuai.xi static void build_conf(struct menu *menu)
733*53ee8cc1Swenshuai.xi {
734*53ee8cc1Swenshuai.xi struct symbol *sym;
735*53ee8cc1Swenshuai.xi struct property *prop;
736*53ee8cc1Swenshuai.xi struct menu *child;
737*53ee8cc1Swenshuai.xi int type, tmp, doint = 2;
738*53ee8cc1Swenshuai.xi tristate val;
739*53ee8cc1Swenshuai.xi char ch;
740*53ee8cc1Swenshuai.xi
741*53ee8cc1Swenshuai.xi if (!menu || (!show_all_items && !menu_is_visible(menu)))
742*53ee8cc1Swenshuai.xi return;
743*53ee8cc1Swenshuai.xi
744*53ee8cc1Swenshuai.xi sym = menu->sym;
745*53ee8cc1Swenshuai.xi prop = menu->prompt;
746*53ee8cc1Swenshuai.xi if (!sym) {
747*53ee8cc1Swenshuai.xi if (prop && menu != current_menu) {
748*53ee8cc1Swenshuai.xi const char *prompt = menu_get_prompt(menu);
749*53ee8cc1Swenshuai.xi enum prop_type ptype;
750*53ee8cc1Swenshuai.xi ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
751*53ee8cc1Swenshuai.xi switch (ptype) {
752*53ee8cc1Swenshuai.xi case P_MENU:
753*53ee8cc1Swenshuai.xi child_count++;
754*53ee8cc1Swenshuai.xi prompt = _(prompt);
755*53ee8cc1Swenshuai.xi if (single_menu_mode) {
756*53ee8cc1Swenshuai.xi item_make(menu, 'm',
757*53ee8cc1Swenshuai.xi "%s%*c%s",
758*53ee8cc1Swenshuai.xi menu->data ? "-->" : "++>",
759*53ee8cc1Swenshuai.xi indent + 1, ' ', prompt);
760*53ee8cc1Swenshuai.xi } else
761*53ee8cc1Swenshuai.xi item_make(menu, 'm',
762*53ee8cc1Swenshuai.xi " %*c%s --->",
763*53ee8cc1Swenshuai.xi indent + 1,
764*53ee8cc1Swenshuai.xi ' ', prompt);
765*53ee8cc1Swenshuai.xi
766*53ee8cc1Swenshuai.xi if (single_menu_mode && menu->data)
767*53ee8cc1Swenshuai.xi goto conf_childs;
768*53ee8cc1Swenshuai.xi return;
769*53ee8cc1Swenshuai.xi case P_COMMENT:
770*53ee8cc1Swenshuai.xi if (prompt) {
771*53ee8cc1Swenshuai.xi child_count++;
772*53ee8cc1Swenshuai.xi item_make(menu, ':',
773*53ee8cc1Swenshuai.xi " %*c*** %s ***",
774*53ee8cc1Swenshuai.xi indent + 1, ' ',
775*53ee8cc1Swenshuai.xi _(prompt));
776*53ee8cc1Swenshuai.xi }
777*53ee8cc1Swenshuai.xi break;
778*53ee8cc1Swenshuai.xi default:
779*53ee8cc1Swenshuai.xi if (prompt) {
780*53ee8cc1Swenshuai.xi child_count++;
781*53ee8cc1Swenshuai.xi item_make(menu, ':', "---%*c%s",
782*53ee8cc1Swenshuai.xi indent + 1, ' ',
783*53ee8cc1Swenshuai.xi _(prompt));
784*53ee8cc1Swenshuai.xi }
785*53ee8cc1Swenshuai.xi }
786*53ee8cc1Swenshuai.xi } else
787*53ee8cc1Swenshuai.xi doint = 0;
788*53ee8cc1Swenshuai.xi goto conf_childs;
789*53ee8cc1Swenshuai.xi }
790*53ee8cc1Swenshuai.xi
791*53ee8cc1Swenshuai.xi type = sym_get_type(sym);
792*53ee8cc1Swenshuai.xi if (sym_is_choice(sym)) {
793*53ee8cc1Swenshuai.xi struct symbol *def_sym = sym_get_choice_value(sym);
794*53ee8cc1Swenshuai.xi struct menu *def_menu = NULL;
795*53ee8cc1Swenshuai.xi
796*53ee8cc1Swenshuai.xi child_count++;
797*53ee8cc1Swenshuai.xi for (child = menu->list; child; child = child->next) {
798*53ee8cc1Swenshuai.xi if (menu_is_visible(child) && child->sym == def_sym)
799*53ee8cc1Swenshuai.xi def_menu = child;
800*53ee8cc1Swenshuai.xi }
801*53ee8cc1Swenshuai.xi
802*53ee8cc1Swenshuai.xi val = sym_get_tristate_value(sym);
803*53ee8cc1Swenshuai.xi if (sym_is_changable(sym)) {
804*53ee8cc1Swenshuai.xi switch (type) {
805*53ee8cc1Swenshuai.xi case S_BOOLEAN:
806*53ee8cc1Swenshuai.xi item_make(menu, 't', "[%c]",
807*53ee8cc1Swenshuai.xi val == no ? ' ' : '*');
808*53ee8cc1Swenshuai.xi break;
809*53ee8cc1Swenshuai.xi case S_TRISTATE:
810*53ee8cc1Swenshuai.xi switch (val) {
811*53ee8cc1Swenshuai.xi case yes:
812*53ee8cc1Swenshuai.xi ch = '*';
813*53ee8cc1Swenshuai.xi break;
814*53ee8cc1Swenshuai.xi case mod:
815*53ee8cc1Swenshuai.xi ch = 'M';
816*53ee8cc1Swenshuai.xi break;
817*53ee8cc1Swenshuai.xi default:
818*53ee8cc1Swenshuai.xi ch = ' ';
819*53ee8cc1Swenshuai.xi break;
820*53ee8cc1Swenshuai.xi }
821*53ee8cc1Swenshuai.xi item_make(menu, 't', "<%c>", ch);
822*53ee8cc1Swenshuai.xi break;
823*53ee8cc1Swenshuai.xi }
824*53ee8cc1Swenshuai.xi } else {
825*53ee8cc1Swenshuai.xi item_make(menu, def_menu ? 't' : ':', " ");
826*53ee8cc1Swenshuai.xi }
827*53ee8cc1Swenshuai.xi
828*53ee8cc1Swenshuai.xi item_add_str("%*c%s", indent + 1,
829*53ee8cc1Swenshuai.xi ' ', _(menu_get_prompt(menu)));
830*53ee8cc1Swenshuai.xi if (val == yes) {
831*53ee8cc1Swenshuai.xi if (def_menu) {
832*53ee8cc1Swenshuai.xi item_add_str(" (%s)",
833*53ee8cc1Swenshuai.xi _(menu_get_prompt(def_menu)));
834*53ee8cc1Swenshuai.xi item_add_str(" --->");
835*53ee8cc1Swenshuai.xi if (def_menu->list) {
836*53ee8cc1Swenshuai.xi indent += 2;
837*53ee8cc1Swenshuai.xi build_conf(def_menu);
838*53ee8cc1Swenshuai.xi indent -= 2;
839*53ee8cc1Swenshuai.xi }
840*53ee8cc1Swenshuai.xi }
841*53ee8cc1Swenshuai.xi return;
842*53ee8cc1Swenshuai.xi }
843*53ee8cc1Swenshuai.xi } else {
844*53ee8cc1Swenshuai.xi if (menu == current_menu) {
845*53ee8cc1Swenshuai.xi item_make(menu, ':',
846*53ee8cc1Swenshuai.xi "---%*c%s", indent + 1,
847*53ee8cc1Swenshuai.xi ' ', _(menu_get_prompt(menu)));
848*53ee8cc1Swenshuai.xi goto conf_childs;
849*53ee8cc1Swenshuai.xi }
850*53ee8cc1Swenshuai.xi child_count++;
851*53ee8cc1Swenshuai.xi val = sym_get_tristate_value(sym);
852*53ee8cc1Swenshuai.xi if (sym_is_choice_value(sym) && val == yes) {
853*53ee8cc1Swenshuai.xi item_make(menu, ':', " ");
854*53ee8cc1Swenshuai.xi } else {
855*53ee8cc1Swenshuai.xi switch (type) {
856*53ee8cc1Swenshuai.xi case S_BOOLEAN:
857*53ee8cc1Swenshuai.xi if (sym_is_changable(sym))
858*53ee8cc1Swenshuai.xi item_make(menu, 't', "[%c]",
859*53ee8cc1Swenshuai.xi val == no ? ' ' : '*');
860*53ee8cc1Swenshuai.xi else
861*53ee8cc1Swenshuai.xi item_make(menu, 't', "-%c-",
862*53ee8cc1Swenshuai.xi val == no ? ' ' : '*');
863*53ee8cc1Swenshuai.xi break;
864*53ee8cc1Swenshuai.xi case S_TRISTATE:
865*53ee8cc1Swenshuai.xi switch (val) {
866*53ee8cc1Swenshuai.xi case yes:
867*53ee8cc1Swenshuai.xi ch = '*';
868*53ee8cc1Swenshuai.xi break;
869*53ee8cc1Swenshuai.xi case mod:
870*53ee8cc1Swenshuai.xi ch = 'M';
871*53ee8cc1Swenshuai.xi break;
872*53ee8cc1Swenshuai.xi default:
873*53ee8cc1Swenshuai.xi ch = ' ';
874*53ee8cc1Swenshuai.xi break;
875*53ee8cc1Swenshuai.xi }
876*53ee8cc1Swenshuai.xi if (sym_is_changable(sym)) {
877*53ee8cc1Swenshuai.xi if (sym->rev_dep.tri == mod)
878*53ee8cc1Swenshuai.xi item_make(menu,
879*53ee8cc1Swenshuai.xi 't', "{%c}", ch);
880*53ee8cc1Swenshuai.xi else
881*53ee8cc1Swenshuai.xi item_make(menu,
882*53ee8cc1Swenshuai.xi 't', "<%c>", ch);
883*53ee8cc1Swenshuai.xi } else
884*53ee8cc1Swenshuai.xi item_make(menu, 't', "-%c-", ch);
885*53ee8cc1Swenshuai.xi break;
886*53ee8cc1Swenshuai.xi default:
887*53ee8cc1Swenshuai.xi tmp = 2 + strlen(sym_get_string_value(sym));
888*53ee8cc1Swenshuai.xi item_make(menu, 's', " (%s)",
889*53ee8cc1Swenshuai.xi sym_get_string_value(sym));
890*53ee8cc1Swenshuai.xi tmp = indent - tmp + 4;
891*53ee8cc1Swenshuai.xi if (tmp < 0)
892*53ee8cc1Swenshuai.xi tmp = 0;
893*53ee8cc1Swenshuai.xi item_add_str("%*c%s%s", tmp, ' ',
894*53ee8cc1Swenshuai.xi _(menu_get_prompt(menu)),
895*53ee8cc1Swenshuai.xi (sym_has_value(sym) ||
896*53ee8cc1Swenshuai.xi !sym_is_changable(sym)) ? "" :
897*53ee8cc1Swenshuai.xi _(" (NEW)"));
898*53ee8cc1Swenshuai.xi goto conf_childs;
899*53ee8cc1Swenshuai.xi }
900*53ee8cc1Swenshuai.xi }
901*53ee8cc1Swenshuai.xi item_add_str("%*c%s%s", indent + 1, ' ',
902*53ee8cc1Swenshuai.xi _(menu_get_prompt(menu)),
903*53ee8cc1Swenshuai.xi (sym_has_value(sym) || !sym_is_changable(sym)) ?
904*53ee8cc1Swenshuai.xi "" : _(" (NEW)"));
905*53ee8cc1Swenshuai.xi if (menu->prompt && menu->prompt->type == P_MENU) {
906*53ee8cc1Swenshuai.xi item_add_str(" --->");
907*53ee8cc1Swenshuai.xi return;
908*53ee8cc1Swenshuai.xi }
909*53ee8cc1Swenshuai.xi }
910*53ee8cc1Swenshuai.xi
911*53ee8cc1Swenshuai.xi conf_childs:
912*53ee8cc1Swenshuai.xi indent += doint;
913*53ee8cc1Swenshuai.xi for (child = menu->list; child; child = child->next)
914*53ee8cc1Swenshuai.xi build_conf(child);
915*53ee8cc1Swenshuai.xi indent -= doint;
916*53ee8cc1Swenshuai.xi }
917*53ee8cc1Swenshuai.xi
reset_menu(void)918*53ee8cc1Swenshuai.xi static void reset_menu(void)
919*53ee8cc1Swenshuai.xi {
920*53ee8cc1Swenshuai.xi unpost_menu(curses_menu);
921*53ee8cc1Swenshuai.xi clean_items();
922*53ee8cc1Swenshuai.xi }
923*53ee8cc1Swenshuai.xi
924*53ee8cc1Swenshuai.xi /* adjust the menu to show this item.
925*53ee8cc1Swenshuai.xi * prefer not to scroll the menu if possible*/
center_item(int selected_index,int * last_top_row)926*53ee8cc1Swenshuai.xi static void center_item(int selected_index, int *last_top_row)
927*53ee8cc1Swenshuai.xi {
928*53ee8cc1Swenshuai.xi int toprow;
929*53ee8cc1Swenshuai.xi
930*53ee8cc1Swenshuai.xi set_top_row(curses_menu, *last_top_row);
931*53ee8cc1Swenshuai.xi toprow = top_row(curses_menu);
932*53ee8cc1Swenshuai.xi if (selected_index < toprow ||
933*53ee8cc1Swenshuai.xi selected_index >= toprow+mwin_max_lines) {
934*53ee8cc1Swenshuai.xi toprow = max(selected_index-mwin_max_lines/2, 0);
935*53ee8cc1Swenshuai.xi if (toprow >= item_count(curses_menu)-mwin_max_lines)
936*53ee8cc1Swenshuai.xi toprow = item_count(curses_menu)-mwin_max_lines;
937*53ee8cc1Swenshuai.xi set_top_row(curses_menu, toprow);
938*53ee8cc1Swenshuai.xi }
939*53ee8cc1Swenshuai.xi set_current_item(curses_menu,
940*53ee8cc1Swenshuai.xi curses_menu_items[selected_index]);
941*53ee8cc1Swenshuai.xi *last_top_row = toprow;
942*53ee8cc1Swenshuai.xi post_menu(curses_menu);
943*53ee8cc1Swenshuai.xi refresh_all_windows(main_window);
944*53ee8cc1Swenshuai.xi }
945*53ee8cc1Swenshuai.xi
946*53ee8cc1Swenshuai.xi /* this function assumes reset_menu has been called before */
show_menu(const char * prompt,const char * instructions,int selected_index,int * last_top_row)947*53ee8cc1Swenshuai.xi static void show_menu(const char *prompt, const char *instructions,
948*53ee8cc1Swenshuai.xi int selected_index, int *last_top_row)
949*53ee8cc1Swenshuai.xi {
950*53ee8cc1Swenshuai.xi int maxx, maxy;
951*53ee8cc1Swenshuai.xi WINDOW *menu_window;
952*53ee8cc1Swenshuai.xi
953*53ee8cc1Swenshuai.xi current_instructions = instructions;
954*53ee8cc1Swenshuai.xi
955*53ee8cc1Swenshuai.xi clear();
956*53ee8cc1Swenshuai.xi (void) wattrset(main_window, attributes[NORMAL]);
957*53ee8cc1Swenshuai.xi print_in_middle(stdscr, 1, 0, COLS,
958*53ee8cc1Swenshuai.xi menu_backtitle,
959*53ee8cc1Swenshuai.xi attributes[MAIN_HEADING]);
960*53ee8cc1Swenshuai.xi
961*53ee8cc1Swenshuai.xi (void) wattrset(main_window, attributes[MAIN_MENU_BOX]);
962*53ee8cc1Swenshuai.xi box(main_window, 0, 0);
963*53ee8cc1Swenshuai.xi (void) wattrset(main_window, attributes[MAIN_MENU_HEADING]);
964*53ee8cc1Swenshuai.xi mvwprintw(main_window, 0, 3, " %s ", prompt);
965*53ee8cc1Swenshuai.xi (void) wattrset(main_window, attributes[NORMAL]);
966*53ee8cc1Swenshuai.xi
967*53ee8cc1Swenshuai.xi set_menu_items(curses_menu, curses_menu_items);
968*53ee8cc1Swenshuai.xi
969*53ee8cc1Swenshuai.xi /* position the menu at the middle of the screen */
970*53ee8cc1Swenshuai.xi scale_menu(curses_menu, &maxy, &maxx);
971*53ee8cc1Swenshuai.xi maxx = min(maxx, mwin_max_cols-2);
972*53ee8cc1Swenshuai.xi maxy = mwin_max_lines;
973*53ee8cc1Swenshuai.xi menu_window = derwin(main_window,
974*53ee8cc1Swenshuai.xi maxy,
975*53ee8cc1Swenshuai.xi maxx,
976*53ee8cc1Swenshuai.xi 2,
977*53ee8cc1Swenshuai.xi (mwin_max_cols-maxx)/2);
978*53ee8cc1Swenshuai.xi keypad(menu_window, TRUE);
979*53ee8cc1Swenshuai.xi set_menu_win(curses_menu, menu_window);
980*53ee8cc1Swenshuai.xi set_menu_sub(curses_menu, menu_window);
981*53ee8cc1Swenshuai.xi
982*53ee8cc1Swenshuai.xi /* must reassert this after changing items, otherwise returns to a
983*53ee8cc1Swenshuai.xi * default of 16
984*53ee8cc1Swenshuai.xi */
985*53ee8cc1Swenshuai.xi set_menu_format(curses_menu, maxy, 1);
986*53ee8cc1Swenshuai.xi center_item(selected_index, last_top_row);
987*53ee8cc1Swenshuai.xi set_menu_format(curses_menu, maxy, 1);
988*53ee8cc1Swenshuai.xi
989*53ee8cc1Swenshuai.xi print_function_line();
990*53ee8cc1Swenshuai.xi
991*53ee8cc1Swenshuai.xi /* Post the menu */
992*53ee8cc1Swenshuai.xi post_menu(curses_menu);
993*53ee8cc1Swenshuai.xi refresh_all_windows(main_window);
994*53ee8cc1Swenshuai.xi }
995*53ee8cc1Swenshuai.xi
adj_match_dir(match_f * match_direction)996*53ee8cc1Swenshuai.xi static void adj_match_dir(match_f *match_direction)
997*53ee8cc1Swenshuai.xi {
998*53ee8cc1Swenshuai.xi if (*match_direction == FIND_NEXT_MATCH_DOWN)
999*53ee8cc1Swenshuai.xi *match_direction =
1000*53ee8cc1Swenshuai.xi MATCH_TINKER_PATTERN_DOWN;
1001*53ee8cc1Swenshuai.xi else if (*match_direction == FIND_NEXT_MATCH_UP)
1002*53ee8cc1Swenshuai.xi *match_direction =
1003*53ee8cc1Swenshuai.xi MATCH_TINKER_PATTERN_UP;
1004*53ee8cc1Swenshuai.xi /* else, do no change.. */
1005*53ee8cc1Swenshuai.xi }
1006*53ee8cc1Swenshuai.xi
1007*53ee8cc1Swenshuai.xi struct match_state
1008*53ee8cc1Swenshuai.xi {
1009*53ee8cc1Swenshuai.xi int in_search;
1010*53ee8cc1Swenshuai.xi match_f match_direction;
1011*53ee8cc1Swenshuai.xi char pattern[256];
1012*53ee8cc1Swenshuai.xi };
1013*53ee8cc1Swenshuai.xi
1014*53ee8cc1Swenshuai.xi /* Return 0 means I have handled the key. In such a case, ans should hold the
1015*53ee8cc1Swenshuai.xi * item to center, or -1 otherwise.
1016*53ee8cc1Swenshuai.xi * Else return -1 .
1017*53ee8cc1Swenshuai.xi */
do_match(int key,struct match_state * state,int * ans)1018*53ee8cc1Swenshuai.xi static int do_match(int key, struct match_state *state, int *ans)
1019*53ee8cc1Swenshuai.xi {
1020*53ee8cc1Swenshuai.xi char c = (char) key;
1021*53ee8cc1Swenshuai.xi int terminate_search = 0;
1022*53ee8cc1Swenshuai.xi *ans = -1;
1023*53ee8cc1Swenshuai.xi if (key == '/' || (state->in_search && key == 27)) {
1024*53ee8cc1Swenshuai.xi move(0, 0);
1025*53ee8cc1Swenshuai.xi refresh();
1026*53ee8cc1Swenshuai.xi clrtoeol();
1027*53ee8cc1Swenshuai.xi state->in_search = 1-state->in_search;
1028*53ee8cc1Swenshuai.xi bzero(state->pattern, sizeof(state->pattern));
1029*53ee8cc1Swenshuai.xi state->match_direction = MATCH_TINKER_PATTERN_DOWN;
1030*53ee8cc1Swenshuai.xi return 0;
1031*53ee8cc1Swenshuai.xi } else if (!state->in_search)
1032*53ee8cc1Swenshuai.xi return 1;
1033*53ee8cc1Swenshuai.xi
1034*53ee8cc1Swenshuai.xi if (isalnum(c) || isgraph(c) || c == ' ') {
1035*53ee8cc1Swenshuai.xi state->pattern[strlen(state->pattern)] = c;
1036*53ee8cc1Swenshuai.xi state->pattern[strlen(state->pattern)] = '\0';
1037*53ee8cc1Swenshuai.xi adj_match_dir(&state->match_direction);
1038*53ee8cc1Swenshuai.xi *ans = get_mext_match(state->pattern,
1039*53ee8cc1Swenshuai.xi state->match_direction);
1040*53ee8cc1Swenshuai.xi } else if (key == KEY_DOWN) {
1041*53ee8cc1Swenshuai.xi state->match_direction = FIND_NEXT_MATCH_DOWN;
1042*53ee8cc1Swenshuai.xi *ans = get_mext_match(state->pattern,
1043*53ee8cc1Swenshuai.xi state->match_direction);
1044*53ee8cc1Swenshuai.xi } else if (key == KEY_UP) {
1045*53ee8cc1Swenshuai.xi state->match_direction = FIND_NEXT_MATCH_UP;
1046*53ee8cc1Swenshuai.xi *ans = get_mext_match(state->pattern,
1047*53ee8cc1Swenshuai.xi state->match_direction);
1048*53ee8cc1Swenshuai.xi } else if (key == KEY_BACKSPACE || key == 127) {
1049*53ee8cc1Swenshuai.xi state->pattern[strlen(state->pattern)-1] = '\0';
1050*53ee8cc1Swenshuai.xi adj_match_dir(&state->match_direction);
1051*53ee8cc1Swenshuai.xi } else
1052*53ee8cc1Swenshuai.xi terminate_search = 1;
1053*53ee8cc1Swenshuai.xi
1054*53ee8cc1Swenshuai.xi if (terminate_search) {
1055*53ee8cc1Swenshuai.xi state->in_search = 0;
1056*53ee8cc1Swenshuai.xi bzero(state->pattern, sizeof(state->pattern));
1057*53ee8cc1Swenshuai.xi move(0, 0);
1058*53ee8cc1Swenshuai.xi refresh();
1059*53ee8cc1Swenshuai.xi clrtoeol();
1060*53ee8cc1Swenshuai.xi return -1;
1061*53ee8cc1Swenshuai.xi }
1062*53ee8cc1Swenshuai.xi return 0;
1063*53ee8cc1Swenshuai.xi }
1064*53ee8cc1Swenshuai.xi
conf(struct menu * menu)1065*53ee8cc1Swenshuai.xi static void conf(struct menu *menu)
1066*53ee8cc1Swenshuai.xi {
1067*53ee8cc1Swenshuai.xi struct menu *submenu = 0;
1068*53ee8cc1Swenshuai.xi const char *prompt = menu_get_prompt(menu);
1069*53ee8cc1Swenshuai.xi struct symbol *sym;
1070*53ee8cc1Swenshuai.xi struct menu *active_menu = NULL;
1071*53ee8cc1Swenshuai.xi int res;
1072*53ee8cc1Swenshuai.xi int current_index = 0;
1073*53ee8cc1Swenshuai.xi int last_top_row = 0;
1074*53ee8cc1Swenshuai.xi struct match_state match_state = {
1075*53ee8cc1Swenshuai.xi .in_search = 0,
1076*53ee8cc1Swenshuai.xi .match_direction = MATCH_TINKER_PATTERN_DOWN,
1077*53ee8cc1Swenshuai.xi .pattern = "",
1078*53ee8cc1Swenshuai.xi };
1079*53ee8cc1Swenshuai.xi
1080*53ee8cc1Swenshuai.xi while (!global_exit) {
1081*53ee8cc1Swenshuai.xi reset_menu();
1082*53ee8cc1Swenshuai.xi current_menu = menu;
1083*53ee8cc1Swenshuai.xi build_conf(menu);
1084*53ee8cc1Swenshuai.xi if (!child_count)
1085*53ee8cc1Swenshuai.xi break;
1086*53ee8cc1Swenshuai.xi
1087*53ee8cc1Swenshuai.xi show_menu(prompt ? _(prompt) : _("Main Menu"),
1088*53ee8cc1Swenshuai.xi _(menu_instructions),
1089*53ee8cc1Swenshuai.xi current_index, &last_top_row);
1090*53ee8cc1Swenshuai.xi keypad((menu_win(curses_menu)), TRUE);
1091*53ee8cc1Swenshuai.xi while (!global_exit) {
1092*53ee8cc1Swenshuai.xi if (match_state.in_search) {
1093*53ee8cc1Swenshuai.xi mvprintw(0, 0,
1094*53ee8cc1Swenshuai.xi "searching: %s", match_state.pattern);
1095*53ee8cc1Swenshuai.xi clrtoeol();
1096*53ee8cc1Swenshuai.xi }
1097*53ee8cc1Swenshuai.xi refresh_all_windows(main_window);
1098*53ee8cc1Swenshuai.xi res = wgetch(menu_win(curses_menu));
1099*53ee8cc1Swenshuai.xi if (!res)
1100*53ee8cc1Swenshuai.xi break;
1101*53ee8cc1Swenshuai.xi if (do_match(res, &match_state, ¤t_index) == 0) {
1102*53ee8cc1Swenshuai.xi if (current_index != -1)
1103*53ee8cc1Swenshuai.xi center_item(current_index,
1104*53ee8cc1Swenshuai.xi &last_top_row);
1105*53ee8cc1Swenshuai.xi continue;
1106*53ee8cc1Swenshuai.xi }
1107*53ee8cc1Swenshuai.xi if (process_special_keys(&res,
1108*53ee8cc1Swenshuai.xi (struct menu *) item_data()))
1109*53ee8cc1Swenshuai.xi break;
1110*53ee8cc1Swenshuai.xi switch (res) {
1111*53ee8cc1Swenshuai.xi case KEY_DOWN:
1112*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_DOWN_ITEM);
1113*53ee8cc1Swenshuai.xi break;
1114*53ee8cc1Swenshuai.xi case KEY_UP:
1115*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_UP_ITEM);
1116*53ee8cc1Swenshuai.xi break;
1117*53ee8cc1Swenshuai.xi case KEY_NPAGE:
1118*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_SCR_DPAGE);
1119*53ee8cc1Swenshuai.xi break;
1120*53ee8cc1Swenshuai.xi case KEY_PPAGE:
1121*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_SCR_UPAGE);
1122*53ee8cc1Swenshuai.xi break;
1123*53ee8cc1Swenshuai.xi case KEY_HOME:
1124*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_FIRST_ITEM);
1125*53ee8cc1Swenshuai.xi break;
1126*53ee8cc1Swenshuai.xi case KEY_END:
1127*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_LAST_ITEM);
1128*53ee8cc1Swenshuai.xi break;
1129*53ee8cc1Swenshuai.xi case 'h':
1130*53ee8cc1Swenshuai.xi case '?':
1131*53ee8cc1Swenshuai.xi show_help((struct menu *) item_data());
1132*53ee8cc1Swenshuai.xi break;
1133*53ee8cc1Swenshuai.xi }
1134*53ee8cc1Swenshuai.xi if (res == 10 || res == 27 ||
1135*53ee8cc1Swenshuai.xi res == 32 || res == 'n' || res == 'y' ||
1136*53ee8cc1Swenshuai.xi res == KEY_LEFT || res == KEY_RIGHT ||
1137*53ee8cc1Swenshuai.xi res == 'm')
1138*53ee8cc1Swenshuai.xi break;
1139*53ee8cc1Swenshuai.xi refresh_all_windows(main_window);
1140*53ee8cc1Swenshuai.xi }
1141*53ee8cc1Swenshuai.xi
1142*53ee8cc1Swenshuai.xi refresh_all_windows(main_window);
1143*53ee8cc1Swenshuai.xi /* if ESC or left*/
1144*53ee8cc1Swenshuai.xi if (res == 27 || (menu != &rootmenu && res == KEY_LEFT))
1145*53ee8cc1Swenshuai.xi break;
1146*53ee8cc1Swenshuai.xi
1147*53ee8cc1Swenshuai.xi /* remember location in the menu */
1148*53ee8cc1Swenshuai.xi last_top_row = top_row(curses_menu);
1149*53ee8cc1Swenshuai.xi current_index = curses_item_index();
1150*53ee8cc1Swenshuai.xi
1151*53ee8cc1Swenshuai.xi if (!item_tag())
1152*53ee8cc1Swenshuai.xi continue;
1153*53ee8cc1Swenshuai.xi
1154*53ee8cc1Swenshuai.xi submenu = (struct menu *) item_data();
1155*53ee8cc1Swenshuai.xi active_menu = (struct menu *)item_data();
1156*53ee8cc1Swenshuai.xi if (!submenu || !menu_is_visible(submenu))
1157*53ee8cc1Swenshuai.xi continue;
1158*53ee8cc1Swenshuai.xi if (submenu)
1159*53ee8cc1Swenshuai.xi sym = submenu->sym;
1160*53ee8cc1Swenshuai.xi else
1161*53ee8cc1Swenshuai.xi sym = NULL;
1162*53ee8cc1Swenshuai.xi
1163*53ee8cc1Swenshuai.xi switch (res) {
1164*53ee8cc1Swenshuai.xi case ' ':
1165*53ee8cc1Swenshuai.xi if (item_is_tag('t'))
1166*53ee8cc1Swenshuai.xi sym_toggle_tristate_value(sym);
1167*53ee8cc1Swenshuai.xi else if (item_is_tag('m'))
1168*53ee8cc1Swenshuai.xi conf(submenu);
1169*53ee8cc1Swenshuai.xi break;
1170*53ee8cc1Swenshuai.xi case KEY_RIGHT:
1171*53ee8cc1Swenshuai.xi case 10: /* ENTER WAS PRESSED */
1172*53ee8cc1Swenshuai.xi switch (item_tag()) {
1173*53ee8cc1Swenshuai.xi case 'm':
1174*53ee8cc1Swenshuai.xi if (single_menu_mode)
1175*53ee8cc1Swenshuai.xi submenu->data =
1176*53ee8cc1Swenshuai.xi (void *) (long) !submenu->data;
1177*53ee8cc1Swenshuai.xi else
1178*53ee8cc1Swenshuai.xi conf(submenu);
1179*53ee8cc1Swenshuai.xi break;
1180*53ee8cc1Swenshuai.xi case 't':
1181*53ee8cc1Swenshuai.xi if (sym_is_choice(sym) &&
1182*53ee8cc1Swenshuai.xi sym_get_tristate_value(sym) == yes)
1183*53ee8cc1Swenshuai.xi conf_choice(submenu);
1184*53ee8cc1Swenshuai.xi else if (submenu->prompt &&
1185*53ee8cc1Swenshuai.xi submenu->prompt->type == P_MENU)
1186*53ee8cc1Swenshuai.xi conf(submenu);
1187*53ee8cc1Swenshuai.xi else if (res == 10)
1188*53ee8cc1Swenshuai.xi sym_toggle_tristate_value(sym);
1189*53ee8cc1Swenshuai.xi break;
1190*53ee8cc1Swenshuai.xi case 's':
1191*53ee8cc1Swenshuai.xi conf_string(submenu);
1192*53ee8cc1Swenshuai.xi break;
1193*53ee8cc1Swenshuai.xi }
1194*53ee8cc1Swenshuai.xi break;
1195*53ee8cc1Swenshuai.xi case 'y':
1196*53ee8cc1Swenshuai.xi if (item_is_tag('t')) {
1197*53ee8cc1Swenshuai.xi if (sym_set_tristate_value(sym, yes))
1198*53ee8cc1Swenshuai.xi break;
1199*53ee8cc1Swenshuai.xi if (sym_set_tristate_value(sym, mod))
1200*53ee8cc1Swenshuai.xi btn_dialog(main_window, setmod_text, 0);
1201*53ee8cc1Swenshuai.xi }
1202*53ee8cc1Swenshuai.xi break;
1203*53ee8cc1Swenshuai.xi case 'n':
1204*53ee8cc1Swenshuai.xi if (item_is_tag('t'))
1205*53ee8cc1Swenshuai.xi sym_set_tristate_value(sym, no);
1206*53ee8cc1Swenshuai.xi break;
1207*53ee8cc1Swenshuai.xi case 'm':
1208*53ee8cc1Swenshuai.xi if (item_is_tag('t'))
1209*53ee8cc1Swenshuai.xi sym_set_tristate_value(sym, mod);
1210*53ee8cc1Swenshuai.xi break;
1211*53ee8cc1Swenshuai.xi }
1212*53ee8cc1Swenshuai.xi }
1213*53ee8cc1Swenshuai.xi }
1214*53ee8cc1Swenshuai.xi
conf_message_callback(const char * fmt,va_list ap)1215*53ee8cc1Swenshuai.xi static void conf_message_callback(const char *fmt, va_list ap)
1216*53ee8cc1Swenshuai.xi {
1217*53ee8cc1Swenshuai.xi char buf[1024];
1218*53ee8cc1Swenshuai.xi
1219*53ee8cc1Swenshuai.xi vsnprintf(buf, sizeof(buf), fmt, ap);
1220*53ee8cc1Swenshuai.xi btn_dialog(main_window, buf, 1, "<OK>");
1221*53ee8cc1Swenshuai.xi }
1222*53ee8cc1Swenshuai.xi
show_help(struct menu * menu)1223*53ee8cc1Swenshuai.xi static void show_help(struct menu *menu)
1224*53ee8cc1Swenshuai.xi {
1225*53ee8cc1Swenshuai.xi struct gstr help = str_new();
1226*53ee8cc1Swenshuai.xi
1227*53ee8cc1Swenshuai.xi if (menu && menu->sym && menu_has_help(menu)) {
1228*53ee8cc1Swenshuai.xi if (menu->sym->name) {
1229*53ee8cc1Swenshuai.xi str_printf(&help, "%s%s:\n\n", CONFIG_, menu->sym->name);
1230*53ee8cc1Swenshuai.xi str_append(&help, _(menu_get_help(menu)));
1231*53ee8cc1Swenshuai.xi str_append(&help, "\n");
1232*53ee8cc1Swenshuai.xi get_symbol_str(&help, menu->sym);
1233*53ee8cc1Swenshuai.xi } else {
1234*53ee8cc1Swenshuai.xi str_append(&help, _(menu_get_help(menu)));
1235*53ee8cc1Swenshuai.xi }
1236*53ee8cc1Swenshuai.xi } else {
1237*53ee8cc1Swenshuai.xi str_append(&help, nohelp_text);
1238*53ee8cc1Swenshuai.xi }
1239*53ee8cc1Swenshuai.xi show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help));
1240*53ee8cc1Swenshuai.xi str_free(&help);
1241*53ee8cc1Swenshuai.xi }
1242*53ee8cc1Swenshuai.xi
conf_choice(struct menu * menu)1243*53ee8cc1Swenshuai.xi static void conf_choice(struct menu *menu)
1244*53ee8cc1Swenshuai.xi {
1245*53ee8cc1Swenshuai.xi const char *prompt = _(menu_get_prompt(menu));
1246*53ee8cc1Swenshuai.xi struct menu *child = 0;
1247*53ee8cc1Swenshuai.xi struct symbol *active;
1248*53ee8cc1Swenshuai.xi int selected_index = 0;
1249*53ee8cc1Swenshuai.xi int last_top_row = 0;
1250*53ee8cc1Swenshuai.xi int res, i = 0;
1251*53ee8cc1Swenshuai.xi struct match_state match_state = {
1252*53ee8cc1Swenshuai.xi .in_search = 0,
1253*53ee8cc1Swenshuai.xi .match_direction = MATCH_TINKER_PATTERN_DOWN,
1254*53ee8cc1Swenshuai.xi .pattern = "",
1255*53ee8cc1Swenshuai.xi };
1256*53ee8cc1Swenshuai.xi
1257*53ee8cc1Swenshuai.xi active = sym_get_choice_value(menu->sym);
1258*53ee8cc1Swenshuai.xi /* this is mostly duplicated from the conf() function. */
1259*53ee8cc1Swenshuai.xi while (!global_exit) {
1260*53ee8cc1Swenshuai.xi reset_menu();
1261*53ee8cc1Swenshuai.xi
1262*53ee8cc1Swenshuai.xi for (i = 0, child = menu->list; child; child = child->next) {
1263*53ee8cc1Swenshuai.xi if (!show_all_items && !menu_is_visible(child))
1264*53ee8cc1Swenshuai.xi continue;
1265*53ee8cc1Swenshuai.xi
1266*53ee8cc1Swenshuai.xi if (child->sym == sym_get_choice_value(menu->sym))
1267*53ee8cc1Swenshuai.xi item_make(child, ':', "<X> %s",
1268*53ee8cc1Swenshuai.xi _(menu_get_prompt(child)));
1269*53ee8cc1Swenshuai.xi else if (child->sym)
1270*53ee8cc1Swenshuai.xi item_make(child, ':', " %s",
1271*53ee8cc1Swenshuai.xi _(menu_get_prompt(child)));
1272*53ee8cc1Swenshuai.xi else
1273*53ee8cc1Swenshuai.xi item_make(child, ':', "*** %s ***",
1274*53ee8cc1Swenshuai.xi _(menu_get_prompt(child)));
1275*53ee8cc1Swenshuai.xi
1276*53ee8cc1Swenshuai.xi if (child->sym == active){
1277*53ee8cc1Swenshuai.xi last_top_row = top_row(curses_menu);
1278*53ee8cc1Swenshuai.xi selected_index = i;
1279*53ee8cc1Swenshuai.xi }
1280*53ee8cc1Swenshuai.xi i++;
1281*53ee8cc1Swenshuai.xi }
1282*53ee8cc1Swenshuai.xi show_menu(prompt ? _(prompt) : _("Choice Menu"),
1283*53ee8cc1Swenshuai.xi _(radiolist_instructions),
1284*53ee8cc1Swenshuai.xi selected_index,
1285*53ee8cc1Swenshuai.xi &last_top_row);
1286*53ee8cc1Swenshuai.xi while (!global_exit) {
1287*53ee8cc1Swenshuai.xi if (match_state.in_search) {
1288*53ee8cc1Swenshuai.xi mvprintw(0, 0, "searching: %s",
1289*53ee8cc1Swenshuai.xi match_state.pattern);
1290*53ee8cc1Swenshuai.xi clrtoeol();
1291*53ee8cc1Swenshuai.xi }
1292*53ee8cc1Swenshuai.xi refresh_all_windows(main_window);
1293*53ee8cc1Swenshuai.xi res = wgetch(menu_win(curses_menu));
1294*53ee8cc1Swenshuai.xi if (!res)
1295*53ee8cc1Swenshuai.xi break;
1296*53ee8cc1Swenshuai.xi if (do_match(res, &match_state, &selected_index) == 0) {
1297*53ee8cc1Swenshuai.xi if (selected_index != -1)
1298*53ee8cc1Swenshuai.xi center_item(selected_index,
1299*53ee8cc1Swenshuai.xi &last_top_row);
1300*53ee8cc1Swenshuai.xi continue;
1301*53ee8cc1Swenshuai.xi }
1302*53ee8cc1Swenshuai.xi if (process_special_keys(
1303*53ee8cc1Swenshuai.xi &res,
1304*53ee8cc1Swenshuai.xi (struct menu *) item_data()))
1305*53ee8cc1Swenshuai.xi break;
1306*53ee8cc1Swenshuai.xi switch (res) {
1307*53ee8cc1Swenshuai.xi case KEY_DOWN:
1308*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_DOWN_ITEM);
1309*53ee8cc1Swenshuai.xi break;
1310*53ee8cc1Swenshuai.xi case KEY_UP:
1311*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_UP_ITEM);
1312*53ee8cc1Swenshuai.xi break;
1313*53ee8cc1Swenshuai.xi case KEY_NPAGE:
1314*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_SCR_DPAGE);
1315*53ee8cc1Swenshuai.xi break;
1316*53ee8cc1Swenshuai.xi case KEY_PPAGE:
1317*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_SCR_UPAGE);
1318*53ee8cc1Swenshuai.xi break;
1319*53ee8cc1Swenshuai.xi case KEY_HOME:
1320*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_FIRST_ITEM);
1321*53ee8cc1Swenshuai.xi break;
1322*53ee8cc1Swenshuai.xi case KEY_END:
1323*53ee8cc1Swenshuai.xi menu_driver(curses_menu, REQ_LAST_ITEM);
1324*53ee8cc1Swenshuai.xi break;
1325*53ee8cc1Swenshuai.xi case 'h':
1326*53ee8cc1Swenshuai.xi case '?':
1327*53ee8cc1Swenshuai.xi show_help((struct menu *) item_data());
1328*53ee8cc1Swenshuai.xi break;
1329*53ee8cc1Swenshuai.xi }
1330*53ee8cc1Swenshuai.xi if (res == 10 || res == 27 || res == ' ' ||
1331*53ee8cc1Swenshuai.xi res == KEY_LEFT){
1332*53ee8cc1Swenshuai.xi break;
1333*53ee8cc1Swenshuai.xi }
1334*53ee8cc1Swenshuai.xi refresh_all_windows(main_window);
1335*53ee8cc1Swenshuai.xi }
1336*53ee8cc1Swenshuai.xi /* if ESC or left */
1337*53ee8cc1Swenshuai.xi if (res == 27 || res == KEY_LEFT)
1338*53ee8cc1Swenshuai.xi break;
1339*53ee8cc1Swenshuai.xi
1340*53ee8cc1Swenshuai.xi child = item_data();
1341*53ee8cc1Swenshuai.xi if (!child || !menu_is_visible(child) || !child->sym)
1342*53ee8cc1Swenshuai.xi continue;
1343*53ee8cc1Swenshuai.xi switch (res) {
1344*53ee8cc1Swenshuai.xi case ' ':
1345*53ee8cc1Swenshuai.xi case 10:
1346*53ee8cc1Swenshuai.xi case KEY_RIGHT:
1347*53ee8cc1Swenshuai.xi sym_set_tristate_value(child->sym, yes);
1348*53ee8cc1Swenshuai.xi return;
1349*53ee8cc1Swenshuai.xi case 'h':
1350*53ee8cc1Swenshuai.xi case '?':
1351*53ee8cc1Swenshuai.xi show_help(child);
1352*53ee8cc1Swenshuai.xi active = child->sym;
1353*53ee8cc1Swenshuai.xi break;
1354*53ee8cc1Swenshuai.xi case KEY_EXIT:
1355*53ee8cc1Swenshuai.xi return;
1356*53ee8cc1Swenshuai.xi }
1357*53ee8cc1Swenshuai.xi }
1358*53ee8cc1Swenshuai.xi }
1359*53ee8cc1Swenshuai.xi
conf_string(struct menu * menu)1360*53ee8cc1Swenshuai.xi static void conf_string(struct menu *menu)
1361*53ee8cc1Swenshuai.xi {
1362*53ee8cc1Swenshuai.xi const char *prompt = menu_get_prompt(menu);
1363*53ee8cc1Swenshuai.xi char dialog_input_result[256];
1364*53ee8cc1Swenshuai.xi
1365*53ee8cc1Swenshuai.xi while (1) {
1366*53ee8cc1Swenshuai.xi int res;
1367*53ee8cc1Swenshuai.xi const char *heading;
1368*53ee8cc1Swenshuai.xi
1369*53ee8cc1Swenshuai.xi switch (sym_get_type(menu->sym)) {
1370*53ee8cc1Swenshuai.xi case S_INT:
1371*53ee8cc1Swenshuai.xi heading = _(inputbox_instructions_int);
1372*53ee8cc1Swenshuai.xi break;
1373*53ee8cc1Swenshuai.xi case S_HEX:
1374*53ee8cc1Swenshuai.xi heading = _(inputbox_instructions_hex);
1375*53ee8cc1Swenshuai.xi break;
1376*53ee8cc1Swenshuai.xi case S_STRING:
1377*53ee8cc1Swenshuai.xi heading = _(inputbox_instructions_string);
1378*53ee8cc1Swenshuai.xi break;
1379*53ee8cc1Swenshuai.xi default:
1380*53ee8cc1Swenshuai.xi heading = _("Internal nconf error!");
1381*53ee8cc1Swenshuai.xi }
1382*53ee8cc1Swenshuai.xi res = dialog_inputbox(main_window,
1383*53ee8cc1Swenshuai.xi prompt ? _(prompt) : _("Main Menu"),
1384*53ee8cc1Swenshuai.xi heading,
1385*53ee8cc1Swenshuai.xi sym_get_string_value(menu->sym),
1386*53ee8cc1Swenshuai.xi dialog_input_result,
1387*53ee8cc1Swenshuai.xi sizeof(dialog_input_result));
1388*53ee8cc1Swenshuai.xi switch (res) {
1389*53ee8cc1Swenshuai.xi case 0:
1390*53ee8cc1Swenshuai.xi if (sym_set_string_value(menu->sym,
1391*53ee8cc1Swenshuai.xi dialog_input_result))
1392*53ee8cc1Swenshuai.xi return;
1393*53ee8cc1Swenshuai.xi btn_dialog(main_window,
1394*53ee8cc1Swenshuai.xi _("You have made an invalid entry."), 0);
1395*53ee8cc1Swenshuai.xi break;
1396*53ee8cc1Swenshuai.xi case 1:
1397*53ee8cc1Swenshuai.xi show_help(menu);
1398*53ee8cc1Swenshuai.xi break;
1399*53ee8cc1Swenshuai.xi case KEY_EXIT:
1400*53ee8cc1Swenshuai.xi return;
1401*53ee8cc1Swenshuai.xi }
1402*53ee8cc1Swenshuai.xi }
1403*53ee8cc1Swenshuai.xi }
1404*53ee8cc1Swenshuai.xi
conf_load(void)1405*53ee8cc1Swenshuai.xi static void conf_load(void)
1406*53ee8cc1Swenshuai.xi {
1407*53ee8cc1Swenshuai.xi char dialog_input_result[256];
1408*53ee8cc1Swenshuai.xi while (1) {
1409*53ee8cc1Swenshuai.xi int res;
1410*53ee8cc1Swenshuai.xi res = dialog_inputbox(main_window,
1411*53ee8cc1Swenshuai.xi NULL, load_config_text,
1412*53ee8cc1Swenshuai.xi filename,
1413*53ee8cc1Swenshuai.xi dialog_input_result,
1414*53ee8cc1Swenshuai.xi sizeof(dialog_input_result));
1415*53ee8cc1Swenshuai.xi switch (res) {
1416*53ee8cc1Swenshuai.xi case 0:
1417*53ee8cc1Swenshuai.xi if (!dialog_input_result[0])
1418*53ee8cc1Swenshuai.xi return;
1419*53ee8cc1Swenshuai.xi if (!conf_read(dialog_input_result)) {
1420*53ee8cc1Swenshuai.xi set_config_filename(dialog_input_result);
1421*53ee8cc1Swenshuai.xi sym_set_change_count(1);
1422*53ee8cc1Swenshuai.xi return;
1423*53ee8cc1Swenshuai.xi }
1424*53ee8cc1Swenshuai.xi btn_dialog(main_window, _("File does not exist!"), 0);
1425*53ee8cc1Swenshuai.xi break;
1426*53ee8cc1Swenshuai.xi case 1:
1427*53ee8cc1Swenshuai.xi show_scroll_win(main_window,
1428*53ee8cc1Swenshuai.xi _("Load Alternate Configuration"),
1429*53ee8cc1Swenshuai.xi load_config_help);
1430*53ee8cc1Swenshuai.xi break;
1431*53ee8cc1Swenshuai.xi case KEY_EXIT:
1432*53ee8cc1Swenshuai.xi return;
1433*53ee8cc1Swenshuai.xi }
1434*53ee8cc1Swenshuai.xi }
1435*53ee8cc1Swenshuai.xi }
1436*53ee8cc1Swenshuai.xi
conf_save(void)1437*53ee8cc1Swenshuai.xi static void conf_save(void)
1438*53ee8cc1Swenshuai.xi {
1439*53ee8cc1Swenshuai.xi char dialog_input_result[256];
1440*53ee8cc1Swenshuai.xi while (1) {
1441*53ee8cc1Swenshuai.xi int res;
1442*53ee8cc1Swenshuai.xi res = dialog_inputbox(main_window,
1443*53ee8cc1Swenshuai.xi NULL, save_config_text,
1444*53ee8cc1Swenshuai.xi filename,
1445*53ee8cc1Swenshuai.xi dialog_input_result,
1446*53ee8cc1Swenshuai.xi sizeof(dialog_input_result));
1447*53ee8cc1Swenshuai.xi switch (res) {
1448*53ee8cc1Swenshuai.xi case 0:
1449*53ee8cc1Swenshuai.xi if (!dialog_input_result[0])
1450*53ee8cc1Swenshuai.xi return;
1451*53ee8cc1Swenshuai.xi res = conf_write(dialog_input_result);
1452*53ee8cc1Swenshuai.xi if (!res) {
1453*53ee8cc1Swenshuai.xi set_config_filename(dialog_input_result);
1454*53ee8cc1Swenshuai.xi return;
1455*53ee8cc1Swenshuai.xi }
1456*53ee8cc1Swenshuai.xi btn_dialog(main_window, _("Can't create file! "
1457*53ee8cc1Swenshuai.xi "Probably a nonexistent directory."),
1458*53ee8cc1Swenshuai.xi 1, "<OK>");
1459*53ee8cc1Swenshuai.xi break;
1460*53ee8cc1Swenshuai.xi case 1:
1461*53ee8cc1Swenshuai.xi show_scroll_win(main_window,
1462*53ee8cc1Swenshuai.xi _("Save Alternate Configuration"),
1463*53ee8cc1Swenshuai.xi save_config_help);
1464*53ee8cc1Swenshuai.xi break;
1465*53ee8cc1Swenshuai.xi case KEY_EXIT:
1466*53ee8cc1Swenshuai.xi return;
1467*53ee8cc1Swenshuai.xi }
1468*53ee8cc1Swenshuai.xi }
1469*53ee8cc1Swenshuai.xi }
1470*53ee8cc1Swenshuai.xi
setup_windows(void)1471*53ee8cc1Swenshuai.xi void setup_windows(void)
1472*53ee8cc1Swenshuai.xi {
1473*53ee8cc1Swenshuai.xi if (main_window != NULL)
1474*53ee8cc1Swenshuai.xi delwin(main_window);
1475*53ee8cc1Swenshuai.xi
1476*53ee8cc1Swenshuai.xi /* set up the menu and menu window */
1477*53ee8cc1Swenshuai.xi main_window = newwin(LINES-2, COLS-2, 2, 1);
1478*53ee8cc1Swenshuai.xi keypad(main_window, TRUE);
1479*53ee8cc1Swenshuai.xi mwin_max_lines = LINES-7;
1480*53ee8cc1Swenshuai.xi mwin_max_cols = COLS-6;
1481*53ee8cc1Swenshuai.xi
1482*53ee8cc1Swenshuai.xi /* panels order is from bottom to top */
1483*53ee8cc1Swenshuai.xi new_panel(main_window);
1484*53ee8cc1Swenshuai.xi }
1485*53ee8cc1Swenshuai.xi
main(int ac,char ** av)1486*53ee8cc1Swenshuai.xi int main(int ac, char **av)
1487*53ee8cc1Swenshuai.xi {
1488*53ee8cc1Swenshuai.xi char *mode;
1489*53ee8cc1Swenshuai.xi
1490*53ee8cc1Swenshuai.xi setlocale(LC_ALL, "");
1491*53ee8cc1Swenshuai.xi bindtextdomain(PACKAGE, LOCALEDIR);
1492*53ee8cc1Swenshuai.xi textdomain(PACKAGE);
1493*53ee8cc1Swenshuai.xi
1494*53ee8cc1Swenshuai.xi conf_parse(av[1]);
1495*53ee8cc1Swenshuai.xi conf_read(NULL);
1496*53ee8cc1Swenshuai.xi
1497*53ee8cc1Swenshuai.xi mode = getenv("NCONFIG_MODE");
1498*53ee8cc1Swenshuai.xi if (mode) {
1499*53ee8cc1Swenshuai.xi if (!strcasecmp(mode, "single_menu"))
1500*53ee8cc1Swenshuai.xi single_menu_mode = 1;
1501*53ee8cc1Swenshuai.xi }
1502*53ee8cc1Swenshuai.xi
1503*53ee8cc1Swenshuai.xi /* Initialize curses */
1504*53ee8cc1Swenshuai.xi initscr();
1505*53ee8cc1Swenshuai.xi /* set color theme */
1506*53ee8cc1Swenshuai.xi set_colors();
1507*53ee8cc1Swenshuai.xi
1508*53ee8cc1Swenshuai.xi cbreak();
1509*53ee8cc1Swenshuai.xi noecho();
1510*53ee8cc1Swenshuai.xi keypad(stdscr, TRUE);
1511*53ee8cc1Swenshuai.xi curs_set(0);
1512*53ee8cc1Swenshuai.xi
1513*53ee8cc1Swenshuai.xi if (COLS < 75 || LINES < 20) {
1514*53ee8cc1Swenshuai.xi endwin();
1515*53ee8cc1Swenshuai.xi printf("Your terminal should have at "
1516*53ee8cc1Swenshuai.xi "least 20 lines and 75 columns\n");
1517*53ee8cc1Swenshuai.xi return 1;
1518*53ee8cc1Swenshuai.xi }
1519*53ee8cc1Swenshuai.xi
1520*53ee8cc1Swenshuai.xi notimeout(stdscr, FALSE);
1521*53ee8cc1Swenshuai.xi ESCDELAY = 1;
1522*53ee8cc1Swenshuai.xi
1523*53ee8cc1Swenshuai.xi /* set btns menu */
1524*53ee8cc1Swenshuai.xi curses_menu = new_menu(curses_menu_items);
1525*53ee8cc1Swenshuai.xi menu_opts_off(curses_menu, O_SHOWDESC);
1526*53ee8cc1Swenshuai.xi menu_opts_on(curses_menu, O_SHOWMATCH);
1527*53ee8cc1Swenshuai.xi menu_opts_on(curses_menu, O_ONEVALUE);
1528*53ee8cc1Swenshuai.xi menu_opts_on(curses_menu, O_NONCYCLIC);
1529*53ee8cc1Swenshuai.xi menu_opts_on(curses_menu, O_IGNORECASE);
1530*53ee8cc1Swenshuai.xi set_menu_mark(curses_menu, " ");
1531*53ee8cc1Swenshuai.xi set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]);
1532*53ee8cc1Swenshuai.xi set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]);
1533*53ee8cc1Swenshuai.xi set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]);
1534*53ee8cc1Swenshuai.xi
1535*53ee8cc1Swenshuai.xi set_config_filename(conf_get_configname());
1536*53ee8cc1Swenshuai.xi setup_windows();
1537*53ee8cc1Swenshuai.xi
1538*53ee8cc1Swenshuai.xi /* check for KEY_FUNC(1) */
1539*53ee8cc1Swenshuai.xi if (has_key(KEY_F(1)) == FALSE) {
1540*53ee8cc1Swenshuai.xi show_scroll_win(main_window,
1541*53ee8cc1Swenshuai.xi _("Instructions"),
1542*53ee8cc1Swenshuai.xi _(menu_no_f_instructions));
1543*53ee8cc1Swenshuai.xi }
1544*53ee8cc1Swenshuai.xi
1545*53ee8cc1Swenshuai.xi conf_set_message_callback(conf_message_callback);
1546*53ee8cc1Swenshuai.xi /* do the work */
1547*53ee8cc1Swenshuai.xi while (!global_exit) {
1548*53ee8cc1Swenshuai.xi conf(&rootmenu);
1549*53ee8cc1Swenshuai.xi if (!global_exit && do_exit() == 0)
1550*53ee8cc1Swenshuai.xi break;
1551*53ee8cc1Swenshuai.xi }
1552*53ee8cc1Swenshuai.xi /* ok, we are done */
1553*53ee8cc1Swenshuai.xi unpost_menu(curses_menu);
1554*53ee8cc1Swenshuai.xi free_menu(curses_menu);
1555*53ee8cc1Swenshuai.xi delwin(main_window);
1556*53ee8cc1Swenshuai.xi clear();
1557*53ee8cc1Swenshuai.xi refresh();
1558*53ee8cc1Swenshuai.xi endwin();
1559*53ee8cc1Swenshuai.xi return 0;
1560*53ee8cc1Swenshuai.xi }
1561*53ee8cc1Swenshuai.xi
1562