xref: /linux/scripts/kconfig/nconf.c (revision 866af407dad3f2202e5d5d717ebd6156ccc33cdd)
1692d97c3Snir.tzachar@gmail.com /*
2692d97c3Snir.tzachar@gmail.com  * Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
3692d97c3Snir.tzachar@gmail.com  * Released under the terms of the GNU GPL v2.0.
4692d97c3Snir.tzachar@gmail.com  *
5692d97c3Snir.tzachar@gmail.com  * Derived from menuconfig.
6692d97c3Snir.tzachar@gmail.com  *
7692d97c3Snir.tzachar@gmail.com  */
8692d97c3Snir.tzachar@gmail.com #define LKC_DIRECT_LINK
9692d97c3Snir.tzachar@gmail.com #include "lkc.h"
10692d97c3Snir.tzachar@gmail.com #include "nconf.h"
11692d97c3Snir.tzachar@gmail.com 
12692d97c3Snir.tzachar@gmail.com static const char nconf_readme[] = N_(
13692d97c3Snir.tzachar@gmail.com "Overview\n"
14692d97c3Snir.tzachar@gmail.com "--------\n"
15692d97c3Snir.tzachar@gmail.com "Some kernel features may be built directly into the kernel.\n"
16692d97c3Snir.tzachar@gmail.com "Some may be made into loadable runtime modules.  Some features\n"
17692d97c3Snir.tzachar@gmail.com "may be completely removed altogether.  There are also certain\n"
18692d97c3Snir.tzachar@gmail.com "kernel parameters which are not really features, but must be\n"
19692d97c3Snir.tzachar@gmail.com "entered in as decimal or hexadecimal numbers or possibly text.\n"
20692d97c3Snir.tzachar@gmail.com "\n"
21692d97c3Snir.tzachar@gmail.com "Menu items beginning with following braces represent features that\n"
22692d97c3Snir.tzachar@gmail.com "  [ ] can be built in or removed\n"
23692d97c3Snir.tzachar@gmail.com "  < > can be built in, modularized or removed\n"
24692d97c3Snir.tzachar@gmail.com "  { } can be built in or modularized (selected by other feature)\n"
25692d97c3Snir.tzachar@gmail.com "  - - are selected by other feature,\n"
26692d97c3Snir.tzachar@gmail.com "  XXX cannot be selected. use Symbol Info to find out why,\n"
27692d97c3Snir.tzachar@gmail.com "while *, M or whitespace inside braces means to build in, build as\n"
28692d97c3Snir.tzachar@gmail.com "a module or to exclude the feature respectively.\n"
29692d97c3Snir.tzachar@gmail.com "\n"
30692d97c3Snir.tzachar@gmail.com "To change any of these features, highlight it with the cursor\n"
31692d97c3Snir.tzachar@gmail.com "keys and press <Y> to build it in, <M> to make it a module or\n"
32692d97c3Snir.tzachar@gmail.com "<N> to removed it.  You may also press the <Space Bar> to cycle\n"
33692d97c3Snir.tzachar@gmail.com "through the available options (ie. Y->N->M->Y).\n"
34692d97c3Snir.tzachar@gmail.com "\n"
35692d97c3Snir.tzachar@gmail.com "Some additional keyboard hints:\n"
36692d97c3Snir.tzachar@gmail.com "\n"
37692d97c3Snir.tzachar@gmail.com "Menus\n"
38692d97c3Snir.tzachar@gmail.com "----------\n"
39692d97c3Snir.tzachar@gmail.com "o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
40692d97c3Snir.tzachar@gmail.com "   you wish to change use <Enter> or <Space>. Goto submenu by \n"
41692d97c3Snir.tzachar@gmail.com "   pressing <Enter> of <right-arrow>. Use <Esc> or <left-arrow> to go back.\n"
42692d97c3Snir.tzachar@gmail.com "   Submenus are designated by \"--->\".\n"
43692d97c3Snir.tzachar@gmail.com "\n"
44692d97c3Snir.tzachar@gmail.com "   Shortcut: Press the option's highlighted letter (hotkey).\n"
45692d97c3Snir.tzachar@gmail.com "             Pressing a hotkey more than once will sequence\n"
46692d97c3Snir.tzachar@gmail.com "             through all visible items which use that hotkey.\n"
47692d97c3Snir.tzachar@gmail.com "\n"
48692d97c3Snir.tzachar@gmail.com "   You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
49692d97c3Snir.tzachar@gmail.com "   unseen options into view.\n"
50692d97c3Snir.tzachar@gmail.com "\n"
51692d97c3Snir.tzachar@gmail.com "o  To exit a menu use the just press <ESC> <F5> <F8> or <left-arrow>.\n"
52692d97c3Snir.tzachar@gmail.com "\n"
53692d97c3Snir.tzachar@gmail.com "o  To get help with an item, press <F1>\n"
54692d97c3Snir.tzachar@gmail.com "   Shortcut: Press <h> or <?>.\n"
55692d97c3Snir.tzachar@gmail.com "\n"
56692d97c3Snir.tzachar@gmail.com "\n"
57692d97c3Snir.tzachar@gmail.com "Radiolists  (Choice lists)\n"
58692d97c3Snir.tzachar@gmail.com "-----------\n"
59692d97c3Snir.tzachar@gmail.com "o  Use the cursor keys to select the option you wish to set and press\n"
60692d97c3Snir.tzachar@gmail.com "   <S> or the <SPACE BAR>.\n"
61692d97c3Snir.tzachar@gmail.com "\n"
62692d97c3Snir.tzachar@gmail.com "   Shortcut: Press the first letter of the option you wish to set then\n"
63692d97c3Snir.tzachar@gmail.com "             press <S> or <SPACE BAR>.\n"
64692d97c3Snir.tzachar@gmail.com "\n"
65692d97c3Snir.tzachar@gmail.com "o  To see available help for the item, press <F1>\n"
66692d97c3Snir.tzachar@gmail.com "   Shortcut: Press <H> or <?>.\n"
67692d97c3Snir.tzachar@gmail.com "\n"
68692d97c3Snir.tzachar@gmail.com "\n"
69692d97c3Snir.tzachar@gmail.com "Data Entry\n"
70692d97c3Snir.tzachar@gmail.com "-----------\n"
71692d97c3Snir.tzachar@gmail.com "o  Enter the requested information and press <ENTER>\n"
72692d97c3Snir.tzachar@gmail.com "   If you are entering hexadecimal values, it is not necessary to\n"
73692d97c3Snir.tzachar@gmail.com "   add the '0x' prefix to the entry.\n"
74692d97c3Snir.tzachar@gmail.com "\n"
75692d97c3Snir.tzachar@gmail.com "o  For help, press <F1>.\n"
76692d97c3Snir.tzachar@gmail.com "\n"
77692d97c3Snir.tzachar@gmail.com "\n"
78692d97c3Snir.tzachar@gmail.com "Text Box    (Help Window)\n"
79692d97c3Snir.tzachar@gmail.com "--------\n"
80692d97c3Snir.tzachar@gmail.com "o  Use the cursor keys to scroll up/down/left/right.  The VI editor\n"
81692d97c3Snir.tzachar@gmail.com "   keys h,j,k,l function here as do <SPACE BAR> for those\n"
82692d97c3Snir.tzachar@gmail.com "   who are familiar with less and lynx.\n"
83692d97c3Snir.tzachar@gmail.com "\n"
84692d97c3Snir.tzachar@gmail.com "o  Press <Enter>, <F1>, <F5>, <F7> or <Esc> to exit.\n"
85692d97c3Snir.tzachar@gmail.com "\n"
86692d97c3Snir.tzachar@gmail.com "\n"
87692d97c3Snir.tzachar@gmail.com "Alternate Configuration Files\n"
88692d97c3Snir.tzachar@gmail.com "-----------------------------\n"
89692d97c3Snir.tzachar@gmail.com "nconfig supports the use of alternate configuration files for\n"
90692d97c3Snir.tzachar@gmail.com "those who, for various reasons, find it necessary to switch\n"
91692d97c3Snir.tzachar@gmail.com "between different kernel configurations.\n"
92692d97c3Snir.tzachar@gmail.com "\n"
93692d97c3Snir.tzachar@gmail.com "At the end of the main menu you will find two options.  One is\n"
94692d97c3Snir.tzachar@gmail.com "for saving the current configuration to a file of your choosing.\n"
95692d97c3Snir.tzachar@gmail.com "The other option is for loading a previously saved alternate\n"
96692d97c3Snir.tzachar@gmail.com "configuration.\n"
97692d97c3Snir.tzachar@gmail.com "\n"
98692d97c3Snir.tzachar@gmail.com "Even if you don't use alternate configuration files, but you\n"
99692d97c3Snir.tzachar@gmail.com "find during a nconfig session that you have completely messed\n"
100692d97c3Snir.tzachar@gmail.com "up your settings, you may use the \"Load Alternate...\" option to\n"
101692d97c3Snir.tzachar@gmail.com "restore your previously saved settings from \".config\" without\n"
102692d97c3Snir.tzachar@gmail.com "restarting nconfig.\n"
103692d97c3Snir.tzachar@gmail.com "\n"
104692d97c3Snir.tzachar@gmail.com "Other information\n"
105692d97c3Snir.tzachar@gmail.com "-----------------\n"
106692d97c3Snir.tzachar@gmail.com "If you use nconfig in an XTERM window make sure you have your\n"
107692d97c3Snir.tzachar@gmail.com "$TERM variable set to point to a xterm definition which supports color.\n"
108692d97c3Snir.tzachar@gmail.com "Otherwise, nconfig will look rather bad.  nconfig will not\n"
109692d97c3Snir.tzachar@gmail.com "display correctly in a RXVT window because rxvt displays only one\n"
110692d97c3Snir.tzachar@gmail.com "intensity of color, bright.\n"
111692d97c3Snir.tzachar@gmail.com "\n"
112692d97c3Snir.tzachar@gmail.com "nconfig will display larger menus on screens or xterms which are\n"
113692d97c3Snir.tzachar@gmail.com "set to display more than the standard 25 row by 80 column geometry.\n"
114692d97c3Snir.tzachar@gmail.com "In order for this to work, the \"stty size\" command must be able to\n"
115692d97c3Snir.tzachar@gmail.com "display the screen's current row and column geometry.  I STRONGLY\n"
116692d97c3Snir.tzachar@gmail.com "RECOMMEND that you make sure you do NOT have the shell variables\n"
117692d97c3Snir.tzachar@gmail.com "LINES and COLUMNS exported into your environment.  Some distributions\n"
118692d97c3Snir.tzachar@gmail.com "export those variables via /etc/profile.  Some ncurses programs can\n"
119692d97c3Snir.tzachar@gmail.com "become confused when those variables (LINES & COLUMNS) don't reflect\n"
120692d97c3Snir.tzachar@gmail.com "the true screen size.\n"
121692d97c3Snir.tzachar@gmail.com "\n"
122692d97c3Snir.tzachar@gmail.com "Optional personality available\n"
123692d97c3Snir.tzachar@gmail.com "------------------------------\n"
124692d97c3Snir.tzachar@gmail.com "If you prefer to have all of the kernel options listed in a single\n"
125692d97c3Snir.tzachar@gmail.com "menu, rather than the default multimenu hierarchy, run the nconfig\n"
126692d97c3Snir.tzachar@gmail.com "with NCONFIG_MODE environment variable set to single_menu. Example:\n"
127692d97c3Snir.tzachar@gmail.com "\n"
128692d97c3Snir.tzachar@gmail.com "make NCONFIG_MODE=single_menu nconfig\n"
129692d97c3Snir.tzachar@gmail.com "\n"
130692d97c3Snir.tzachar@gmail.com "<Enter> will then unroll the appropriate category, or enfold it if it\n"
131692d97c3Snir.tzachar@gmail.com "is already unrolled.\n"
132692d97c3Snir.tzachar@gmail.com "\n"
133692d97c3Snir.tzachar@gmail.com "Note that this mode can eventually be a little more CPU expensive\n"
134692d97c3Snir.tzachar@gmail.com "(especially with a larger number of unrolled categories) than the\n"
135692d97c3Snir.tzachar@gmail.com "default mode.\n"
136692d97c3Snir.tzachar@gmail.com "\n"),
137692d97c3Snir.tzachar@gmail.com menu_no_f_instructions[] = N_(
138692d97c3Snir.tzachar@gmail.com " You do not have function keys support. Please follow the\n"
139692d97c3Snir.tzachar@gmail.com " following instructions:\n"
140692d97c3Snir.tzachar@gmail.com " Arrow keys navigate the menu.\n"
141692d97c3Snir.tzachar@gmail.com " <Enter> or <right-arrow> selects submenus --->.\n"
142692d97c3Snir.tzachar@gmail.com " Capital Letters are hotkeys.\n"
143692d97c3Snir.tzachar@gmail.com " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
144692d97c3Snir.tzachar@gmail.com " Pressing SpaceBar toggles between the above options\n"
145692d97c3Snir.tzachar@gmail.com " Press <Esc> or <left-arrow> to go back one menu, \n"
146692d97c3Snir.tzachar@gmail.com " <?> or <h> for Help, </> for Search.\n"
147692d97c3Snir.tzachar@gmail.com " <1> is interchangable with <F1>, <2> with <F2>, etc.\n"
148692d97c3Snir.tzachar@gmail.com " Legend: [*] built-in  [ ] excluded  <M> module  < > module capable.\n"
149692d97c3Snir.tzachar@gmail.com " <Esc> always leaves the current window\n"),
150692d97c3Snir.tzachar@gmail.com menu_instructions[] = N_(
151692d97c3Snir.tzachar@gmail.com " Arrow keys navigate the menu.\n"
152692d97c3Snir.tzachar@gmail.com " <Enter> or <right-arrow> selects submenus --->.\n"
153692d97c3Snir.tzachar@gmail.com " Capital Letters are hotkeys.\n"
154692d97c3Snir.tzachar@gmail.com " Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
155692d97c3Snir.tzachar@gmail.com " Pressing SpaceBar toggles between the above options\n"
156692d97c3Snir.tzachar@gmail.com " Press <Esc>, <F3> or <left-arrow> to go back one menu, \n"
157692d97c3Snir.tzachar@gmail.com " <?>, <F1> or <h> for Help, </> for Search.\n"
158692d97c3Snir.tzachar@gmail.com " <1> is interchangable with <F1>, <2> with <F2>, etc.\n"
159692d97c3Snir.tzachar@gmail.com " Legend: [*] built-in  [ ] excluded  <M> module  < > module capable.\n"
160692d97c3Snir.tzachar@gmail.com " <Esc> always leaves the current window\n"),
161692d97c3Snir.tzachar@gmail.com radiolist_instructions[] = N_(
162692d97c3Snir.tzachar@gmail.com " Use the arrow keys to navigate this window or\n"
163692d97c3Snir.tzachar@gmail.com " press the hotkey of the item you wish to select\n"
164692d97c3Snir.tzachar@gmail.com " followed by the <SPACE BAR>.\n"
165692d97c3Snir.tzachar@gmail.com " Press <?>, <F1> or <h> for additional information about this option.\n"),
166692d97c3Snir.tzachar@gmail.com inputbox_instructions_int[] = N_(
167692d97c3Snir.tzachar@gmail.com "Please enter a decimal value.\n"
168692d97c3Snir.tzachar@gmail.com "Fractions will not be accepted.\n"
169692d97c3Snir.tzachar@gmail.com "Press <RETURN> to accept, <ESC> to cancel."),
170692d97c3Snir.tzachar@gmail.com inputbox_instructions_hex[] = N_(
171692d97c3Snir.tzachar@gmail.com "Please enter a hexadecimal value.\n"
172692d97c3Snir.tzachar@gmail.com "Press <RETURN> to accept, <ESC> to cancel."),
173692d97c3Snir.tzachar@gmail.com inputbox_instructions_string[] = N_(
174692d97c3Snir.tzachar@gmail.com "Please enter a string value.\n"
175692d97c3Snir.tzachar@gmail.com "Press <RETURN> to accept, <ESC> to cancel."),
176692d97c3Snir.tzachar@gmail.com setmod_text[] = N_(
177692d97c3Snir.tzachar@gmail.com "This feature depends on another which\n"
178692d97c3Snir.tzachar@gmail.com "has been configured as a module.\n"
179692d97c3Snir.tzachar@gmail.com "As a result, this feature will be built as a module."),
180692d97c3Snir.tzachar@gmail.com nohelp_text[] = N_(
181692d97c3Snir.tzachar@gmail.com "There is no help available for this kernel option.\n"),
182692d97c3Snir.tzachar@gmail.com load_config_text[] = N_(
183692d97c3Snir.tzachar@gmail.com "Enter the name of the configuration file you wish to load.\n"
184692d97c3Snir.tzachar@gmail.com "Accept the name shown to restore the configuration you\n"
185692d97c3Snir.tzachar@gmail.com "last retrieved.  Leave blank to abort."),
186692d97c3Snir.tzachar@gmail.com load_config_help[] = N_(
187692d97c3Snir.tzachar@gmail.com "\n"
188692d97c3Snir.tzachar@gmail.com "For various reasons, one may wish to keep several different kernel\n"
189692d97c3Snir.tzachar@gmail.com "configurations available on a single machine.\n"
190692d97c3Snir.tzachar@gmail.com "\n"
191692d97c3Snir.tzachar@gmail.com "If you have saved a previous configuration in a file other than the\n"
192692d97c3Snir.tzachar@gmail.com "kernel's default, entering the name of the file here will allow you\n"
193692d97c3Snir.tzachar@gmail.com "to modify that configuration.\n"
194692d97c3Snir.tzachar@gmail.com "\n"
195692d97c3Snir.tzachar@gmail.com "If you are uncertain, then you have probably never used alternate\n"
196692d97c3Snir.tzachar@gmail.com "configuration files.  You should therefor leave this blank to abort.\n"),
197692d97c3Snir.tzachar@gmail.com save_config_text[] = N_(
198692d97c3Snir.tzachar@gmail.com "Enter a filename to which this configuration should be saved\n"
199692d97c3Snir.tzachar@gmail.com "as an alternate.  Leave blank to abort."),
200692d97c3Snir.tzachar@gmail.com save_config_help[] = N_(
201692d97c3Snir.tzachar@gmail.com "\n"
202692d97c3Snir.tzachar@gmail.com "For various reasons, one may wish to keep different kernel\n"
203692d97c3Snir.tzachar@gmail.com "configurations available on a single machine.\n"
204692d97c3Snir.tzachar@gmail.com "\n"
205692d97c3Snir.tzachar@gmail.com "Entering a file name here will allow you to later retrieve, modify\n"
206692d97c3Snir.tzachar@gmail.com "and use the current configuration as an alternate to whatever\n"
207692d97c3Snir.tzachar@gmail.com "configuration options you have selected at that time.\n"
208692d97c3Snir.tzachar@gmail.com "\n"
209692d97c3Snir.tzachar@gmail.com "If you are uncertain what all this means then you should probably\n"
210692d97c3Snir.tzachar@gmail.com "leave this blank.\n"),
211692d97c3Snir.tzachar@gmail.com search_help[] = N_(
212692d97c3Snir.tzachar@gmail.com "\n"
213692d97c3Snir.tzachar@gmail.com "Search for CONFIG_ symbols and display their relations.\n"
214692d97c3Snir.tzachar@gmail.com "Regular expressions are allowed.\n"
215692d97c3Snir.tzachar@gmail.com "Example: search for \"^FOO\"\n"
216692d97c3Snir.tzachar@gmail.com "Result:\n"
217692d97c3Snir.tzachar@gmail.com "-----------------------------------------------------------------\n"
218692d97c3Snir.tzachar@gmail.com "Symbol: FOO [ = m]\n"
219692d97c3Snir.tzachar@gmail.com "Prompt: Foo bus is used to drive the bar HW\n"
220692d97c3Snir.tzachar@gmail.com "Defined at drivers/pci/Kconfig:47\n"
221692d97c3Snir.tzachar@gmail.com "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
222692d97c3Snir.tzachar@gmail.com "Location:\n"
223692d97c3Snir.tzachar@gmail.com "  -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
224692d97c3Snir.tzachar@gmail.com "    -> PCI support (PCI [ = y])\n"
225692d97c3Snir.tzachar@gmail.com "      -> PCI access mode (<choice> [ = y])\n"
226692d97c3Snir.tzachar@gmail.com "Selects: LIBCRC32\n"
227692d97c3Snir.tzachar@gmail.com "Selected by: BAR\n"
228692d97c3Snir.tzachar@gmail.com "-----------------------------------------------------------------\n"
229692d97c3Snir.tzachar@gmail.com "o The line 'Prompt:' shows the text used in the menu structure for\n"
230692d97c3Snir.tzachar@gmail.com "  this CONFIG_ symbol\n"
231692d97c3Snir.tzachar@gmail.com "o The 'Defined at' line tell at what file / line number the symbol\n"
232692d97c3Snir.tzachar@gmail.com "  is defined\n"
233692d97c3Snir.tzachar@gmail.com "o The 'Depends on:' line tell what symbols needs to be defined for\n"
234692d97c3Snir.tzachar@gmail.com "  this symbol to be visible in the menu (selectable)\n"
235692d97c3Snir.tzachar@gmail.com "o The 'Location:' lines tell where in the menu structure this symbol\n"
236692d97c3Snir.tzachar@gmail.com "  is located\n"
237692d97c3Snir.tzachar@gmail.com "    A location followed by a [ = y] indicate that this is a selectable\n"
238692d97c3Snir.tzachar@gmail.com "    menu item - and current value is displayed inside brackets.\n"
239692d97c3Snir.tzachar@gmail.com "o The 'Selects:' line tell what symbol will be automatically\n"
240692d97c3Snir.tzachar@gmail.com "  selected if this symbol is selected (y or m)\n"
241692d97c3Snir.tzachar@gmail.com "o The 'Selected by' line tell what symbol has selected this symbol\n"
242692d97c3Snir.tzachar@gmail.com "\n"
243692d97c3Snir.tzachar@gmail.com "Only relevant lines are shown.\n"
244692d97c3Snir.tzachar@gmail.com "\n\n"
245692d97c3Snir.tzachar@gmail.com "Search examples:\n"
246692d97c3Snir.tzachar@gmail.com "Examples: USB   = > find all CONFIG_ symbols containing USB\n"
247692d97c3Snir.tzachar@gmail.com "          ^USB => find all CONFIG_ symbols starting with USB\n"
248692d97c3Snir.tzachar@gmail.com "          USB$ => find all CONFIG_ symbols ending with USB\n"
249692d97c3Snir.tzachar@gmail.com "\n");
250692d97c3Snir.tzachar@gmail.com 
251692d97c3Snir.tzachar@gmail.com struct mitem {
252692d97c3Snir.tzachar@gmail.com 	char str[256];
253692d97c3Snir.tzachar@gmail.com 	char tag;
254692d97c3Snir.tzachar@gmail.com 	void *usrptr;
255692d97c3Snir.tzachar@gmail.com 	int is_hot;
256692d97c3Snir.tzachar@gmail.com 	int is_visible;
257692d97c3Snir.tzachar@gmail.com };
258692d97c3Snir.tzachar@gmail.com 
259692d97c3Snir.tzachar@gmail.com #define MAX_MENU_ITEMS 4096
260692d97c3Snir.tzachar@gmail.com static int show_all_items;
261692d97c3Snir.tzachar@gmail.com static int indent;
262692d97c3Snir.tzachar@gmail.com static struct menu *current_menu;
263692d97c3Snir.tzachar@gmail.com static int child_count;
264692d97c3Snir.tzachar@gmail.com static int single_menu_mode;
265692d97c3Snir.tzachar@gmail.com /* the window in which all information appears */
266692d97c3Snir.tzachar@gmail.com static WINDOW *main_window;
267692d97c3Snir.tzachar@gmail.com /* the largest size of the menu window */
268692d97c3Snir.tzachar@gmail.com static int mwin_max_lines;
269692d97c3Snir.tzachar@gmail.com static int mwin_max_cols;
270692d97c3Snir.tzachar@gmail.com /* the window in which we show option buttons */
271692d97c3Snir.tzachar@gmail.com static MENU *curses_menu;
272692d97c3Snir.tzachar@gmail.com static ITEM *curses_menu_items[MAX_MENU_ITEMS];
273692d97c3Snir.tzachar@gmail.com static struct mitem k_menu_items[MAX_MENU_ITEMS];
274692d97c3Snir.tzachar@gmail.com static int items_num;
275692d97c3Snir.tzachar@gmail.com static int global_exit;
276692d97c3Snir.tzachar@gmail.com /* the currently selected button */
277692d97c3Snir.tzachar@gmail.com const char *current_instructions = menu_instructions;
278692d97c3Snir.tzachar@gmail.com /* this array is used to implement hot keys. it is updated in item_make and
279692d97c3Snir.tzachar@gmail.com  * resetted in clean_items. It would be better to use a hash, but lets keep it
280692d97c3Snir.tzachar@gmail.com  * simple... */
281692d97c3Snir.tzachar@gmail.com #define MAX_SAME_KEY MAX_MENU_ITEMS
282692d97c3Snir.tzachar@gmail.com struct {
283692d97c3Snir.tzachar@gmail.com 	int count;
284692d97c3Snir.tzachar@gmail.com 	int ptrs[MAX_MENU_ITEMS];
285692d97c3Snir.tzachar@gmail.com } hotkeys[1<<(sizeof(char)*8)];
286692d97c3Snir.tzachar@gmail.com 
287692d97c3Snir.tzachar@gmail.com static void conf(struct menu *menu);
288692d97c3Snir.tzachar@gmail.com static void conf_choice(struct menu *menu);
289692d97c3Snir.tzachar@gmail.com static void conf_string(struct menu *menu);
290692d97c3Snir.tzachar@gmail.com static void conf_load(void);
291692d97c3Snir.tzachar@gmail.com static void conf_save(void);
292692d97c3Snir.tzachar@gmail.com static void show_help(struct menu *menu);
293692d97c3Snir.tzachar@gmail.com static int do_exit(void);
294692d97c3Snir.tzachar@gmail.com static void setup_windows(void);
295692d97c3Snir.tzachar@gmail.com 
296692d97c3Snir.tzachar@gmail.com typedef void (*function_key_handler_t)(int *key, struct menu *menu);
297692d97c3Snir.tzachar@gmail.com static void handle_f1(int *key, struct menu *current_item);
298692d97c3Snir.tzachar@gmail.com static void handle_f2(int *key, struct menu *current_item);
299692d97c3Snir.tzachar@gmail.com static void handle_f3(int *key, struct menu *current_item);
300692d97c3Snir.tzachar@gmail.com static void handle_f4(int *key, struct menu *current_item);
301692d97c3Snir.tzachar@gmail.com static void handle_f5(int *key, struct menu *current_item);
302692d97c3Snir.tzachar@gmail.com static void handle_f6(int *key, struct menu *current_item);
303692d97c3Snir.tzachar@gmail.com static void handle_f7(int *key, struct menu *current_item);
304692d97c3Snir.tzachar@gmail.com static void handle_f8(int *key, struct menu *current_item);
305692d97c3Snir.tzachar@gmail.com 
306692d97c3Snir.tzachar@gmail.com struct function_keys {
307692d97c3Snir.tzachar@gmail.com 	const char *key_str;
308692d97c3Snir.tzachar@gmail.com 	const char *func;
309692d97c3Snir.tzachar@gmail.com 	function_key key;
310692d97c3Snir.tzachar@gmail.com 	function_key_handler_t handler;
311692d97c3Snir.tzachar@gmail.com };
312692d97c3Snir.tzachar@gmail.com 
313692d97c3Snir.tzachar@gmail.com static const int function_keys_num = 8;
314692d97c3Snir.tzachar@gmail.com struct function_keys function_keys[] = {
315692d97c3Snir.tzachar@gmail.com 	{
316692d97c3Snir.tzachar@gmail.com 		.key_str = "F1",
317692d97c3Snir.tzachar@gmail.com 		.func = "Help",
318692d97c3Snir.tzachar@gmail.com 		.key = F_HELP,
319692d97c3Snir.tzachar@gmail.com 		.handler = handle_f1,
320692d97c3Snir.tzachar@gmail.com 	},
321692d97c3Snir.tzachar@gmail.com 	{
322692d97c3Snir.tzachar@gmail.com 		.key_str = "F2",
323692d97c3Snir.tzachar@gmail.com 		.func = "Symbol Info",
324692d97c3Snir.tzachar@gmail.com 		.key = F_SYMBOL,
325692d97c3Snir.tzachar@gmail.com 		.handler = handle_f2,
326692d97c3Snir.tzachar@gmail.com 	},
327692d97c3Snir.tzachar@gmail.com 	{
328692d97c3Snir.tzachar@gmail.com 		.key_str = "F3",
329692d97c3Snir.tzachar@gmail.com 		.func = "Instructions",
330692d97c3Snir.tzachar@gmail.com 		.key = F_INSTS,
331692d97c3Snir.tzachar@gmail.com 		.handler = handle_f3,
332692d97c3Snir.tzachar@gmail.com 	},
333692d97c3Snir.tzachar@gmail.com 	{
334692d97c3Snir.tzachar@gmail.com 		.key_str = "F4",
335692d97c3Snir.tzachar@gmail.com 		.func = "Config",
336692d97c3Snir.tzachar@gmail.com 		.key = F_CONF,
337692d97c3Snir.tzachar@gmail.com 		.handler = handle_f4,
338692d97c3Snir.tzachar@gmail.com 	},
339692d97c3Snir.tzachar@gmail.com 	{
340692d97c3Snir.tzachar@gmail.com 		.key_str = "F5",
341692d97c3Snir.tzachar@gmail.com 		.func = "Back",
342692d97c3Snir.tzachar@gmail.com 		.key = F_BACK,
343692d97c3Snir.tzachar@gmail.com 		.handler = handle_f5,
344692d97c3Snir.tzachar@gmail.com 	},
345692d97c3Snir.tzachar@gmail.com 	{
346692d97c3Snir.tzachar@gmail.com 		.key_str = "F6",
347692d97c3Snir.tzachar@gmail.com 		.func = "Save",
348692d97c3Snir.tzachar@gmail.com 		.key = F_SAVE,
349692d97c3Snir.tzachar@gmail.com 		.handler = handle_f6,
350692d97c3Snir.tzachar@gmail.com 	},
351692d97c3Snir.tzachar@gmail.com 	{
352692d97c3Snir.tzachar@gmail.com 		.key_str = "F7",
353692d97c3Snir.tzachar@gmail.com 		.func = "Load",
354692d97c3Snir.tzachar@gmail.com 		.key = F_LOAD,
355692d97c3Snir.tzachar@gmail.com 		.handler = handle_f7,
356692d97c3Snir.tzachar@gmail.com 	},
357692d97c3Snir.tzachar@gmail.com 	{
358692d97c3Snir.tzachar@gmail.com 		.key_str = "F8",
359692d97c3Snir.tzachar@gmail.com 		.func = "Exit",
360692d97c3Snir.tzachar@gmail.com 		.key = F_EXIT,
361692d97c3Snir.tzachar@gmail.com 		.handler = handle_f8,
362692d97c3Snir.tzachar@gmail.com 	},
363692d97c3Snir.tzachar@gmail.com };
364692d97c3Snir.tzachar@gmail.com 
365692d97c3Snir.tzachar@gmail.com static void print_function_line(void)
366692d97c3Snir.tzachar@gmail.com {
367692d97c3Snir.tzachar@gmail.com 	int i;
368692d97c3Snir.tzachar@gmail.com 	int offset = 1;
369692d97c3Snir.tzachar@gmail.com 	const int skip = 1;
370692d97c3Snir.tzachar@gmail.com 
371692d97c3Snir.tzachar@gmail.com 	for (i = 0; i < function_keys_num; i++) {
372692d97c3Snir.tzachar@gmail.com 		wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]);
373692d97c3Snir.tzachar@gmail.com 		mvwprintw(main_window, LINES-3, offset,
374692d97c3Snir.tzachar@gmail.com 				"%s",
375692d97c3Snir.tzachar@gmail.com 				function_keys[i].key_str);
376692d97c3Snir.tzachar@gmail.com 		wattrset(main_window, attributes[FUNCTION_TEXT]);
377692d97c3Snir.tzachar@gmail.com 		offset += strlen(function_keys[i].key_str);
378692d97c3Snir.tzachar@gmail.com 		mvwprintw(main_window, LINES-3,
379692d97c3Snir.tzachar@gmail.com 				offset, "%s",
380692d97c3Snir.tzachar@gmail.com 				function_keys[i].func);
381692d97c3Snir.tzachar@gmail.com 		offset += strlen(function_keys[i].func) + skip;
382692d97c3Snir.tzachar@gmail.com 	}
383692d97c3Snir.tzachar@gmail.com 	wattrset(main_window, attributes[NORMAL]);
384692d97c3Snir.tzachar@gmail.com }
385692d97c3Snir.tzachar@gmail.com 
386692d97c3Snir.tzachar@gmail.com /* help */
387692d97c3Snir.tzachar@gmail.com static void handle_f1(int *key, struct menu *current_item)
388692d97c3Snir.tzachar@gmail.com {
389692d97c3Snir.tzachar@gmail.com 	show_scroll_win(main_window,
390692d97c3Snir.tzachar@gmail.com 			_("README"), _(nconf_readme));
391692d97c3Snir.tzachar@gmail.com 	return;
392692d97c3Snir.tzachar@gmail.com }
393692d97c3Snir.tzachar@gmail.com 
394692d97c3Snir.tzachar@gmail.com /* symbole help */
395692d97c3Snir.tzachar@gmail.com static void handle_f2(int *key, struct menu *current_item)
396692d97c3Snir.tzachar@gmail.com {
397692d97c3Snir.tzachar@gmail.com 	show_help(current_item);
398692d97c3Snir.tzachar@gmail.com 	return;
399692d97c3Snir.tzachar@gmail.com }
400692d97c3Snir.tzachar@gmail.com 
401692d97c3Snir.tzachar@gmail.com /* instructions */
402692d97c3Snir.tzachar@gmail.com static void handle_f3(int *key, struct menu *current_item)
403692d97c3Snir.tzachar@gmail.com {
404692d97c3Snir.tzachar@gmail.com 	show_scroll_win(main_window,
405692d97c3Snir.tzachar@gmail.com 			_("Instructions"),
406692d97c3Snir.tzachar@gmail.com 			_(current_instructions));
407692d97c3Snir.tzachar@gmail.com 	return;
408692d97c3Snir.tzachar@gmail.com }
409692d97c3Snir.tzachar@gmail.com 
410692d97c3Snir.tzachar@gmail.com /* config */
411692d97c3Snir.tzachar@gmail.com static void handle_f4(int *key, struct menu *current_item)
412692d97c3Snir.tzachar@gmail.com {
413692d97c3Snir.tzachar@gmail.com 	int res = btn_dialog(main_window,
414692d97c3Snir.tzachar@gmail.com 			_("Show all symbols?"),
415692d97c3Snir.tzachar@gmail.com 			2,
416692d97c3Snir.tzachar@gmail.com 			"   <Show All>   ",
417692d97c3Snir.tzachar@gmail.com 			"<Don't show all>");
418692d97c3Snir.tzachar@gmail.com 	if (res == 0)
419692d97c3Snir.tzachar@gmail.com 		show_all_items = 1;
420692d97c3Snir.tzachar@gmail.com 	else if (res == 1)
421692d97c3Snir.tzachar@gmail.com 		show_all_items = 0;
422692d97c3Snir.tzachar@gmail.com 
423692d97c3Snir.tzachar@gmail.com 	return;
424692d97c3Snir.tzachar@gmail.com }
425692d97c3Snir.tzachar@gmail.com 
426692d97c3Snir.tzachar@gmail.com /* back */
427692d97c3Snir.tzachar@gmail.com static void handle_f5(int *key, struct menu *current_item)
428692d97c3Snir.tzachar@gmail.com {
429692d97c3Snir.tzachar@gmail.com 	*key = KEY_LEFT;
430692d97c3Snir.tzachar@gmail.com 	return;
431692d97c3Snir.tzachar@gmail.com }
432692d97c3Snir.tzachar@gmail.com 
433692d97c3Snir.tzachar@gmail.com /* save */
434692d97c3Snir.tzachar@gmail.com static void handle_f6(int *key, struct menu *current_item)
435692d97c3Snir.tzachar@gmail.com {
436692d97c3Snir.tzachar@gmail.com 	conf_save();
437692d97c3Snir.tzachar@gmail.com 	return;
438692d97c3Snir.tzachar@gmail.com }
439692d97c3Snir.tzachar@gmail.com 
440692d97c3Snir.tzachar@gmail.com /* load */
441692d97c3Snir.tzachar@gmail.com static void handle_f7(int *key, struct menu *current_item)
442692d97c3Snir.tzachar@gmail.com {
443692d97c3Snir.tzachar@gmail.com 	conf_load();
444692d97c3Snir.tzachar@gmail.com 	return;
445692d97c3Snir.tzachar@gmail.com }
446692d97c3Snir.tzachar@gmail.com 
447692d97c3Snir.tzachar@gmail.com /* exit */
448692d97c3Snir.tzachar@gmail.com static void handle_f8(int *key, struct menu *current_item)
449692d97c3Snir.tzachar@gmail.com {
450692d97c3Snir.tzachar@gmail.com 	do_exit();
451692d97c3Snir.tzachar@gmail.com 	return;
452692d97c3Snir.tzachar@gmail.com }
453692d97c3Snir.tzachar@gmail.com 
454692d97c3Snir.tzachar@gmail.com /* return != 0 to indicate the key was handles */
455851190c9SMichal Marek static int process_special_keys(int *key, struct menu *menu)
456692d97c3Snir.tzachar@gmail.com {
457692d97c3Snir.tzachar@gmail.com 	int i;
458692d97c3Snir.tzachar@gmail.com 
459692d97c3Snir.tzachar@gmail.com 	if (*key == KEY_RESIZE) {
460692d97c3Snir.tzachar@gmail.com 		setup_windows();
461692d97c3Snir.tzachar@gmail.com 		return 1;
462692d97c3Snir.tzachar@gmail.com 	}
463692d97c3Snir.tzachar@gmail.com 
464692d97c3Snir.tzachar@gmail.com 	for (i = 0; i < function_keys_num; i++) {
465692d97c3Snir.tzachar@gmail.com 		if (*key == KEY_F(function_keys[i].key) ||
466692d97c3Snir.tzachar@gmail.com 		    *key == '0' + function_keys[i].key){
467692d97c3Snir.tzachar@gmail.com 			function_keys[i].handler(key, menu);
468692d97c3Snir.tzachar@gmail.com 			return 1;
469692d97c3Snir.tzachar@gmail.com 		}
470692d97c3Snir.tzachar@gmail.com 	}
471692d97c3Snir.tzachar@gmail.com 
472692d97c3Snir.tzachar@gmail.com 	return 0;
473692d97c3Snir.tzachar@gmail.com }
474692d97c3Snir.tzachar@gmail.com 
475692d97c3Snir.tzachar@gmail.com static void clean_items(void)
476692d97c3Snir.tzachar@gmail.com {
477692d97c3Snir.tzachar@gmail.com 	int i;
478692d97c3Snir.tzachar@gmail.com 	for (i = 0; curses_menu_items[i]; i++)
479692d97c3Snir.tzachar@gmail.com 		free_item(curses_menu_items[i]);
480692d97c3Snir.tzachar@gmail.com 	bzero(curses_menu_items, sizeof(curses_menu_items));
481692d97c3Snir.tzachar@gmail.com 	bzero(k_menu_items, sizeof(k_menu_items));
482692d97c3Snir.tzachar@gmail.com 	bzero(hotkeys, sizeof(hotkeys));
483692d97c3Snir.tzachar@gmail.com 	items_num = 0;
484692d97c3Snir.tzachar@gmail.com }
485692d97c3Snir.tzachar@gmail.com 
486692d97c3Snir.tzachar@gmail.com /* return the index of the next hot item, or -1 if no such item exists */
487851190c9SMichal Marek static int get_next_hot(int c)
488692d97c3Snir.tzachar@gmail.com {
489692d97c3Snir.tzachar@gmail.com 	static int hot_index;
490692d97c3Snir.tzachar@gmail.com 	static int hot_char;
491692d97c3Snir.tzachar@gmail.com 
492692d97c3Snir.tzachar@gmail.com 	if (c < 0 || c > 255 || hotkeys[c].count <= 0)
493692d97c3Snir.tzachar@gmail.com 		return -1;
494692d97c3Snir.tzachar@gmail.com 
495692d97c3Snir.tzachar@gmail.com 	if (hot_char == c) {
496692d97c3Snir.tzachar@gmail.com 		hot_index = (hot_index+1)%hotkeys[c].count;
497692d97c3Snir.tzachar@gmail.com 		return hotkeys[c].ptrs[hot_index];
498692d97c3Snir.tzachar@gmail.com 	} else {
499692d97c3Snir.tzachar@gmail.com 		hot_char = c;
500692d97c3Snir.tzachar@gmail.com 		hot_index = 0;
501692d97c3Snir.tzachar@gmail.com 		return hotkeys[c].ptrs[0];
502692d97c3Snir.tzachar@gmail.com 	}
503692d97c3Snir.tzachar@gmail.com }
504692d97c3Snir.tzachar@gmail.com 
505692d97c3Snir.tzachar@gmail.com /* can the char c be a hot key? no, if c is a common shortcut used elsewhere */
506851190c9SMichal Marek static int canbhot(char c)
507692d97c3Snir.tzachar@gmail.com {
508692d97c3Snir.tzachar@gmail.com 	c = tolower(c);
509692d97c3Snir.tzachar@gmail.com 	return isalnum(c) && c != 'y' && c != 'm' && c != 'h' &&
510692d97c3Snir.tzachar@gmail.com 		c != 'n' && c != '?';
511692d97c3Snir.tzachar@gmail.com }
512692d97c3Snir.tzachar@gmail.com 
513692d97c3Snir.tzachar@gmail.com /* check if str already contains a hot key. */
514851190c9SMichal Marek static int is_hot(int index)
515692d97c3Snir.tzachar@gmail.com {
516692d97c3Snir.tzachar@gmail.com 	return k_menu_items[index].is_hot;
517692d97c3Snir.tzachar@gmail.com }
518692d97c3Snir.tzachar@gmail.com 
519692d97c3Snir.tzachar@gmail.com /* find the first possible hot key, and mark it.
520692d97c3Snir.tzachar@gmail.com  * index is the index of the item in the menu
521692d97c3Snir.tzachar@gmail.com  * return 0 on success*/
522851190c9SMichal Marek static int make_hot(char *dest, int len, const char *org, int index)
523692d97c3Snir.tzachar@gmail.com {
524692d97c3Snir.tzachar@gmail.com 	int position = -1;
525692d97c3Snir.tzachar@gmail.com 	int i;
526692d97c3Snir.tzachar@gmail.com 	int tmp;
527692d97c3Snir.tzachar@gmail.com 	int c;
528692d97c3Snir.tzachar@gmail.com 	int org_len = strlen(org);
529692d97c3Snir.tzachar@gmail.com 
530692d97c3Snir.tzachar@gmail.com 	if (org == NULL || is_hot(index))
531692d97c3Snir.tzachar@gmail.com 		return 1;
532692d97c3Snir.tzachar@gmail.com 
533692d97c3Snir.tzachar@gmail.com 	/* make sure not to make hot keys out of markers.
534692d97c3Snir.tzachar@gmail.com 	 * find where to start looking for a hot key
535692d97c3Snir.tzachar@gmail.com 	 */
536692d97c3Snir.tzachar@gmail.com 	i = 0;
537692d97c3Snir.tzachar@gmail.com 	/* skip white space */
538692d97c3Snir.tzachar@gmail.com 	while (i < org_len && org[i] == ' ')
539692d97c3Snir.tzachar@gmail.com 		i++;
540692d97c3Snir.tzachar@gmail.com 	if (i == org_len)
541692d97c3Snir.tzachar@gmail.com 		return -1;
542692d97c3Snir.tzachar@gmail.com 	/* if encountering '(' or '<' or '[', find the match and look from there
543692d97c3Snir.tzachar@gmail.com 	 **/
544692d97c3Snir.tzachar@gmail.com 	if (org[i] == '[' || org[i] == '<' || org[i] == '(') {
545692d97c3Snir.tzachar@gmail.com 		i++;
546692d97c3Snir.tzachar@gmail.com 		for (; i < org_len; i++)
547692d97c3Snir.tzachar@gmail.com 			if (org[i] == ']' || org[i] == '>' || org[i] == ')')
548692d97c3Snir.tzachar@gmail.com 				break;
549692d97c3Snir.tzachar@gmail.com 	}
550692d97c3Snir.tzachar@gmail.com 	if (i == org_len)
551692d97c3Snir.tzachar@gmail.com 		return -1;
552692d97c3Snir.tzachar@gmail.com 	for (; i < org_len; i++) {
553692d97c3Snir.tzachar@gmail.com 		if (canbhot(org[i]) && org[i-1] != '<' && org[i-1] != '(') {
554692d97c3Snir.tzachar@gmail.com 			position = i;
555692d97c3Snir.tzachar@gmail.com 			break;
556692d97c3Snir.tzachar@gmail.com 		}
557692d97c3Snir.tzachar@gmail.com 	}
558692d97c3Snir.tzachar@gmail.com 	if (position == -1)
559692d97c3Snir.tzachar@gmail.com 		return 1;
560692d97c3Snir.tzachar@gmail.com 
561692d97c3Snir.tzachar@gmail.com 	/* ok, char at org[position] should be a hot key to this item */
562692d97c3Snir.tzachar@gmail.com 	c = tolower(org[position]);
563692d97c3Snir.tzachar@gmail.com 	tmp = hotkeys[c].count;
564692d97c3Snir.tzachar@gmail.com 	hotkeys[c].ptrs[tmp] = index;
565692d97c3Snir.tzachar@gmail.com 	hotkeys[c].count++;
566692d97c3Snir.tzachar@gmail.com 	/*
567692d97c3Snir.tzachar@gmail.com 	   snprintf(dest, len, "%.*s(%c)%s", position, org, org[position],
568692d97c3Snir.tzachar@gmail.com 	   &org[position+1]);
569692d97c3Snir.tzachar@gmail.com 	   */
570692d97c3Snir.tzachar@gmail.com 	/* make org[position] uppercase, and all leading letter small case */
571692d97c3Snir.tzachar@gmail.com 	strncpy(dest, org, len);
572692d97c3Snir.tzachar@gmail.com 	for (i = 0; i < position; i++)
573692d97c3Snir.tzachar@gmail.com 		dest[i] = tolower(dest[i]);
574692d97c3Snir.tzachar@gmail.com 	dest[position] = toupper(dest[position]);
575692d97c3Snir.tzachar@gmail.com 	k_menu_items[index].is_hot = 1;
576692d97c3Snir.tzachar@gmail.com 	return 0;
577692d97c3Snir.tzachar@gmail.com }
578692d97c3Snir.tzachar@gmail.com 
579692d97c3Snir.tzachar@gmail.com /* Make a new item. Add a hotkey mark in the first possible letter.
580692d97c3Snir.tzachar@gmail.com  * As ncurses does not allow any attributes inside menue item, we mark the
581692d97c3Snir.tzachar@gmail.com  * hot key as the first capitalized letter in the string */
582851190c9SMichal Marek static void item_make(struct menu *menu, char tag, const char *fmt, ...)
583692d97c3Snir.tzachar@gmail.com {
584692d97c3Snir.tzachar@gmail.com 	va_list ap;
585692d97c3Snir.tzachar@gmail.com 	char tmp_str[256];
586692d97c3Snir.tzachar@gmail.com 
587692d97c3Snir.tzachar@gmail.com 	if (items_num > MAX_MENU_ITEMS-1)
588692d97c3Snir.tzachar@gmail.com 		return;
589692d97c3Snir.tzachar@gmail.com 
590692d97c3Snir.tzachar@gmail.com 	bzero(&k_menu_items[items_num], sizeof(k_menu_items[0]));
591692d97c3Snir.tzachar@gmail.com 	k_menu_items[items_num].tag = tag;
592692d97c3Snir.tzachar@gmail.com 	k_menu_items[items_num].usrptr = menu;
593692d97c3Snir.tzachar@gmail.com 	if (menu != NULL)
594692d97c3Snir.tzachar@gmail.com 		k_menu_items[items_num].is_visible =
595692d97c3Snir.tzachar@gmail.com 			menu_is_visible(menu);
596692d97c3Snir.tzachar@gmail.com 	else
597692d97c3Snir.tzachar@gmail.com 		k_menu_items[items_num].is_visible = 1;
598692d97c3Snir.tzachar@gmail.com 
599692d97c3Snir.tzachar@gmail.com 	va_start(ap, fmt);
600692d97c3Snir.tzachar@gmail.com 	vsnprintf(tmp_str, sizeof(tmp_str), fmt, ap);
601692d97c3Snir.tzachar@gmail.com 	if (!k_menu_items[items_num].is_visible)
602692d97c3Snir.tzachar@gmail.com 		memcpy(tmp_str, "XXX", 3);
603692d97c3Snir.tzachar@gmail.com 	va_end(ap);
604692d97c3Snir.tzachar@gmail.com 	if (make_hot(
605692d97c3Snir.tzachar@gmail.com 		k_menu_items[items_num].str,
606692d97c3Snir.tzachar@gmail.com 		sizeof(k_menu_items[items_num].str), tmp_str, items_num) != 0)
607692d97c3Snir.tzachar@gmail.com 		strncpy(k_menu_items[items_num].str,
608692d97c3Snir.tzachar@gmail.com 			tmp_str,
609692d97c3Snir.tzachar@gmail.com 			sizeof(k_menu_items[items_num].str));
610692d97c3Snir.tzachar@gmail.com 
611692d97c3Snir.tzachar@gmail.com 	curses_menu_items[items_num] = new_item(
612692d97c3Snir.tzachar@gmail.com 			k_menu_items[items_num].str,
613692d97c3Snir.tzachar@gmail.com 			k_menu_items[items_num].str);
614692d97c3Snir.tzachar@gmail.com 	set_item_userptr(curses_menu_items[items_num],
615692d97c3Snir.tzachar@gmail.com 			&k_menu_items[items_num]);
616692d97c3Snir.tzachar@gmail.com 	/*
617692d97c3Snir.tzachar@gmail.com 	if (!k_menu_items[items_num].is_visible)
618692d97c3Snir.tzachar@gmail.com 		item_opts_off(curses_menu_items[items_num], O_SELECTABLE);
619692d97c3Snir.tzachar@gmail.com 	*/
620692d97c3Snir.tzachar@gmail.com 
621692d97c3Snir.tzachar@gmail.com 	items_num++;
622692d97c3Snir.tzachar@gmail.com 	curses_menu_items[items_num] = NULL;
623692d97c3Snir.tzachar@gmail.com }
624692d97c3Snir.tzachar@gmail.com 
625692d97c3Snir.tzachar@gmail.com /* very hackish. adds a string to the last item added */
626851190c9SMichal Marek static void item_add_str(const char *fmt, ...)
627692d97c3Snir.tzachar@gmail.com {
628692d97c3Snir.tzachar@gmail.com 	va_list ap;
629692d97c3Snir.tzachar@gmail.com 	int index = items_num-1;
630692d97c3Snir.tzachar@gmail.com 	char new_str[256];
631692d97c3Snir.tzachar@gmail.com 	char tmp_str[256];
632692d97c3Snir.tzachar@gmail.com 
633692d97c3Snir.tzachar@gmail.com 	if (index < 0)
634692d97c3Snir.tzachar@gmail.com 		return;
635692d97c3Snir.tzachar@gmail.com 
636692d97c3Snir.tzachar@gmail.com 	va_start(ap, fmt);
637692d97c3Snir.tzachar@gmail.com 	vsnprintf(new_str, sizeof(new_str), fmt, ap);
638692d97c3Snir.tzachar@gmail.com 	va_end(ap);
639692d97c3Snir.tzachar@gmail.com 	snprintf(tmp_str, sizeof(tmp_str), "%s%s",
640692d97c3Snir.tzachar@gmail.com 			k_menu_items[index].str, new_str);
641692d97c3Snir.tzachar@gmail.com 	if (make_hot(k_menu_items[index].str,
642692d97c3Snir.tzachar@gmail.com 			sizeof(k_menu_items[index].str), tmp_str, index) != 0)
643692d97c3Snir.tzachar@gmail.com 		strncpy(k_menu_items[index].str,
644692d97c3Snir.tzachar@gmail.com 			tmp_str,
645692d97c3Snir.tzachar@gmail.com 			sizeof(k_menu_items[index].str));
646692d97c3Snir.tzachar@gmail.com 
647692d97c3Snir.tzachar@gmail.com 	free_item(curses_menu_items[index]);
648692d97c3Snir.tzachar@gmail.com 	curses_menu_items[index] = new_item(
649692d97c3Snir.tzachar@gmail.com 			k_menu_items[index].str,
650692d97c3Snir.tzachar@gmail.com 			k_menu_items[index].str);
651692d97c3Snir.tzachar@gmail.com 	set_item_userptr(curses_menu_items[index],
652692d97c3Snir.tzachar@gmail.com 			&k_menu_items[index]);
653692d97c3Snir.tzachar@gmail.com }
654692d97c3Snir.tzachar@gmail.com 
655692d97c3Snir.tzachar@gmail.com /* get the tag of the currently selected item */
656851190c9SMichal Marek static char item_tag(void)
657692d97c3Snir.tzachar@gmail.com {
658692d97c3Snir.tzachar@gmail.com 	ITEM *cur;
659692d97c3Snir.tzachar@gmail.com 	struct mitem *mcur;
660692d97c3Snir.tzachar@gmail.com 
661692d97c3Snir.tzachar@gmail.com 	cur = current_item(curses_menu);
662692d97c3Snir.tzachar@gmail.com 	if (cur == NULL)
663692d97c3Snir.tzachar@gmail.com 		return 0;
664692d97c3Snir.tzachar@gmail.com 	mcur = (struct mitem *) item_userptr(cur);
665692d97c3Snir.tzachar@gmail.com 	return mcur->tag;
666692d97c3Snir.tzachar@gmail.com }
667692d97c3Snir.tzachar@gmail.com 
668851190c9SMichal Marek static int curses_item_index(void)
669692d97c3Snir.tzachar@gmail.com {
670692d97c3Snir.tzachar@gmail.com 	return  item_index(current_item(curses_menu));
671692d97c3Snir.tzachar@gmail.com }
672692d97c3Snir.tzachar@gmail.com 
673851190c9SMichal Marek static void *item_data(void)
674692d97c3Snir.tzachar@gmail.com {
675692d97c3Snir.tzachar@gmail.com 	ITEM *cur;
676692d97c3Snir.tzachar@gmail.com 	struct mitem *mcur;
677692d97c3Snir.tzachar@gmail.com 
678692d97c3Snir.tzachar@gmail.com 	cur = current_item(curses_menu);
679*866af407SAndrej Gelenberg 	if (!cur)
680*866af407SAndrej Gelenberg 		return NULL;
681692d97c3Snir.tzachar@gmail.com 	mcur = (struct mitem *) item_userptr(cur);
682692d97c3Snir.tzachar@gmail.com 	return mcur->usrptr;
683692d97c3Snir.tzachar@gmail.com 
684692d97c3Snir.tzachar@gmail.com }
685692d97c3Snir.tzachar@gmail.com 
686851190c9SMichal Marek static int item_is_tag(char tag)
687692d97c3Snir.tzachar@gmail.com {
688692d97c3Snir.tzachar@gmail.com 	return item_tag() == tag;
689692d97c3Snir.tzachar@gmail.com }
690692d97c3Snir.tzachar@gmail.com 
691692d97c3Snir.tzachar@gmail.com static char filename[PATH_MAX+1];
692692d97c3Snir.tzachar@gmail.com static char menu_backtitle[PATH_MAX+128];
693851190c9SMichal Marek static const char *set_config_filename(const char *config_filename)
694692d97c3Snir.tzachar@gmail.com {
695692d97c3Snir.tzachar@gmail.com 	int size;
696692d97c3Snir.tzachar@gmail.com 	struct symbol *sym;
697692d97c3Snir.tzachar@gmail.com 
698692d97c3Snir.tzachar@gmail.com 	sym = sym_lookup("KERNELVERSION", 0);
699692d97c3Snir.tzachar@gmail.com 	sym_calc_value(sym);
700692d97c3Snir.tzachar@gmail.com 	size = snprintf(menu_backtitle, sizeof(menu_backtitle),
701692d97c3Snir.tzachar@gmail.com 			_("%s - Linux Kernel v%s Configuration"),
702692d97c3Snir.tzachar@gmail.com 			config_filename, sym_get_string_value(sym));
703692d97c3Snir.tzachar@gmail.com 	if (size >= sizeof(menu_backtitle))
704692d97c3Snir.tzachar@gmail.com 		menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
705692d97c3Snir.tzachar@gmail.com 
706692d97c3Snir.tzachar@gmail.com 	size = snprintf(filename, sizeof(filename), "%s", config_filename);
707692d97c3Snir.tzachar@gmail.com 	if (size >= sizeof(filename))
708692d97c3Snir.tzachar@gmail.com 		filename[sizeof(filename)-1] = '\0';
709692d97c3Snir.tzachar@gmail.com 	return menu_backtitle;
710692d97c3Snir.tzachar@gmail.com }
711692d97c3Snir.tzachar@gmail.com 
712692d97c3Snir.tzachar@gmail.com /* command = 0 is supress, 1 is restore */
713692d97c3Snir.tzachar@gmail.com static void supress_stdout(int command)
714692d97c3Snir.tzachar@gmail.com {
715692d97c3Snir.tzachar@gmail.com 	static FILE *org_stdout;
716692d97c3Snir.tzachar@gmail.com 	static FILE *org_stderr;
717692d97c3Snir.tzachar@gmail.com 
718692d97c3Snir.tzachar@gmail.com 	if (command == 0) {
719692d97c3Snir.tzachar@gmail.com 		org_stdout = stdout;
720692d97c3Snir.tzachar@gmail.com 		org_stderr = stderr;
721692d97c3Snir.tzachar@gmail.com 		stdout = fopen("/dev/null", "a");
722692d97c3Snir.tzachar@gmail.com 		stderr = fopen("/dev/null", "a");
723692d97c3Snir.tzachar@gmail.com 	} else {
724692d97c3Snir.tzachar@gmail.com 		fclose(stdout);
725692d97c3Snir.tzachar@gmail.com 		fclose(stderr);
726692d97c3Snir.tzachar@gmail.com 		stdout = org_stdout;
727692d97c3Snir.tzachar@gmail.com 		stderr = org_stderr;
728692d97c3Snir.tzachar@gmail.com 	}
729692d97c3Snir.tzachar@gmail.com }
730692d97c3Snir.tzachar@gmail.com 
731692d97c3Snir.tzachar@gmail.com /* return = 0 means we are successful.
732692d97c3Snir.tzachar@gmail.com  * -1 means go on doing what you were doing
733692d97c3Snir.tzachar@gmail.com  */
734692d97c3Snir.tzachar@gmail.com static int do_exit(void)
735692d97c3Snir.tzachar@gmail.com {
736692d97c3Snir.tzachar@gmail.com 	int res;
737692d97c3Snir.tzachar@gmail.com 	if (!conf_get_changed()) {
738692d97c3Snir.tzachar@gmail.com 		global_exit = 1;
739692d97c3Snir.tzachar@gmail.com 		return 0;
740692d97c3Snir.tzachar@gmail.com 	}
741692d97c3Snir.tzachar@gmail.com 	res = btn_dialog(main_window,
742692d97c3Snir.tzachar@gmail.com 			_("Do you wish to save your "
743692d97c3Snir.tzachar@gmail.com 				"new kernel configuration?\n"
744692d97c3Snir.tzachar@gmail.com 				"<ESC> to cancel and resume nconfig."),
745692d97c3Snir.tzachar@gmail.com 			2,
746692d97c3Snir.tzachar@gmail.com 			"   <save>   ",
747692d97c3Snir.tzachar@gmail.com 			"<don't save>");
748692d97c3Snir.tzachar@gmail.com 	if (res == KEY_EXIT) {
749692d97c3Snir.tzachar@gmail.com 		global_exit = 0;
750692d97c3Snir.tzachar@gmail.com 		return -1;
751692d97c3Snir.tzachar@gmail.com 	}
752692d97c3Snir.tzachar@gmail.com 
753692d97c3Snir.tzachar@gmail.com 	/* if we got here, the user really wants to exit */
754692d97c3Snir.tzachar@gmail.com 	switch (res) {
755692d97c3Snir.tzachar@gmail.com 	case 0:
756692d97c3Snir.tzachar@gmail.com 		supress_stdout(0);
757692d97c3Snir.tzachar@gmail.com 		res = conf_write(filename);
758692d97c3Snir.tzachar@gmail.com 		supress_stdout(1);
759692d97c3Snir.tzachar@gmail.com 		if (res)
760692d97c3Snir.tzachar@gmail.com 			btn_dialog(
761692d97c3Snir.tzachar@gmail.com 				main_window,
762692d97c3Snir.tzachar@gmail.com 				_("Error during writing of the kernel "
763692d97c3Snir.tzachar@gmail.com 				  "configuration.\n"
764692d97c3Snir.tzachar@gmail.com 				  "Your kernel configuration "
765692d97c3Snir.tzachar@gmail.com 				  "changes were NOT saved."),
766692d97c3Snir.tzachar@gmail.com 				  1,
767692d97c3Snir.tzachar@gmail.com 				  "<OK>");
768692d97c3Snir.tzachar@gmail.com 		else {
769692d97c3Snir.tzachar@gmail.com 			char buf[1024];
770692d97c3Snir.tzachar@gmail.com 			snprintf(buf, 1024,
771692d97c3Snir.tzachar@gmail.com 				_("Configuration written to %s\n"
772692d97c3Snir.tzachar@gmail.com 				  "End of Linux kernel configuration.\n"
773692d97c3Snir.tzachar@gmail.com 				  "Execute 'make' to build the kernel or try"
774692d97c3Snir.tzachar@gmail.com 				  " 'make help'."), filename);
775692d97c3Snir.tzachar@gmail.com 			btn_dialog(
776692d97c3Snir.tzachar@gmail.com 				main_window,
777692d97c3Snir.tzachar@gmail.com 				buf,
778692d97c3Snir.tzachar@gmail.com 				1,
779692d97c3Snir.tzachar@gmail.com 				"<OK>");
780692d97c3Snir.tzachar@gmail.com 		}
781692d97c3Snir.tzachar@gmail.com 		break;
782692d97c3Snir.tzachar@gmail.com 	default:
783692d97c3Snir.tzachar@gmail.com 		btn_dialog(
784692d97c3Snir.tzachar@gmail.com 			main_window,
785692d97c3Snir.tzachar@gmail.com 			_("Your kernel configuration changes were NOT saved."),
786692d97c3Snir.tzachar@gmail.com 			1,
787692d97c3Snir.tzachar@gmail.com 			"<OK>");
788692d97c3Snir.tzachar@gmail.com 		break;
789692d97c3Snir.tzachar@gmail.com 	}
790692d97c3Snir.tzachar@gmail.com 	global_exit = 1;
791692d97c3Snir.tzachar@gmail.com 	return 0;
792692d97c3Snir.tzachar@gmail.com }
793692d97c3Snir.tzachar@gmail.com 
794692d97c3Snir.tzachar@gmail.com 
795692d97c3Snir.tzachar@gmail.com static void search_conf(void)
796692d97c3Snir.tzachar@gmail.com {
797692d97c3Snir.tzachar@gmail.com 	struct symbol **sym_arr;
798692d97c3Snir.tzachar@gmail.com 	struct gstr res;
799692d97c3Snir.tzachar@gmail.com 	char dialog_input_result[100];
800692d97c3Snir.tzachar@gmail.com 	char *dialog_input;
801692d97c3Snir.tzachar@gmail.com 	int dres;
802692d97c3Snir.tzachar@gmail.com again:
803692d97c3Snir.tzachar@gmail.com 	dres = dialog_inputbox(main_window,
804692d97c3Snir.tzachar@gmail.com 			_("Search Configuration Parameter"),
805692d97c3Snir.tzachar@gmail.com 			_("Enter CONFIG_ (sub)string to search for "
806692d97c3Snir.tzachar@gmail.com 				"(with or without \"CONFIG\")"),
807692d97c3Snir.tzachar@gmail.com 			"", dialog_input_result, 99);
808692d97c3Snir.tzachar@gmail.com 	switch (dres) {
809692d97c3Snir.tzachar@gmail.com 	case 0:
810692d97c3Snir.tzachar@gmail.com 		break;
811692d97c3Snir.tzachar@gmail.com 	case 1:
812692d97c3Snir.tzachar@gmail.com 		show_scroll_win(main_window,
813692d97c3Snir.tzachar@gmail.com 				_("Search Configuration"), search_help);
814692d97c3Snir.tzachar@gmail.com 		goto again;
815692d97c3Snir.tzachar@gmail.com 	default:
816692d97c3Snir.tzachar@gmail.com 		return;
817692d97c3Snir.tzachar@gmail.com 	}
818692d97c3Snir.tzachar@gmail.com 
819692d97c3Snir.tzachar@gmail.com 	/* strip CONFIG_ if necessary */
820692d97c3Snir.tzachar@gmail.com 	dialog_input = dialog_input_result;
821692d97c3Snir.tzachar@gmail.com 	if (strncasecmp(dialog_input_result, "CONFIG_", 7) == 0)
822692d97c3Snir.tzachar@gmail.com 		dialog_input += 7;
823692d97c3Snir.tzachar@gmail.com 
824692d97c3Snir.tzachar@gmail.com 	sym_arr = sym_re_search(dialog_input);
825692d97c3Snir.tzachar@gmail.com 	res = get_relations_str(sym_arr);
826692d97c3Snir.tzachar@gmail.com 	free(sym_arr);
827692d97c3Snir.tzachar@gmail.com 	show_scroll_win(main_window,
828692d97c3Snir.tzachar@gmail.com 			_("Search Results"), str_get(&res));
829692d97c3Snir.tzachar@gmail.com 	str_free(&res);
830692d97c3Snir.tzachar@gmail.com }
831692d97c3Snir.tzachar@gmail.com 
832692d97c3Snir.tzachar@gmail.com 
833692d97c3Snir.tzachar@gmail.com static void build_conf(struct menu *menu)
834692d97c3Snir.tzachar@gmail.com {
835692d97c3Snir.tzachar@gmail.com 	struct symbol *sym;
836692d97c3Snir.tzachar@gmail.com 	struct property *prop;
837692d97c3Snir.tzachar@gmail.com 	struct menu *child;
838692d97c3Snir.tzachar@gmail.com 	int type, tmp, doint = 2;
839692d97c3Snir.tzachar@gmail.com 	tristate val;
840692d97c3Snir.tzachar@gmail.com 	char ch;
841692d97c3Snir.tzachar@gmail.com 
842692d97c3Snir.tzachar@gmail.com 	if (!menu || (!show_all_items && !menu_is_visible(menu)))
843692d97c3Snir.tzachar@gmail.com 		return;
844692d97c3Snir.tzachar@gmail.com 
845692d97c3Snir.tzachar@gmail.com 	sym = menu->sym;
846692d97c3Snir.tzachar@gmail.com 	prop = menu->prompt;
847692d97c3Snir.tzachar@gmail.com 	if (!sym) {
848692d97c3Snir.tzachar@gmail.com 		if (prop && menu != current_menu) {
849692d97c3Snir.tzachar@gmail.com 			const char *prompt = menu_get_prompt(menu);
850692d97c3Snir.tzachar@gmail.com 			enum prop_type ptype;
851692d97c3Snir.tzachar@gmail.com 			ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
852692d97c3Snir.tzachar@gmail.com 			switch (ptype) {
853692d97c3Snir.tzachar@gmail.com 			case P_MENU:
854692d97c3Snir.tzachar@gmail.com 				child_count++;
855692d97c3Snir.tzachar@gmail.com 				prompt = _(prompt);
856692d97c3Snir.tzachar@gmail.com 				if (single_menu_mode) {
857692d97c3Snir.tzachar@gmail.com 					item_make(menu, 'm',
858692d97c3Snir.tzachar@gmail.com 						"%s%*c%s",
859692d97c3Snir.tzachar@gmail.com 						menu->data ? "-->" : "++>",
860692d97c3Snir.tzachar@gmail.com 						indent + 1, ' ', prompt);
861692d97c3Snir.tzachar@gmail.com 				} else
862692d97c3Snir.tzachar@gmail.com 					item_make(menu, 'm',
863692d97c3Snir.tzachar@gmail.com 						"   %*c%s  --->",
864692d97c3Snir.tzachar@gmail.com 						indent + 1,
865692d97c3Snir.tzachar@gmail.com 						' ', prompt);
866692d97c3Snir.tzachar@gmail.com 
867692d97c3Snir.tzachar@gmail.com 				if (single_menu_mode && menu->data)
868692d97c3Snir.tzachar@gmail.com 					goto conf_childs;
869692d97c3Snir.tzachar@gmail.com 				return;
870692d97c3Snir.tzachar@gmail.com 			case P_COMMENT:
871692d97c3Snir.tzachar@gmail.com 				if (prompt) {
872692d97c3Snir.tzachar@gmail.com 					child_count++;
873692d97c3Snir.tzachar@gmail.com 					item_make(menu, ':',
874692d97c3Snir.tzachar@gmail.com 						"   %*c*** %s ***",
875692d97c3Snir.tzachar@gmail.com 						indent + 1, ' ',
876692d97c3Snir.tzachar@gmail.com 						_(prompt));
877692d97c3Snir.tzachar@gmail.com 				}
878692d97c3Snir.tzachar@gmail.com 				break;
879692d97c3Snir.tzachar@gmail.com 			default:
880692d97c3Snir.tzachar@gmail.com 				if (prompt) {
881692d97c3Snir.tzachar@gmail.com 					child_count++;
882692d97c3Snir.tzachar@gmail.com 					item_make(menu, ':', "---%*c%s",
883692d97c3Snir.tzachar@gmail.com 						indent + 1, ' ',
884692d97c3Snir.tzachar@gmail.com 						_(prompt));
885692d97c3Snir.tzachar@gmail.com 				}
886692d97c3Snir.tzachar@gmail.com 			}
887692d97c3Snir.tzachar@gmail.com 		} else
888692d97c3Snir.tzachar@gmail.com 			doint = 0;
889692d97c3Snir.tzachar@gmail.com 		goto conf_childs;
890692d97c3Snir.tzachar@gmail.com 	}
891692d97c3Snir.tzachar@gmail.com 
892692d97c3Snir.tzachar@gmail.com 	type = sym_get_type(sym);
893692d97c3Snir.tzachar@gmail.com 	if (sym_is_choice(sym)) {
894692d97c3Snir.tzachar@gmail.com 		struct symbol *def_sym = sym_get_choice_value(sym);
895692d97c3Snir.tzachar@gmail.com 		struct menu *def_menu = NULL;
896692d97c3Snir.tzachar@gmail.com 
897692d97c3Snir.tzachar@gmail.com 		child_count++;
898692d97c3Snir.tzachar@gmail.com 		for (child = menu->list; child; child = child->next) {
899692d97c3Snir.tzachar@gmail.com 			if (menu_is_visible(child) && child->sym == def_sym)
900692d97c3Snir.tzachar@gmail.com 				def_menu = child;
901692d97c3Snir.tzachar@gmail.com 		}
902692d97c3Snir.tzachar@gmail.com 
903692d97c3Snir.tzachar@gmail.com 		val = sym_get_tristate_value(sym);
904692d97c3Snir.tzachar@gmail.com 		if (sym_is_changable(sym)) {
905692d97c3Snir.tzachar@gmail.com 			switch (type) {
906692d97c3Snir.tzachar@gmail.com 			case S_BOOLEAN:
907692d97c3Snir.tzachar@gmail.com 				item_make(menu, 't', "[%c]",
908692d97c3Snir.tzachar@gmail.com 						val == no ? ' ' : '*');
909692d97c3Snir.tzachar@gmail.com 				break;
910692d97c3Snir.tzachar@gmail.com 			case S_TRISTATE:
911692d97c3Snir.tzachar@gmail.com 				switch (val) {
912692d97c3Snir.tzachar@gmail.com 				case yes:
913692d97c3Snir.tzachar@gmail.com 					ch = '*';
914692d97c3Snir.tzachar@gmail.com 					break;
915692d97c3Snir.tzachar@gmail.com 				case mod:
916692d97c3Snir.tzachar@gmail.com 					ch = 'M';
917692d97c3Snir.tzachar@gmail.com 					break;
918692d97c3Snir.tzachar@gmail.com 				default:
919692d97c3Snir.tzachar@gmail.com 					ch = ' ';
920692d97c3Snir.tzachar@gmail.com 					break;
921692d97c3Snir.tzachar@gmail.com 				}
922692d97c3Snir.tzachar@gmail.com 				item_make(menu, 't', "<%c>", ch);
923692d97c3Snir.tzachar@gmail.com 				break;
924692d97c3Snir.tzachar@gmail.com 			}
925692d97c3Snir.tzachar@gmail.com 		} else {
926692d97c3Snir.tzachar@gmail.com 			item_make(menu, def_menu ? 't' : ':', "   ");
927692d97c3Snir.tzachar@gmail.com 		}
928692d97c3Snir.tzachar@gmail.com 
929692d97c3Snir.tzachar@gmail.com 		item_add_str("%*c%s", indent + 1,
930692d97c3Snir.tzachar@gmail.com 				' ', _(menu_get_prompt(menu)));
931692d97c3Snir.tzachar@gmail.com 		if (val == yes) {
932692d97c3Snir.tzachar@gmail.com 			if (def_menu) {
933692d97c3Snir.tzachar@gmail.com 				item_add_str(" (%s)",
934692d97c3Snir.tzachar@gmail.com 					_(menu_get_prompt(def_menu)));
935692d97c3Snir.tzachar@gmail.com 				item_add_str("  --->");
936692d97c3Snir.tzachar@gmail.com 				if (def_menu->list) {
937692d97c3Snir.tzachar@gmail.com 					indent += 2;
938692d97c3Snir.tzachar@gmail.com 					build_conf(def_menu);
939692d97c3Snir.tzachar@gmail.com 					indent -= 2;
940692d97c3Snir.tzachar@gmail.com 				}
941692d97c3Snir.tzachar@gmail.com 			}
942692d97c3Snir.tzachar@gmail.com 			return;
943692d97c3Snir.tzachar@gmail.com 		}
944692d97c3Snir.tzachar@gmail.com 	} else {
945692d97c3Snir.tzachar@gmail.com 		if (menu == current_menu) {
946692d97c3Snir.tzachar@gmail.com 			item_make(menu, ':',
947692d97c3Snir.tzachar@gmail.com 				"---%*c%s", indent + 1,
948692d97c3Snir.tzachar@gmail.com 				' ', _(menu_get_prompt(menu)));
949692d97c3Snir.tzachar@gmail.com 			goto conf_childs;
950692d97c3Snir.tzachar@gmail.com 		}
951692d97c3Snir.tzachar@gmail.com 		child_count++;
952692d97c3Snir.tzachar@gmail.com 		val = sym_get_tristate_value(sym);
953692d97c3Snir.tzachar@gmail.com 		if (sym_is_choice_value(sym) && val == yes) {
954692d97c3Snir.tzachar@gmail.com 			item_make(menu, ':', "   ");
955692d97c3Snir.tzachar@gmail.com 		} else {
956692d97c3Snir.tzachar@gmail.com 			switch (type) {
957692d97c3Snir.tzachar@gmail.com 			case S_BOOLEAN:
958692d97c3Snir.tzachar@gmail.com 				if (sym_is_changable(sym))
959692d97c3Snir.tzachar@gmail.com 					item_make(menu, 't', "[%c]",
960692d97c3Snir.tzachar@gmail.com 						val == no ? ' ' : '*');
961692d97c3Snir.tzachar@gmail.com 				else
962692d97c3Snir.tzachar@gmail.com 					item_make(menu, 't', "-%c-",
963692d97c3Snir.tzachar@gmail.com 						val == no ? ' ' : '*');
964692d97c3Snir.tzachar@gmail.com 				break;
965692d97c3Snir.tzachar@gmail.com 			case S_TRISTATE:
966692d97c3Snir.tzachar@gmail.com 				switch (val) {
967692d97c3Snir.tzachar@gmail.com 				case yes:
968692d97c3Snir.tzachar@gmail.com 					ch = '*';
969692d97c3Snir.tzachar@gmail.com 					break;
970692d97c3Snir.tzachar@gmail.com 				case mod:
971692d97c3Snir.tzachar@gmail.com 					ch = 'M';
972692d97c3Snir.tzachar@gmail.com 					break;
973692d97c3Snir.tzachar@gmail.com 				default:
974692d97c3Snir.tzachar@gmail.com 					ch = ' ';
975692d97c3Snir.tzachar@gmail.com 					break;
976692d97c3Snir.tzachar@gmail.com 				}
977692d97c3Snir.tzachar@gmail.com 				if (sym_is_changable(sym)) {
978692d97c3Snir.tzachar@gmail.com 					if (sym->rev_dep.tri == mod)
979692d97c3Snir.tzachar@gmail.com 						item_make(menu,
980692d97c3Snir.tzachar@gmail.com 							't', "{%c}", ch);
981692d97c3Snir.tzachar@gmail.com 					else
982692d97c3Snir.tzachar@gmail.com 						item_make(menu,
983692d97c3Snir.tzachar@gmail.com 							't', "<%c>", ch);
984692d97c3Snir.tzachar@gmail.com 				} else
985692d97c3Snir.tzachar@gmail.com 					item_make(menu, 't', "-%c-", ch);
986692d97c3Snir.tzachar@gmail.com 				break;
987692d97c3Snir.tzachar@gmail.com 			default:
988692d97c3Snir.tzachar@gmail.com 				tmp = 2 + strlen(sym_get_string_value(sym));
989692d97c3Snir.tzachar@gmail.com 				item_make(menu, 's', "    (%s)",
990692d97c3Snir.tzachar@gmail.com 						sym_get_string_value(sym));
991692d97c3Snir.tzachar@gmail.com 				tmp = indent - tmp + 4;
992692d97c3Snir.tzachar@gmail.com 				if (tmp < 0)
993692d97c3Snir.tzachar@gmail.com 					tmp = 0;
994692d97c3Snir.tzachar@gmail.com 				item_add_str("%*c%s%s", tmp, ' ',
995692d97c3Snir.tzachar@gmail.com 						_(menu_get_prompt(menu)),
996692d97c3Snir.tzachar@gmail.com 						(sym_has_value(sym) ||
997692d97c3Snir.tzachar@gmail.com 						 !sym_is_changable(sym)) ? "" :
998692d97c3Snir.tzachar@gmail.com 						_(" (NEW)"));
999692d97c3Snir.tzachar@gmail.com 				goto conf_childs;
1000692d97c3Snir.tzachar@gmail.com 			}
1001692d97c3Snir.tzachar@gmail.com 		}
1002692d97c3Snir.tzachar@gmail.com 		item_add_str("%*c%s%s", indent + 1, ' ',
1003692d97c3Snir.tzachar@gmail.com 				_(menu_get_prompt(menu)),
1004692d97c3Snir.tzachar@gmail.com 				(sym_has_value(sym) || !sym_is_changable(sym)) ?
1005692d97c3Snir.tzachar@gmail.com 				"" : _(" (NEW)"));
1006692d97c3Snir.tzachar@gmail.com 		if (menu->prompt && menu->prompt->type == P_MENU) {
1007692d97c3Snir.tzachar@gmail.com 			item_add_str("  --->");
1008692d97c3Snir.tzachar@gmail.com 			return;
1009692d97c3Snir.tzachar@gmail.com 		}
1010692d97c3Snir.tzachar@gmail.com 	}
1011692d97c3Snir.tzachar@gmail.com 
1012692d97c3Snir.tzachar@gmail.com conf_childs:
1013692d97c3Snir.tzachar@gmail.com 	indent += doint;
1014692d97c3Snir.tzachar@gmail.com 	for (child = menu->list; child; child = child->next)
1015692d97c3Snir.tzachar@gmail.com 		build_conf(child);
1016692d97c3Snir.tzachar@gmail.com 	indent -= doint;
1017692d97c3Snir.tzachar@gmail.com }
1018692d97c3Snir.tzachar@gmail.com 
1019692d97c3Snir.tzachar@gmail.com static void reset_menu(void)
1020692d97c3Snir.tzachar@gmail.com {
1021692d97c3Snir.tzachar@gmail.com 	unpost_menu(curses_menu);
1022692d97c3Snir.tzachar@gmail.com 	clean_items();
1023692d97c3Snir.tzachar@gmail.com }
1024692d97c3Snir.tzachar@gmail.com 
1025692d97c3Snir.tzachar@gmail.com /* adjust the menu to show this item.
1026692d97c3Snir.tzachar@gmail.com  * prefer not to scroll the menu if possible*/
1027692d97c3Snir.tzachar@gmail.com static void center_item(int selected_index, int *last_top_row)
1028692d97c3Snir.tzachar@gmail.com {
1029692d97c3Snir.tzachar@gmail.com 	int toprow;
1030692d97c3Snir.tzachar@gmail.com 	int maxy, maxx;
1031692d97c3Snir.tzachar@gmail.com 
1032692d97c3Snir.tzachar@gmail.com 	scale_menu(curses_menu, &maxy, &maxx);
1033692d97c3Snir.tzachar@gmail.com 	set_top_row(curses_menu, *last_top_row);
1034692d97c3Snir.tzachar@gmail.com 	toprow = top_row(curses_menu);
1035692d97c3Snir.tzachar@gmail.com 	if (selected_index >= toprow && selected_index < toprow+maxy) {
1036692d97c3Snir.tzachar@gmail.com 		/* we can only move the selected item. no need to scroll */
1037692d97c3Snir.tzachar@gmail.com 		set_current_item(curses_menu,
1038692d97c3Snir.tzachar@gmail.com 				curses_menu_items[selected_index]);
1039692d97c3Snir.tzachar@gmail.com 	} else {
1040692d97c3Snir.tzachar@gmail.com 		toprow = max(selected_index-maxy/2, 0);
1041692d97c3Snir.tzachar@gmail.com 		if (toprow >= item_count(curses_menu)-maxy)
1042692d97c3Snir.tzachar@gmail.com 			toprow = item_count(curses_menu)-mwin_max_lines;
1043692d97c3Snir.tzachar@gmail.com 		set_top_row(curses_menu, toprow);
1044692d97c3Snir.tzachar@gmail.com 		set_current_item(curses_menu,
1045692d97c3Snir.tzachar@gmail.com 				curses_menu_items[selected_index]);
1046692d97c3Snir.tzachar@gmail.com 	}
1047692d97c3Snir.tzachar@gmail.com 	*last_top_row = toprow;
1048692d97c3Snir.tzachar@gmail.com 	post_menu(curses_menu);
1049692d97c3Snir.tzachar@gmail.com 	refresh_all_windows(main_window);
1050692d97c3Snir.tzachar@gmail.com }
1051692d97c3Snir.tzachar@gmail.com 
1052692d97c3Snir.tzachar@gmail.com /* this function assumes reset_menu has been called before */
1053692d97c3Snir.tzachar@gmail.com static void show_menu(const char *prompt, const char *instructions,
1054692d97c3Snir.tzachar@gmail.com 		int selected_index, int *last_top_row)
1055692d97c3Snir.tzachar@gmail.com {
1056692d97c3Snir.tzachar@gmail.com 	int maxx, maxy;
1057692d97c3Snir.tzachar@gmail.com 	WINDOW *menu_window;
1058692d97c3Snir.tzachar@gmail.com 
1059692d97c3Snir.tzachar@gmail.com 	current_instructions = instructions;
1060692d97c3Snir.tzachar@gmail.com 
1061692d97c3Snir.tzachar@gmail.com 	clear();
1062692d97c3Snir.tzachar@gmail.com 	wattrset(main_window, attributes[NORMAL]);
1063692d97c3Snir.tzachar@gmail.com 	print_in_middle(stdscr, 1, 0, COLS,
1064692d97c3Snir.tzachar@gmail.com 			menu_backtitle,
1065692d97c3Snir.tzachar@gmail.com 			attributes[MAIN_HEADING]);
1066692d97c3Snir.tzachar@gmail.com 
1067692d97c3Snir.tzachar@gmail.com 	wattrset(main_window, attributes[MAIN_MENU_BOX]);
1068692d97c3Snir.tzachar@gmail.com 	box(main_window, 0, 0);
1069692d97c3Snir.tzachar@gmail.com 	wattrset(main_window, attributes[MAIN_MENU_HEADING]);
1070692d97c3Snir.tzachar@gmail.com 	mvwprintw(main_window, 0, 3, " %s ", prompt);
1071692d97c3Snir.tzachar@gmail.com 	wattrset(main_window, attributes[NORMAL]);
1072692d97c3Snir.tzachar@gmail.com 
1073692d97c3Snir.tzachar@gmail.com 	set_menu_items(curses_menu, curses_menu_items);
1074692d97c3Snir.tzachar@gmail.com 
1075692d97c3Snir.tzachar@gmail.com 	/* position the menu at the middle of the screen */
1076692d97c3Snir.tzachar@gmail.com 	scale_menu(curses_menu, &maxy, &maxx);
107768c16eddSNir Tzachar 	maxx = min(maxx, mwin_max_cols-2);
107868c16eddSNir Tzachar 	maxy = mwin_max_lines-2;
1079692d97c3Snir.tzachar@gmail.com 	menu_window = derwin(main_window,
1080692d97c3Snir.tzachar@gmail.com 			maxy,
1081692d97c3Snir.tzachar@gmail.com 			maxx,
1082692d97c3Snir.tzachar@gmail.com 			2,
1083692d97c3Snir.tzachar@gmail.com 			(mwin_max_cols-maxx)/2);
1084692d97c3Snir.tzachar@gmail.com 	keypad(menu_window, TRUE);
1085692d97c3Snir.tzachar@gmail.com 	set_menu_win(curses_menu, menu_window);
1086692d97c3Snir.tzachar@gmail.com 	set_menu_sub(curses_menu, menu_window);
1087692d97c3Snir.tzachar@gmail.com 
1088692d97c3Snir.tzachar@gmail.com 	/* must reassert this after changing items, otherwise returns to a
1089692d97c3Snir.tzachar@gmail.com 	 * default of 16
1090692d97c3Snir.tzachar@gmail.com 	 */
1091692d97c3Snir.tzachar@gmail.com 	set_menu_format(curses_menu, maxy, 1);
1092692d97c3Snir.tzachar@gmail.com 	center_item(selected_index, last_top_row);
1093692d97c3Snir.tzachar@gmail.com 	set_menu_format(curses_menu, maxy, 1);
1094692d97c3Snir.tzachar@gmail.com 
1095692d97c3Snir.tzachar@gmail.com 	print_function_line();
1096692d97c3Snir.tzachar@gmail.com 
1097692d97c3Snir.tzachar@gmail.com 	/* Post the menu */
1098692d97c3Snir.tzachar@gmail.com 	post_menu(curses_menu);
1099692d97c3Snir.tzachar@gmail.com 	refresh_all_windows(main_window);
1100692d97c3Snir.tzachar@gmail.com }
1101692d97c3Snir.tzachar@gmail.com 
1102692d97c3Snir.tzachar@gmail.com 
1103692d97c3Snir.tzachar@gmail.com static void conf(struct menu *menu)
1104692d97c3Snir.tzachar@gmail.com {
1105692d97c3Snir.tzachar@gmail.com 	char pattern[256];
1106692d97c3Snir.tzachar@gmail.com 	struct menu *submenu = 0;
1107692d97c3Snir.tzachar@gmail.com 	const char *prompt = menu_get_prompt(menu);
1108692d97c3Snir.tzachar@gmail.com 	struct symbol *sym;
1109692d97c3Snir.tzachar@gmail.com 	struct menu *active_menu = NULL;
1110692d97c3Snir.tzachar@gmail.com 	int res;
1111692d97c3Snir.tzachar@gmail.com 	int current_index = 0;
1112692d97c3Snir.tzachar@gmail.com 	int last_top_row = 0;
1113692d97c3Snir.tzachar@gmail.com 
1114692d97c3Snir.tzachar@gmail.com 	bzero(pattern, sizeof(pattern));
1115692d97c3Snir.tzachar@gmail.com 
1116692d97c3Snir.tzachar@gmail.com 	while (!global_exit) {
1117692d97c3Snir.tzachar@gmail.com 		reset_menu();
1118692d97c3Snir.tzachar@gmail.com 		current_menu = menu;
1119692d97c3Snir.tzachar@gmail.com 		build_conf(menu);
1120692d97c3Snir.tzachar@gmail.com 		if (!child_count)
1121692d97c3Snir.tzachar@gmail.com 			break;
1122692d97c3Snir.tzachar@gmail.com 
1123692d97c3Snir.tzachar@gmail.com 		show_menu(prompt ? _(prompt) : _("Main Menu"),
1124692d97c3Snir.tzachar@gmail.com 				_(menu_instructions),
1125692d97c3Snir.tzachar@gmail.com 				current_index, &last_top_row);
1126692d97c3Snir.tzachar@gmail.com 		keypad((menu_win(curses_menu)), TRUE);
1127692d97c3Snir.tzachar@gmail.com 		while (!global_exit && (res = wgetch(menu_win(curses_menu)))) {
1128692d97c3Snir.tzachar@gmail.com 			if (process_special_keys(&res,
1129692d97c3Snir.tzachar@gmail.com 						(struct menu *) item_data()))
1130692d97c3Snir.tzachar@gmail.com 				break;
1131692d97c3Snir.tzachar@gmail.com 			switch (res) {
1132692d97c3Snir.tzachar@gmail.com 			case KEY_DOWN:
1133692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_DOWN_ITEM);
1134692d97c3Snir.tzachar@gmail.com 				break;
1135692d97c3Snir.tzachar@gmail.com 			case KEY_UP:
1136692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_UP_ITEM);
1137692d97c3Snir.tzachar@gmail.com 				break;
1138692d97c3Snir.tzachar@gmail.com 			case KEY_NPAGE:
1139692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_SCR_DPAGE);
1140692d97c3Snir.tzachar@gmail.com 				break;
1141692d97c3Snir.tzachar@gmail.com 			case KEY_PPAGE:
1142692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_SCR_UPAGE);
1143692d97c3Snir.tzachar@gmail.com 				break;
1144692d97c3Snir.tzachar@gmail.com 			case KEY_HOME:
1145692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_FIRST_ITEM);
1146692d97c3Snir.tzachar@gmail.com 				break;
1147692d97c3Snir.tzachar@gmail.com 			case KEY_END:
1148692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_LAST_ITEM);
1149692d97c3Snir.tzachar@gmail.com 				break;
1150692d97c3Snir.tzachar@gmail.com 			case 'h':
1151692d97c3Snir.tzachar@gmail.com 			case '?':
1152692d97c3Snir.tzachar@gmail.com 				show_help((struct menu *) item_data());
1153692d97c3Snir.tzachar@gmail.com 				break;
1154692d97c3Snir.tzachar@gmail.com 			}
1155692d97c3Snir.tzachar@gmail.com 			if (res == 10 || res == 27 ||
1156692d97c3Snir.tzachar@gmail.com 				res == 32 || res == 'n' || res == 'y' ||
1157692d97c3Snir.tzachar@gmail.com 				res == KEY_LEFT || res == KEY_RIGHT ||
1158692d97c3Snir.tzachar@gmail.com 				res == 'm' || res == '/')
1159692d97c3Snir.tzachar@gmail.com 				break;
1160692d97c3Snir.tzachar@gmail.com 			else if (canbhot(res)) {
1161692d97c3Snir.tzachar@gmail.com 				/* check for hot keys: */
1162692d97c3Snir.tzachar@gmail.com 				int tmp = get_next_hot(res);
1163692d97c3Snir.tzachar@gmail.com 				if (tmp != -1)
1164692d97c3Snir.tzachar@gmail.com 					center_item(tmp, &last_top_row);
1165692d97c3Snir.tzachar@gmail.com 			}
1166692d97c3Snir.tzachar@gmail.com 			refresh_all_windows(main_window);
1167692d97c3Snir.tzachar@gmail.com 		}
1168692d97c3Snir.tzachar@gmail.com 
1169692d97c3Snir.tzachar@gmail.com 		refresh_all_windows(main_window);
1170692d97c3Snir.tzachar@gmail.com 		/* if ESC  or left*/
1171692d97c3Snir.tzachar@gmail.com 		if (res == 27 || (menu != &rootmenu && res == KEY_LEFT))
1172692d97c3Snir.tzachar@gmail.com 			break;
1173692d97c3Snir.tzachar@gmail.com 
1174692d97c3Snir.tzachar@gmail.com 		/* remember location in the menu */
1175692d97c3Snir.tzachar@gmail.com 		last_top_row = top_row(curses_menu);
1176692d97c3Snir.tzachar@gmail.com 		current_index = curses_item_index();
1177692d97c3Snir.tzachar@gmail.com 
1178692d97c3Snir.tzachar@gmail.com 		if (!item_tag())
1179692d97c3Snir.tzachar@gmail.com 			continue;
1180692d97c3Snir.tzachar@gmail.com 
1181692d97c3Snir.tzachar@gmail.com 		submenu = (struct menu *) item_data();
1182692d97c3Snir.tzachar@gmail.com 		active_menu = (struct menu *)item_data();
1183692d97c3Snir.tzachar@gmail.com 		if (!submenu || !menu_is_visible(submenu))
1184692d97c3Snir.tzachar@gmail.com 			continue;
1185692d97c3Snir.tzachar@gmail.com 		if (submenu)
1186692d97c3Snir.tzachar@gmail.com 			sym = submenu->sym;
1187692d97c3Snir.tzachar@gmail.com 		else
1188692d97c3Snir.tzachar@gmail.com 			sym = NULL;
1189692d97c3Snir.tzachar@gmail.com 
1190692d97c3Snir.tzachar@gmail.com 		switch (res) {
1191692d97c3Snir.tzachar@gmail.com 		case ' ':
1192692d97c3Snir.tzachar@gmail.com 			if (item_is_tag('t'))
1193692d97c3Snir.tzachar@gmail.com 				sym_toggle_tristate_value(sym);
1194692d97c3Snir.tzachar@gmail.com 			else if (item_is_tag('m'))
1195692d97c3Snir.tzachar@gmail.com 				conf(submenu);
1196692d97c3Snir.tzachar@gmail.com 			break;
1197692d97c3Snir.tzachar@gmail.com 		case KEY_RIGHT:
1198692d97c3Snir.tzachar@gmail.com 		case 10: /* ENTER WAS PRESSED */
1199692d97c3Snir.tzachar@gmail.com 			switch (item_tag()) {
1200692d97c3Snir.tzachar@gmail.com 			case 'm':
1201692d97c3Snir.tzachar@gmail.com 				if (single_menu_mode)
1202692d97c3Snir.tzachar@gmail.com 					submenu->data =
1203692d97c3Snir.tzachar@gmail.com 						(void *) (long) !submenu->data;
1204692d97c3Snir.tzachar@gmail.com 				else
1205692d97c3Snir.tzachar@gmail.com 					conf(submenu);
1206692d97c3Snir.tzachar@gmail.com 				break;
1207692d97c3Snir.tzachar@gmail.com 			case 't':
1208692d97c3Snir.tzachar@gmail.com 				if (sym_is_choice(sym) &&
1209692d97c3Snir.tzachar@gmail.com 				    sym_get_tristate_value(sym) == yes)
1210692d97c3Snir.tzachar@gmail.com 					conf_choice(submenu);
1211692d97c3Snir.tzachar@gmail.com 				else if (submenu->prompt &&
1212692d97c3Snir.tzachar@gmail.com 					 submenu->prompt->type == P_MENU)
1213692d97c3Snir.tzachar@gmail.com 					conf(submenu);
1214692d97c3Snir.tzachar@gmail.com 				else if (res == 10)
1215692d97c3Snir.tzachar@gmail.com 					sym_toggle_tristate_value(sym);
1216692d97c3Snir.tzachar@gmail.com 				break;
1217692d97c3Snir.tzachar@gmail.com 			case 's':
1218692d97c3Snir.tzachar@gmail.com 				conf_string(submenu);
1219692d97c3Snir.tzachar@gmail.com 				break;
1220692d97c3Snir.tzachar@gmail.com 			}
1221692d97c3Snir.tzachar@gmail.com 			break;
1222692d97c3Snir.tzachar@gmail.com 		case 'y':
1223692d97c3Snir.tzachar@gmail.com 			if (item_is_tag('t')) {
1224692d97c3Snir.tzachar@gmail.com 				if (sym_set_tristate_value(sym, yes))
1225692d97c3Snir.tzachar@gmail.com 					break;
1226692d97c3Snir.tzachar@gmail.com 				if (sym_set_tristate_value(sym, mod))
1227692d97c3Snir.tzachar@gmail.com 					btn_dialog(main_window, setmod_text, 0);
1228692d97c3Snir.tzachar@gmail.com 			}
1229692d97c3Snir.tzachar@gmail.com 			break;
1230692d97c3Snir.tzachar@gmail.com 		case 'n':
1231692d97c3Snir.tzachar@gmail.com 			if (item_is_tag('t'))
1232692d97c3Snir.tzachar@gmail.com 				sym_set_tristate_value(sym, no);
1233692d97c3Snir.tzachar@gmail.com 			break;
1234692d97c3Snir.tzachar@gmail.com 		case 'm':
1235692d97c3Snir.tzachar@gmail.com 			if (item_is_tag('t'))
1236692d97c3Snir.tzachar@gmail.com 				sym_set_tristate_value(sym, mod);
1237692d97c3Snir.tzachar@gmail.com 			break;
1238692d97c3Snir.tzachar@gmail.com 		case '/':
1239692d97c3Snir.tzachar@gmail.com 			search_conf();
1240692d97c3Snir.tzachar@gmail.com 			break;
1241692d97c3Snir.tzachar@gmail.com 		}
1242692d97c3Snir.tzachar@gmail.com 	}
1243692d97c3Snir.tzachar@gmail.com }
1244692d97c3Snir.tzachar@gmail.com 
1245692d97c3Snir.tzachar@gmail.com static void show_help(struct menu *menu)
1246692d97c3Snir.tzachar@gmail.com {
1247692d97c3Snir.tzachar@gmail.com 	struct gstr help = str_new();
1248692d97c3Snir.tzachar@gmail.com 
1249692d97c3Snir.tzachar@gmail.com 	if (menu && menu->sym && menu_has_help(menu)) {
1250692d97c3Snir.tzachar@gmail.com 		if (menu->sym->name) {
1251692d97c3Snir.tzachar@gmail.com 			str_printf(&help, "CONFIG_%s:\n\n", menu->sym->name);
1252692d97c3Snir.tzachar@gmail.com 			str_append(&help, _(menu_get_help(menu)));
1253692d97c3Snir.tzachar@gmail.com 			str_append(&help, "\n");
1254692d97c3Snir.tzachar@gmail.com 			get_symbol_str(&help, menu->sym);
1255692d97c3Snir.tzachar@gmail.com 		}
1256692d97c3Snir.tzachar@gmail.com 	} else {
1257692d97c3Snir.tzachar@gmail.com 		str_append(&help, nohelp_text);
1258692d97c3Snir.tzachar@gmail.com 	}
1259692d97c3Snir.tzachar@gmail.com 	show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help));
1260692d97c3Snir.tzachar@gmail.com 	str_free(&help);
1261692d97c3Snir.tzachar@gmail.com }
1262692d97c3Snir.tzachar@gmail.com 
1263692d97c3Snir.tzachar@gmail.com static void conf_choice(struct menu *menu)
1264692d97c3Snir.tzachar@gmail.com {
1265692d97c3Snir.tzachar@gmail.com 	const char *prompt = _(menu_get_prompt(menu));
1266692d97c3Snir.tzachar@gmail.com 	struct menu *child = 0;
1267692d97c3Snir.tzachar@gmail.com 	struct symbol *active;
1268692d97c3Snir.tzachar@gmail.com 	int selected_index = 0;
1269692d97c3Snir.tzachar@gmail.com 	int last_top_row = 0;
1270692d97c3Snir.tzachar@gmail.com 	int res, i = 0;
1271692d97c3Snir.tzachar@gmail.com 
1272692d97c3Snir.tzachar@gmail.com 	active = sym_get_choice_value(menu->sym);
1273692d97c3Snir.tzachar@gmail.com 	/* this is mostly duplicated from the conf() function. */
1274692d97c3Snir.tzachar@gmail.com 	while (!global_exit) {
1275692d97c3Snir.tzachar@gmail.com 		reset_menu();
1276692d97c3Snir.tzachar@gmail.com 
1277692d97c3Snir.tzachar@gmail.com 		for (i = 0, child = menu->list; child; child = child->next) {
1278692d97c3Snir.tzachar@gmail.com 			if (!show_all_items && !menu_is_visible(child))
1279692d97c3Snir.tzachar@gmail.com 				continue;
1280692d97c3Snir.tzachar@gmail.com 
1281692d97c3Snir.tzachar@gmail.com 			if (child->sym == sym_get_choice_value(menu->sym))
1282692d97c3Snir.tzachar@gmail.com 				item_make(child, ':', "<X> %s",
1283692d97c3Snir.tzachar@gmail.com 						_(menu_get_prompt(child)));
1284692d97c3Snir.tzachar@gmail.com 			else
1285692d97c3Snir.tzachar@gmail.com 				item_make(child, ':', "    %s",
1286692d97c3Snir.tzachar@gmail.com 						_(menu_get_prompt(child)));
1287692d97c3Snir.tzachar@gmail.com 			if (child->sym == active){
1288692d97c3Snir.tzachar@gmail.com 				last_top_row = top_row(curses_menu);
1289692d97c3Snir.tzachar@gmail.com 				selected_index = i;
1290692d97c3Snir.tzachar@gmail.com 			}
1291692d97c3Snir.tzachar@gmail.com 			i++;
1292692d97c3Snir.tzachar@gmail.com 		}
1293692d97c3Snir.tzachar@gmail.com 		show_menu(prompt ? _(prompt) : _("Choice Menu"),
1294692d97c3Snir.tzachar@gmail.com 				_(radiolist_instructions),
1295692d97c3Snir.tzachar@gmail.com 				selected_index,
1296692d97c3Snir.tzachar@gmail.com 				&last_top_row);
1297692d97c3Snir.tzachar@gmail.com 		while (!global_exit && (res = wgetch(menu_win(curses_menu)))) {
1298692d97c3Snir.tzachar@gmail.com 			if (process_special_keys(
1299692d97c3Snir.tzachar@gmail.com 						&res,
1300692d97c3Snir.tzachar@gmail.com 						(struct menu *) item_data()))
1301692d97c3Snir.tzachar@gmail.com 				break;
1302692d97c3Snir.tzachar@gmail.com 			switch (res) {
1303692d97c3Snir.tzachar@gmail.com 			case KEY_DOWN:
1304692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_DOWN_ITEM);
1305692d97c3Snir.tzachar@gmail.com 				break;
1306692d97c3Snir.tzachar@gmail.com 			case KEY_UP:
1307692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_UP_ITEM);
1308692d97c3Snir.tzachar@gmail.com 				break;
1309692d97c3Snir.tzachar@gmail.com 			case KEY_NPAGE:
1310692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_SCR_DPAGE);
1311692d97c3Snir.tzachar@gmail.com 				break;
1312692d97c3Snir.tzachar@gmail.com 			case KEY_PPAGE:
1313692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_SCR_UPAGE);
1314692d97c3Snir.tzachar@gmail.com 				break;
1315692d97c3Snir.tzachar@gmail.com 			case KEY_HOME:
1316692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_FIRST_ITEM);
1317692d97c3Snir.tzachar@gmail.com 				break;
1318692d97c3Snir.tzachar@gmail.com 			case KEY_END:
1319692d97c3Snir.tzachar@gmail.com 				menu_driver(curses_menu, REQ_LAST_ITEM);
1320692d97c3Snir.tzachar@gmail.com 				break;
1321692d97c3Snir.tzachar@gmail.com 			case 'h':
1322692d97c3Snir.tzachar@gmail.com 			case '?':
1323692d97c3Snir.tzachar@gmail.com 				show_help((struct menu *) item_data());
1324692d97c3Snir.tzachar@gmail.com 				break;
1325692d97c3Snir.tzachar@gmail.com 			}
1326692d97c3Snir.tzachar@gmail.com 			if (res == 10 || res == 27 || res == ' ' ||
1327692d97c3Snir.tzachar@gmail.com 				res == KEY_LEFT)
1328692d97c3Snir.tzachar@gmail.com 				break;
1329692d97c3Snir.tzachar@gmail.com 			else if (canbhot(res)) {
1330692d97c3Snir.tzachar@gmail.com 				/* check for hot keys: */
1331692d97c3Snir.tzachar@gmail.com 				int tmp = get_next_hot(res);
1332692d97c3Snir.tzachar@gmail.com 				if (tmp != -1)
1333692d97c3Snir.tzachar@gmail.com 					center_item(tmp, &last_top_row);
1334692d97c3Snir.tzachar@gmail.com 			}
1335692d97c3Snir.tzachar@gmail.com 			refresh_all_windows(main_window);
1336692d97c3Snir.tzachar@gmail.com 		}
1337692d97c3Snir.tzachar@gmail.com 		/* if ESC or left */
1338692d97c3Snir.tzachar@gmail.com 		if (res == 27 || res == KEY_LEFT)
1339692d97c3Snir.tzachar@gmail.com 			break;
1340692d97c3Snir.tzachar@gmail.com 
1341692d97c3Snir.tzachar@gmail.com 		child = item_data();
1342692d97c3Snir.tzachar@gmail.com 		if (!child || !menu_is_visible(child))
1343692d97c3Snir.tzachar@gmail.com 			continue;
1344692d97c3Snir.tzachar@gmail.com 		switch (res) {
1345692d97c3Snir.tzachar@gmail.com 		case ' ':
1346692d97c3Snir.tzachar@gmail.com 		case  10:
1347692d97c3Snir.tzachar@gmail.com 		case KEY_RIGHT:
1348692d97c3Snir.tzachar@gmail.com 			sym_set_tristate_value(child->sym, yes);
1349692d97c3Snir.tzachar@gmail.com 			return;
1350692d97c3Snir.tzachar@gmail.com 		case 'h':
1351692d97c3Snir.tzachar@gmail.com 		case '?':
1352692d97c3Snir.tzachar@gmail.com 			show_help(child);
1353692d97c3Snir.tzachar@gmail.com 			active = child->sym;
1354692d97c3Snir.tzachar@gmail.com 			break;
1355692d97c3Snir.tzachar@gmail.com 		case KEY_EXIT:
1356692d97c3Snir.tzachar@gmail.com 			return;
1357692d97c3Snir.tzachar@gmail.com 		}
1358692d97c3Snir.tzachar@gmail.com 	}
1359692d97c3Snir.tzachar@gmail.com }
1360692d97c3Snir.tzachar@gmail.com 
1361692d97c3Snir.tzachar@gmail.com static void conf_string(struct menu *menu)
1362692d97c3Snir.tzachar@gmail.com {
1363692d97c3Snir.tzachar@gmail.com 	const char *prompt = menu_get_prompt(menu);
1364692d97c3Snir.tzachar@gmail.com 	char dialog_input_result[256];
1365692d97c3Snir.tzachar@gmail.com 
1366692d97c3Snir.tzachar@gmail.com 	while (1) {
1367692d97c3Snir.tzachar@gmail.com 		int res;
1368692d97c3Snir.tzachar@gmail.com 		const char *heading;
1369692d97c3Snir.tzachar@gmail.com 
1370692d97c3Snir.tzachar@gmail.com 		switch (sym_get_type(menu->sym)) {
1371692d97c3Snir.tzachar@gmail.com 		case S_INT:
1372692d97c3Snir.tzachar@gmail.com 			heading = _(inputbox_instructions_int);
1373692d97c3Snir.tzachar@gmail.com 			break;
1374692d97c3Snir.tzachar@gmail.com 		case S_HEX:
1375692d97c3Snir.tzachar@gmail.com 			heading = _(inputbox_instructions_hex);
1376692d97c3Snir.tzachar@gmail.com 			break;
1377692d97c3Snir.tzachar@gmail.com 		case S_STRING:
1378692d97c3Snir.tzachar@gmail.com 			heading = _(inputbox_instructions_string);
1379692d97c3Snir.tzachar@gmail.com 			break;
1380692d97c3Snir.tzachar@gmail.com 		default:
1381692d97c3Snir.tzachar@gmail.com 			heading = _("Internal nconf error!");
1382692d97c3Snir.tzachar@gmail.com 		}
1383692d97c3Snir.tzachar@gmail.com 		res = dialog_inputbox(main_window,
1384692d97c3Snir.tzachar@gmail.com 				prompt ? _(prompt) : _("Main Menu"),
1385692d97c3Snir.tzachar@gmail.com 				heading,
1386692d97c3Snir.tzachar@gmail.com 				sym_get_string_value(menu->sym),
1387692d97c3Snir.tzachar@gmail.com 				dialog_input_result,
1388692d97c3Snir.tzachar@gmail.com 				sizeof(dialog_input_result));
1389692d97c3Snir.tzachar@gmail.com 		switch (res) {
1390692d97c3Snir.tzachar@gmail.com 		case 0:
1391692d97c3Snir.tzachar@gmail.com 			if (sym_set_string_value(menu->sym,
1392692d97c3Snir.tzachar@gmail.com 						dialog_input_result))
1393692d97c3Snir.tzachar@gmail.com 				return;
1394692d97c3Snir.tzachar@gmail.com 			btn_dialog(main_window,
1395692d97c3Snir.tzachar@gmail.com 				_("You have made an invalid entry."), 0);
1396692d97c3Snir.tzachar@gmail.com 			break;
1397692d97c3Snir.tzachar@gmail.com 		case 1:
1398692d97c3Snir.tzachar@gmail.com 			show_help(menu);
1399692d97c3Snir.tzachar@gmail.com 			break;
1400692d97c3Snir.tzachar@gmail.com 		case KEY_EXIT:
1401692d97c3Snir.tzachar@gmail.com 			return;
1402692d97c3Snir.tzachar@gmail.com 		}
1403692d97c3Snir.tzachar@gmail.com 	}
1404692d97c3Snir.tzachar@gmail.com }
1405692d97c3Snir.tzachar@gmail.com 
1406692d97c3Snir.tzachar@gmail.com static void conf_load(void)
1407692d97c3Snir.tzachar@gmail.com {
1408692d97c3Snir.tzachar@gmail.com 	char dialog_input_result[256];
1409692d97c3Snir.tzachar@gmail.com 	while (1) {
1410692d97c3Snir.tzachar@gmail.com 		int res;
1411692d97c3Snir.tzachar@gmail.com 		res = dialog_inputbox(main_window,
1412692d97c3Snir.tzachar@gmail.com 				NULL, load_config_text,
1413692d97c3Snir.tzachar@gmail.com 				filename,
1414692d97c3Snir.tzachar@gmail.com 				dialog_input_result,
1415692d97c3Snir.tzachar@gmail.com 				sizeof(dialog_input_result));
1416692d97c3Snir.tzachar@gmail.com 		switch (res) {
1417692d97c3Snir.tzachar@gmail.com 		case 0:
1418692d97c3Snir.tzachar@gmail.com 			if (!dialog_input_result[0])
1419692d97c3Snir.tzachar@gmail.com 				return;
1420692d97c3Snir.tzachar@gmail.com 			if (!conf_read(dialog_input_result)) {
1421692d97c3Snir.tzachar@gmail.com 				set_config_filename(dialog_input_result);
1422692d97c3Snir.tzachar@gmail.com 				sym_set_change_count(1);
1423692d97c3Snir.tzachar@gmail.com 				return;
1424692d97c3Snir.tzachar@gmail.com 			}
1425692d97c3Snir.tzachar@gmail.com 			btn_dialog(main_window, _("File does not exist!"), 0);
1426692d97c3Snir.tzachar@gmail.com 			break;
1427692d97c3Snir.tzachar@gmail.com 		case 1:
1428692d97c3Snir.tzachar@gmail.com 			show_scroll_win(main_window,
1429692d97c3Snir.tzachar@gmail.com 					_("Load Alternate Configuration"),
1430692d97c3Snir.tzachar@gmail.com 					load_config_help);
1431692d97c3Snir.tzachar@gmail.com 			break;
1432692d97c3Snir.tzachar@gmail.com 		case KEY_EXIT:
1433692d97c3Snir.tzachar@gmail.com 			return;
1434692d97c3Snir.tzachar@gmail.com 		}
1435692d97c3Snir.tzachar@gmail.com 	}
1436692d97c3Snir.tzachar@gmail.com }
1437692d97c3Snir.tzachar@gmail.com 
1438692d97c3Snir.tzachar@gmail.com static void conf_save(void)
1439692d97c3Snir.tzachar@gmail.com {
1440692d97c3Snir.tzachar@gmail.com 	char dialog_input_result[256];
1441692d97c3Snir.tzachar@gmail.com 	while (1) {
1442692d97c3Snir.tzachar@gmail.com 		int res;
1443692d97c3Snir.tzachar@gmail.com 		res = dialog_inputbox(main_window,
1444692d97c3Snir.tzachar@gmail.com 				NULL, save_config_text,
1445692d97c3Snir.tzachar@gmail.com 				filename,
1446692d97c3Snir.tzachar@gmail.com 				dialog_input_result,
1447692d97c3Snir.tzachar@gmail.com 				sizeof(dialog_input_result));
1448692d97c3Snir.tzachar@gmail.com 		switch (res) {
1449692d97c3Snir.tzachar@gmail.com 		case 0:
1450692d97c3Snir.tzachar@gmail.com 			if (!dialog_input_result[0])
1451692d97c3Snir.tzachar@gmail.com 				return;
1452692d97c3Snir.tzachar@gmail.com 			supress_stdout(0);
1453692d97c3Snir.tzachar@gmail.com 			res = conf_write(dialog_input_result);
1454692d97c3Snir.tzachar@gmail.com 			supress_stdout(1);
1455692d97c3Snir.tzachar@gmail.com 			if (!res) {
1456692d97c3Snir.tzachar@gmail.com 				char buf[1024];
1457692d97c3Snir.tzachar@gmail.com 				sprintf(buf, "%s %s",
1458692d97c3Snir.tzachar@gmail.com 					_("configuration file saved to: "),
1459692d97c3Snir.tzachar@gmail.com 					dialog_input_result);
1460692d97c3Snir.tzachar@gmail.com 				btn_dialog(main_window,
1461692d97c3Snir.tzachar@gmail.com 					   buf, 1, "<OK>");
1462692d97c3Snir.tzachar@gmail.com 				set_config_filename(dialog_input_result);
1463692d97c3Snir.tzachar@gmail.com 				return;
1464692d97c3Snir.tzachar@gmail.com 			}
1465692d97c3Snir.tzachar@gmail.com 			btn_dialog(main_window, _("Can't create file! "
1466692d97c3Snir.tzachar@gmail.com 				"Probably a nonexistent directory."),
1467692d97c3Snir.tzachar@gmail.com 				1, "<OK>");
1468692d97c3Snir.tzachar@gmail.com 			break;
1469692d97c3Snir.tzachar@gmail.com 		case 1:
1470692d97c3Snir.tzachar@gmail.com 			show_scroll_win(main_window,
1471692d97c3Snir.tzachar@gmail.com 				_("Save Alternate Configuration"),
1472692d97c3Snir.tzachar@gmail.com 				save_config_help);
1473692d97c3Snir.tzachar@gmail.com 			break;
1474692d97c3Snir.tzachar@gmail.com 		case KEY_EXIT:
1475692d97c3Snir.tzachar@gmail.com 			return;
1476692d97c3Snir.tzachar@gmail.com 		}
1477692d97c3Snir.tzachar@gmail.com 	}
1478692d97c3Snir.tzachar@gmail.com }
1479692d97c3Snir.tzachar@gmail.com 
1480692d97c3Snir.tzachar@gmail.com void setup_windows(void)
1481692d97c3Snir.tzachar@gmail.com {
1482692d97c3Snir.tzachar@gmail.com 	if (main_window != NULL)
1483692d97c3Snir.tzachar@gmail.com 		delwin(main_window);
1484692d97c3Snir.tzachar@gmail.com 
1485692d97c3Snir.tzachar@gmail.com 	/* set up the menu and menu window */
1486692d97c3Snir.tzachar@gmail.com 	main_window = newwin(LINES-2, COLS-2, 2, 1);
1487692d97c3Snir.tzachar@gmail.com 	keypad(main_window, TRUE);
1488692d97c3Snir.tzachar@gmail.com 	mwin_max_lines = LINES-6;
1489692d97c3Snir.tzachar@gmail.com 	mwin_max_cols = COLS-6;
1490692d97c3Snir.tzachar@gmail.com 
1491692d97c3Snir.tzachar@gmail.com 	/* panels order is from bottom to top */
1492692d97c3Snir.tzachar@gmail.com 	new_panel(main_window);
1493692d97c3Snir.tzachar@gmail.com }
1494692d97c3Snir.tzachar@gmail.com 
1495692d97c3Snir.tzachar@gmail.com int main(int ac, char **av)
1496692d97c3Snir.tzachar@gmail.com {
1497692d97c3Snir.tzachar@gmail.com 	char *mode;
1498692d97c3Snir.tzachar@gmail.com 
1499692d97c3Snir.tzachar@gmail.com 	setlocale(LC_ALL, "");
1500692d97c3Snir.tzachar@gmail.com 	bindtextdomain(PACKAGE, LOCALEDIR);
1501692d97c3Snir.tzachar@gmail.com 	textdomain(PACKAGE);
1502692d97c3Snir.tzachar@gmail.com 
1503692d97c3Snir.tzachar@gmail.com 	conf_parse(av[1]);
1504692d97c3Snir.tzachar@gmail.com 	conf_read(NULL);
1505692d97c3Snir.tzachar@gmail.com 
1506692d97c3Snir.tzachar@gmail.com 	mode = getenv("NCONFIG_MODE");
1507692d97c3Snir.tzachar@gmail.com 	if (mode) {
1508692d97c3Snir.tzachar@gmail.com 		if (!strcasecmp(mode, "single_menu"))
1509692d97c3Snir.tzachar@gmail.com 			single_menu_mode = 1;
1510692d97c3Snir.tzachar@gmail.com 	}
1511692d97c3Snir.tzachar@gmail.com 
1512692d97c3Snir.tzachar@gmail.com 	/* Initialize curses */
1513692d97c3Snir.tzachar@gmail.com 	initscr();
1514692d97c3Snir.tzachar@gmail.com 	/* set color theme */
1515692d97c3Snir.tzachar@gmail.com 	set_colors();
1516692d97c3Snir.tzachar@gmail.com 
1517692d97c3Snir.tzachar@gmail.com 	cbreak();
1518692d97c3Snir.tzachar@gmail.com 	noecho();
1519692d97c3Snir.tzachar@gmail.com 	keypad(stdscr, TRUE);
1520692d97c3Snir.tzachar@gmail.com 	curs_set(0);
1521692d97c3Snir.tzachar@gmail.com 
1522692d97c3Snir.tzachar@gmail.com 	if (COLS < 75 || LINES < 20) {
1523692d97c3Snir.tzachar@gmail.com 		endwin();
1524692d97c3Snir.tzachar@gmail.com 		printf("Your terminal should have at "
1525692d97c3Snir.tzachar@gmail.com 			"least 20 lines and 75 columns\n");
1526692d97c3Snir.tzachar@gmail.com 		return 1;
1527692d97c3Snir.tzachar@gmail.com 	}
1528692d97c3Snir.tzachar@gmail.com 
1529692d97c3Snir.tzachar@gmail.com 	notimeout(stdscr, FALSE);
1530692d97c3Snir.tzachar@gmail.com 	ESCDELAY = 1;
1531692d97c3Snir.tzachar@gmail.com 
1532692d97c3Snir.tzachar@gmail.com 	/* set btns menu */
1533692d97c3Snir.tzachar@gmail.com 	curses_menu = new_menu(curses_menu_items);
1534692d97c3Snir.tzachar@gmail.com 	menu_opts_off(curses_menu, O_SHOWDESC);
1535692d97c3Snir.tzachar@gmail.com 	menu_opts_off(curses_menu, O_SHOWMATCH);
1536692d97c3Snir.tzachar@gmail.com 	menu_opts_on(curses_menu, O_ONEVALUE);
1537692d97c3Snir.tzachar@gmail.com 	menu_opts_on(curses_menu, O_NONCYCLIC);
1538692d97c3Snir.tzachar@gmail.com 	set_menu_mark(curses_menu, " ");
1539692d97c3Snir.tzachar@gmail.com 	set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]);
1540692d97c3Snir.tzachar@gmail.com 	set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]);
1541692d97c3Snir.tzachar@gmail.com 	set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]);
1542692d97c3Snir.tzachar@gmail.com 
1543692d97c3Snir.tzachar@gmail.com 	set_config_filename(conf_get_configname());
1544692d97c3Snir.tzachar@gmail.com 	setup_windows();
1545692d97c3Snir.tzachar@gmail.com 
1546692d97c3Snir.tzachar@gmail.com 	/* check for KEY_FUNC(1) */
1547692d97c3Snir.tzachar@gmail.com 	if (has_key(KEY_F(1)) == FALSE) {
1548692d97c3Snir.tzachar@gmail.com 		show_scroll_win(main_window,
1549692d97c3Snir.tzachar@gmail.com 				_("Instructions"),
1550692d97c3Snir.tzachar@gmail.com 				_(menu_no_f_instructions));
1551692d97c3Snir.tzachar@gmail.com 	}
1552692d97c3Snir.tzachar@gmail.com 
1553692d97c3Snir.tzachar@gmail.com 
1554692d97c3Snir.tzachar@gmail.com 
1555692d97c3Snir.tzachar@gmail.com 	/* do the work */
1556692d97c3Snir.tzachar@gmail.com 	while (!global_exit) {
1557692d97c3Snir.tzachar@gmail.com 		conf(&rootmenu);
1558692d97c3Snir.tzachar@gmail.com 		if (!global_exit && do_exit() == 0)
1559692d97c3Snir.tzachar@gmail.com 			break;
1560692d97c3Snir.tzachar@gmail.com 	}
1561692d97c3Snir.tzachar@gmail.com 	/* ok, we are done */
1562692d97c3Snir.tzachar@gmail.com 	unpost_menu(curses_menu);
1563692d97c3Snir.tzachar@gmail.com 	free_menu(curses_menu);
1564692d97c3Snir.tzachar@gmail.com 	delwin(main_window);
1565692d97c3Snir.tzachar@gmail.com 	clear();
1566692d97c3Snir.tzachar@gmail.com 	refresh();
1567692d97c3Snir.tzachar@gmail.com 	endwin();
1568692d97c3Snir.tzachar@gmail.com 	return 0;
1569692d97c3Snir.tzachar@gmail.com }
1570692d97c3Snir.tzachar@gmail.com 
1571