1*cf5a6c84SAndroid Build Coastguard Worker /*
2*cf5a6c84SAndroid Build Coastguard Worker * Copyright (C) 2002 Roman Zippel <[email protected]>
3*cf5a6c84SAndroid Build Coastguard Worker * Released under the terms of the GNU GPL v2.0.
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * Introduced single menu mode (show all sub-menus in one large tree).
6*cf5a6c84SAndroid Build Coastguard Worker * 2002-11-06 Petr Baudis <[email protected]>
7*cf5a6c84SAndroid Build Coastguard Worker *
8*cf5a6c84SAndroid Build Coastguard Worker * i18n, 2005, Arnaldo Carvalho de Melo <[email protected]>
9*cf5a6c84SAndroid Build Coastguard Worker */
10*cf5a6c84SAndroid Build Coastguard Worker
11*cf5a6c84SAndroid Build Coastguard Worker #include <sys/ioctl.h>
12*cf5a6c84SAndroid Build Coastguard Worker #include <sys/wait.h>
13*cf5a6c84SAndroid Build Coastguard Worker #include <ctype.h>
14*cf5a6c84SAndroid Build Coastguard Worker #include <errno.h>
15*cf5a6c84SAndroid Build Coastguard Worker #include <fcntl.h>
16*cf5a6c84SAndroid Build Coastguard Worker #include <limits.h>
17*cf5a6c84SAndroid Build Coastguard Worker #include <signal.h>
18*cf5a6c84SAndroid Build Coastguard Worker #include <stdarg.h>
19*cf5a6c84SAndroid Build Coastguard Worker #include <stdlib.h>
20*cf5a6c84SAndroid Build Coastguard Worker #include <string.h>
21*cf5a6c84SAndroid Build Coastguard Worker #include <termios.h>
22*cf5a6c84SAndroid Build Coastguard Worker #include <unistd.h>
23*cf5a6c84SAndroid Build Coastguard Worker #include <locale.h>
24*cf5a6c84SAndroid Build Coastguard Worker
25*cf5a6c84SAndroid Build Coastguard Worker #define LKC_DIRECT_LINK
26*cf5a6c84SAndroid Build Coastguard Worker #include "lkc.h"
27*cf5a6c84SAndroid Build Coastguard Worker #include "lxdialog/dialog.h"
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Worker static char menu_backtitle[128];
30*cf5a6c84SAndroid Build Coastguard Worker static const char mconf_readme[] = N_(
31*cf5a6c84SAndroid Build Coastguard Worker "Overview\n"
32*cf5a6c84SAndroid Build Coastguard Worker "--------\n"
33*cf5a6c84SAndroid Build Coastguard Worker "Some features may be built directly into the project.\n"
34*cf5a6c84SAndroid Build Coastguard Worker "Some may be made into loadable runtime modules. Some features\n"
35*cf5a6c84SAndroid Build Coastguard Worker "may be completely removed altogether. There are also certain\n"
36*cf5a6c84SAndroid Build Coastguard Worker "parameters which are not really features, but must be\n"
37*cf5a6c84SAndroid Build Coastguard Worker "entered in as decimal or hexadecimal numbers or possibly text.\n"
38*cf5a6c84SAndroid Build Coastguard Worker "\n"
39*cf5a6c84SAndroid Build Coastguard Worker "Menu items beginning with [*], <M> or [ ] represent features\n"
40*cf5a6c84SAndroid Build Coastguard Worker "configured to be built in, modularized or removed respectively.\n"
41*cf5a6c84SAndroid Build Coastguard Worker "Pointed brackets <> represent module capable features.\n"
42*cf5a6c84SAndroid Build Coastguard Worker "\n"
43*cf5a6c84SAndroid Build Coastguard Worker "To change any of these features, highlight it with the cursor\n"
44*cf5a6c84SAndroid Build Coastguard Worker "keys and press <Y> to build it in, <M> to make it a module or\n"
45*cf5a6c84SAndroid Build Coastguard Worker "<N> to removed it. You may also press the <Space Bar> to cycle\n"
46*cf5a6c84SAndroid Build Coastguard Worker "through the available options (ie. Y->N->M->Y).\n"
47*cf5a6c84SAndroid Build Coastguard Worker "\n"
48*cf5a6c84SAndroid Build Coastguard Worker "Some additional keyboard hints:\n"
49*cf5a6c84SAndroid Build Coastguard Worker "\n"
50*cf5a6c84SAndroid Build Coastguard Worker "Menus\n"
51*cf5a6c84SAndroid Build Coastguard Worker "----------\n"
52*cf5a6c84SAndroid Build Coastguard Worker "o Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
53*cf5a6c84SAndroid Build Coastguard Worker " you wish to change or submenu wish to select and press <Enter>.\n"
54*cf5a6c84SAndroid Build Coastguard Worker " Submenus are designated by \"--->\".\n"
55*cf5a6c84SAndroid Build Coastguard Worker "\n"
56*cf5a6c84SAndroid Build Coastguard Worker " Shortcut: Press the option's highlighted letter (hotkey).\n"
57*cf5a6c84SAndroid Build Coastguard Worker " Pressing a hotkey more than once will sequence\n"
58*cf5a6c84SAndroid Build Coastguard Worker " through all visible items which use that hotkey.\n"
59*cf5a6c84SAndroid Build Coastguard Worker "\n"
60*cf5a6c84SAndroid Build Coastguard Worker " You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
61*cf5a6c84SAndroid Build Coastguard Worker " unseen options into view.\n"
62*cf5a6c84SAndroid Build Coastguard Worker "\n"
63*cf5a6c84SAndroid Build Coastguard Worker "o To exit a menu use the cursor keys to highlight the <Exit> button\n"
64*cf5a6c84SAndroid Build Coastguard Worker " and press <ENTER>.\n"
65*cf5a6c84SAndroid Build Coastguard Worker "\n"
66*cf5a6c84SAndroid Build Coastguard Worker " Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
67*cf5a6c84SAndroid Build Coastguard Worker " using those letters. You may press a single <ESC>, but\n"
68*cf5a6c84SAndroid Build Coastguard Worker " there is a delayed response which you may find annoying.\n"
69*cf5a6c84SAndroid Build Coastguard Worker "\n"
70*cf5a6c84SAndroid Build Coastguard Worker " Also, the <TAB> and cursor keys will cycle between <Select>,\n"
71*cf5a6c84SAndroid Build Coastguard Worker " <Exit> and <Help>\n"
72*cf5a6c84SAndroid Build Coastguard Worker "\n"
73*cf5a6c84SAndroid Build Coastguard Worker "o To get help with an item, use the cursor keys to highlight <Help>\n"
74*cf5a6c84SAndroid Build Coastguard Worker " and Press <ENTER>.\n"
75*cf5a6c84SAndroid Build Coastguard Worker "\n"
76*cf5a6c84SAndroid Build Coastguard Worker " Shortcut: Press <H> or <?>.\n"
77*cf5a6c84SAndroid Build Coastguard Worker "\n"
78*cf5a6c84SAndroid Build Coastguard Worker "\n"
79*cf5a6c84SAndroid Build Coastguard Worker "Radiolists (Choice lists)\n"
80*cf5a6c84SAndroid Build Coastguard Worker "-----------\n"
81*cf5a6c84SAndroid Build Coastguard Worker "o Use the cursor keys to select the option you wish to set and press\n"
82*cf5a6c84SAndroid Build Coastguard Worker " <S> or the <SPACE BAR>.\n"
83*cf5a6c84SAndroid Build Coastguard Worker "\n"
84*cf5a6c84SAndroid Build Coastguard Worker " Shortcut: Press the first letter of the option you wish to set then\n"
85*cf5a6c84SAndroid Build Coastguard Worker " press <S> or <SPACE BAR>.\n"
86*cf5a6c84SAndroid Build Coastguard Worker "\n"
87*cf5a6c84SAndroid Build Coastguard Worker "o To see available help for the item, use the cursor keys to highlight\n"
88*cf5a6c84SAndroid Build Coastguard Worker " <Help> and Press <ENTER>.\n"
89*cf5a6c84SAndroid Build Coastguard Worker "\n"
90*cf5a6c84SAndroid Build Coastguard Worker " Shortcut: Press <H> or <?>.\n"
91*cf5a6c84SAndroid Build Coastguard Worker "\n"
92*cf5a6c84SAndroid Build Coastguard Worker " Also, the <TAB> and cursor keys will cycle between <Select> and\n"
93*cf5a6c84SAndroid Build Coastguard Worker " <Help>\n"
94*cf5a6c84SAndroid Build Coastguard Worker "\n"
95*cf5a6c84SAndroid Build Coastguard Worker "\n"
96*cf5a6c84SAndroid Build Coastguard Worker "Data Entry\n"
97*cf5a6c84SAndroid Build Coastguard Worker "-----------\n"
98*cf5a6c84SAndroid Build Coastguard Worker "o Enter the requested information and press <ENTER>\n"
99*cf5a6c84SAndroid Build Coastguard Worker " If you are entering hexadecimal values, it is not necessary to\n"
100*cf5a6c84SAndroid Build Coastguard Worker " add the '0x' prefix to the entry.\n"
101*cf5a6c84SAndroid Build Coastguard Worker "\n"
102*cf5a6c84SAndroid Build Coastguard Worker "o For help, use the <TAB> or cursor keys to highlight the help option\n"
103*cf5a6c84SAndroid Build Coastguard Worker " and press <ENTER>. You can try <TAB><H> as well.\n"
104*cf5a6c84SAndroid Build Coastguard Worker "\n"
105*cf5a6c84SAndroid Build Coastguard Worker "\n"
106*cf5a6c84SAndroid Build Coastguard Worker "Text Box (Help Window)\n"
107*cf5a6c84SAndroid Build Coastguard Worker "--------\n"
108*cf5a6c84SAndroid Build Coastguard Worker "o Use the cursor keys to scroll up/down/left/right. The VI editor\n"
109*cf5a6c84SAndroid Build Coastguard Worker " keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
110*cf5a6c84SAndroid Build Coastguard Worker " who are familiar with less and lynx.\n"
111*cf5a6c84SAndroid Build Coastguard Worker "\n"
112*cf5a6c84SAndroid Build Coastguard Worker "o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
113*cf5a6c84SAndroid Build Coastguard Worker "\n"
114*cf5a6c84SAndroid Build Coastguard Worker "\n"
115*cf5a6c84SAndroid Build Coastguard Worker "Alternate Configuration Files\n"
116*cf5a6c84SAndroid Build Coastguard Worker "-----------------------------\n"
117*cf5a6c84SAndroid Build Coastguard Worker "Menuconfig supports the use of alternate configuration files for\n"
118*cf5a6c84SAndroid Build Coastguard Worker "those who, for various reasons, find it necessary to switch\n"
119*cf5a6c84SAndroid Build Coastguard Worker "between different configurations.\n"
120*cf5a6c84SAndroid Build Coastguard Worker "\n"
121*cf5a6c84SAndroid Build Coastguard Worker "At the end of the main menu you will find two options. One is\n"
122*cf5a6c84SAndroid Build Coastguard Worker "for saving the current configuration to a file of your choosing.\n"
123*cf5a6c84SAndroid Build Coastguard Worker "The other option is for loading a previously saved alternate\n"
124*cf5a6c84SAndroid Build Coastguard Worker "configuration.\n"
125*cf5a6c84SAndroid Build Coastguard Worker "\n"
126*cf5a6c84SAndroid Build Coastguard Worker "Even if you don't use alternate configuration files, but you\n"
127*cf5a6c84SAndroid Build Coastguard Worker "find during a Menuconfig session that you have completely messed\n"
128*cf5a6c84SAndroid Build Coastguard Worker "up your settings, you may use the \"Load Alternate...\" option to\n"
129*cf5a6c84SAndroid Build Coastguard Worker "restore your previously saved settings from \".config\" without\n"
130*cf5a6c84SAndroid Build Coastguard Worker "restarting Menuconfig.\n"
131*cf5a6c84SAndroid Build Coastguard Worker "\n"
132*cf5a6c84SAndroid Build Coastguard Worker "Other information\n"
133*cf5a6c84SAndroid Build Coastguard Worker "-----------------\n"
134*cf5a6c84SAndroid Build Coastguard Worker "If you use Menuconfig in an XTERM window make sure you have your\n"
135*cf5a6c84SAndroid Build Coastguard Worker "$TERM variable set to point to a xterm definition which supports color.\n"
136*cf5a6c84SAndroid Build Coastguard Worker "Otherwise, Menuconfig will look rather bad. Menuconfig will not\n"
137*cf5a6c84SAndroid Build Coastguard Worker "display correctly in a RXVT window because rxvt displays only one\n"
138*cf5a6c84SAndroid Build Coastguard Worker "intensity of color, bright.\n"
139*cf5a6c84SAndroid Build Coastguard Worker "\n"
140*cf5a6c84SAndroid Build Coastguard Worker "Menuconfig will display larger menus on screens or xterms which are\n"
141*cf5a6c84SAndroid Build Coastguard Worker "set to display more than the standard 25 row by 80 column geometry.\n"
142*cf5a6c84SAndroid Build Coastguard Worker "In order for this to work, the \"stty size\" command must be able to\n"
143*cf5a6c84SAndroid Build Coastguard Worker "display the screen's current row and column geometry. I STRONGLY\n"
144*cf5a6c84SAndroid Build Coastguard Worker "RECOMMEND that you make sure you do NOT have the shell variables\n"
145*cf5a6c84SAndroid Build Coastguard Worker "LINES and COLUMNS exported into your environment. Some distributions\n"
146*cf5a6c84SAndroid Build Coastguard Worker "export those variables via /etc/profile. Some ncurses programs can\n"
147*cf5a6c84SAndroid Build Coastguard Worker "become confused when those variables (LINES & COLUMNS) don't reflect\n"
148*cf5a6c84SAndroid Build Coastguard Worker "the true screen size.\n"
149*cf5a6c84SAndroid Build Coastguard Worker "\n"
150*cf5a6c84SAndroid Build Coastguard Worker "Optional personality available\n"
151*cf5a6c84SAndroid Build Coastguard Worker "------------------------------\n"
152*cf5a6c84SAndroid Build Coastguard Worker "If you prefer to have all of the options listed in a single\n"
153*cf5a6c84SAndroid Build Coastguard Worker "menu, rather than the default multimenu hierarchy, run the menuconfig\n"
154*cf5a6c84SAndroid Build Coastguard Worker "with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
155*cf5a6c84SAndroid Build Coastguard Worker "\n"
156*cf5a6c84SAndroid Build Coastguard Worker "make MENUCONFIG_MODE=single_menu menuconfig\n"
157*cf5a6c84SAndroid Build Coastguard Worker "\n"
158*cf5a6c84SAndroid Build Coastguard Worker "<Enter> will then unroll the appropriate category, or enfold it if it\n"
159*cf5a6c84SAndroid Build Coastguard Worker "is already unrolled.\n"
160*cf5a6c84SAndroid Build Coastguard Worker "\n"
161*cf5a6c84SAndroid Build Coastguard Worker "Note that this mode can eventually be a little more CPU expensive\n"
162*cf5a6c84SAndroid Build Coastguard Worker "(especially with a larger number of unrolled categories) than the\n"
163*cf5a6c84SAndroid Build Coastguard Worker "default mode.\n"
164*cf5a6c84SAndroid Build Coastguard Worker "\n"
165*cf5a6c84SAndroid Build Coastguard Worker "Different color themes available\n"
166*cf5a6c84SAndroid Build Coastguard Worker "--------------------------------\n"
167*cf5a6c84SAndroid Build Coastguard Worker "It is possible to select different color themes using the variable\n"
168*cf5a6c84SAndroid Build Coastguard Worker "MENUCONFIG_COLOR. To select a theme use:\n"
169*cf5a6c84SAndroid Build Coastguard Worker "\n"
170*cf5a6c84SAndroid Build Coastguard Worker "make MENUCONFIG_COLOR=<theme> menuconfig\n"
171*cf5a6c84SAndroid Build Coastguard Worker "\n"
172*cf5a6c84SAndroid Build Coastguard Worker "Available themes are\n"
173*cf5a6c84SAndroid Build Coastguard Worker " mono => selects colors suitable for monochrome displays\n"
174*cf5a6c84SAndroid Build Coastguard Worker " blackbg => selects a color scheme with black background\n"
175*cf5a6c84SAndroid Build Coastguard Worker " classic => theme with blue background. The classic look\n"
176*cf5a6c84SAndroid Build Coastguard Worker " bluetitle => a LCD friendly version of classic. (default)\n"
177*cf5a6c84SAndroid Build Coastguard Worker "\n"),
178*cf5a6c84SAndroid Build Coastguard Worker menu_instructions[] = N_(
179*cf5a6c84SAndroid Build Coastguard Worker "Arrow keys navigate the menu. "
180*cf5a6c84SAndroid Build Coastguard Worker "<Enter> selects submenus --->. "
181*cf5a6c84SAndroid Build Coastguard Worker "Highlighted letters are hotkeys. "
182*cf5a6c84SAndroid Build Coastguard Worker "Pressing <Y> includes, <N> excludes, <M> modularizes features. "
183*cf5a6c84SAndroid Build Coastguard Worker "Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
184*cf5a6c84SAndroid Build Coastguard Worker "Legend: [*] built-in [ ] excluded <M> module < > module capable"),
185*cf5a6c84SAndroid Build Coastguard Worker radiolist_instructions[] = N_(
186*cf5a6c84SAndroid Build Coastguard Worker "Use the arrow keys to navigate this window or "
187*cf5a6c84SAndroid Build Coastguard Worker "press the hotkey of the item you wish to select "
188*cf5a6c84SAndroid Build Coastguard Worker "followed by the <SPACE BAR>. "
189*cf5a6c84SAndroid Build Coastguard Worker "Press <?> for additional information about this option."),
190*cf5a6c84SAndroid Build Coastguard Worker inputbox_instructions_int[] = N_(
191*cf5a6c84SAndroid Build Coastguard Worker "Please enter a decimal value. "
192*cf5a6c84SAndroid Build Coastguard Worker "Fractions will not be accepted. "
193*cf5a6c84SAndroid Build Coastguard Worker "Use the <TAB> key to move from the input field to the buttons below it."),
194*cf5a6c84SAndroid Build Coastguard Worker inputbox_instructions_hex[] = N_(
195*cf5a6c84SAndroid Build Coastguard Worker "Please enter a hexadecimal value. "
196*cf5a6c84SAndroid Build Coastguard Worker "Use the <TAB> key to move from the input field to the buttons below it."),
197*cf5a6c84SAndroid Build Coastguard Worker inputbox_instructions_string[] = N_(
198*cf5a6c84SAndroid Build Coastguard Worker "Please enter a string value. "
199*cf5a6c84SAndroid Build Coastguard Worker "Use the <TAB> key to move from the input field to the buttons below it."),
200*cf5a6c84SAndroid Build Coastguard Worker setmod_text[] = N_(
201*cf5a6c84SAndroid Build Coastguard Worker "This feature depends on another which has been configured as a module.\n"
202*cf5a6c84SAndroid Build Coastguard Worker "As a result, this feature will be built as a module."),
203*cf5a6c84SAndroid Build Coastguard Worker nohelp_text[] = N_(
204*cf5a6c84SAndroid Build Coastguard Worker "There is no help available for this option.\n"),
205*cf5a6c84SAndroid Build Coastguard Worker load_config_text[] = N_(
206*cf5a6c84SAndroid Build Coastguard Worker "Enter the name of the configuration file you wish to load. "
207*cf5a6c84SAndroid Build Coastguard Worker "Accept the name shown to restore the configuration you "
208*cf5a6c84SAndroid Build Coastguard Worker "last retrieved. Leave blank to abort."),
209*cf5a6c84SAndroid Build Coastguard Worker load_config_help[] = N_(
210*cf5a6c84SAndroid Build Coastguard Worker "\n"
211*cf5a6c84SAndroid Build Coastguard Worker "For various reasons, one may wish to keep several different\n"
212*cf5a6c84SAndroid Build Coastguard Worker "configurations available on a single machine.\n"
213*cf5a6c84SAndroid Build Coastguard Worker "\n"
214*cf5a6c84SAndroid Build Coastguard Worker "If you have saved a previous configuration in a file other than the\n"
215*cf5a6c84SAndroid Build Coastguard Worker "default, entering the name of the file here will allow you\n"
216*cf5a6c84SAndroid Build Coastguard Worker "to modify that configuration.\n"
217*cf5a6c84SAndroid Build Coastguard Worker "\n"
218*cf5a6c84SAndroid Build Coastguard Worker "If you are uncertain, then you have probably never used alternate\n"
219*cf5a6c84SAndroid Build Coastguard Worker "configuration files. You should therefor leave this blank to abort.\n"),
220*cf5a6c84SAndroid Build Coastguard Worker save_config_text[] = N_(
221*cf5a6c84SAndroid Build Coastguard Worker "Enter a filename to which this configuration should be saved "
222*cf5a6c84SAndroid Build Coastguard Worker "as an alternate. Leave blank to abort."),
223*cf5a6c84SAndroid Build Coastguard Worker save_config_help[] = N_(
224*cf5a6c84SAndroid Build Coastguard Worker "\n"
225*cf5a6c84SAndroid Build Coastguard Worker "For various reasons, one may wish to keep different\n"
226*cf5a6c84SAndroid Build Coastguard Worker "configurations available on a single machine.\n"
227*cf5a6c84SAndroid Build Coastguard Worker "\n"
228*cf5a6c84SAndroid Build Coastguard Worker "Entering a file name here will allow you to later retrieve, modify\n"
229*cf5a6c84SAndroid Build Coastguard Worker "and use the current configuration as an alternate to whatever\n"
230*cf5a6c84SAndroid Build Coastguard Worker "configuration options you have selected at that time.\n"
231*cf5a6c84SAndroid Build Coastguard Worker "\n"
232*cf5a6c84SAndroid Build Coastguard Worker "If you are uncertain what all this means then you should probably\n"
233*cf5a6c84SAndroid Build Coastguard Worker "leave this blank.\n"),
234*cf5a6c84SAndroid Build Coastguard Worker search_help[] = N_(
235*cf5a6c84SAndroid Build Coastguard Worker "\n"
236*cf5a6c84SAndroid Build Coastguard Worker "Search for CONFIG_ symbols and display their relations.\n"
237*cf5a6c84SAndroid Build Coastguard Worker "Regular expressions are allowed.\n"
238*cf5a6c84SAndroid Build Coastguard Worker "Example: search for \"^FOO\"\n"
239*cf5a6c84SAndroid Build Coastguard Worker "Result:\n"
240*cf5a6c84SAndroid Build Coastguard Worker "-----------------------------------------------------------------\n"
241*cf5a6c84SAndroid Build Coastguard Worker "Symbol: FOO [=m]\n"
242*cf5a6c84SAndroid Build Coastguard Worker "Prompt: Foo bus is used to drive the bar HW\n"
243*cf5a6c84SAndroid Build Coastguard Worker "Defined at drivers/pci/Kconfig:47\n"
244*cf5a6c84SAndroid Build Coastguard Worker "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
245*cf5a6c84SAndroid Build Coastguard Worker "Location:\n"
246*cf5a6c84SAndroid Build Coastguard Worker " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
247*cf5a6c84SAndroid Build Coastguard Worker " -> PCI support (PCI [=y])\n"
248*cf5a6c84SAndroid Build Coastguard Worker " -> PCI access mode (<choice> [=y])\n"
249*cf5a6c84SAndroid Build Coastguard Worker "Selects: LIBCRC32\n"
250*cf5a6c84SAndroid Build Coastguard Worker "Selected by: BAR\n"
251*cf5a6c84SAndroid Build Coastguard Worker "-----------------------------------------------------------------\n"
252*cf5a6c84SAndroid Build Coastguard Worker "o The line 'Prompt:' shows the text used in the menu structure for\n"
253*cf5a6c84SAndroid Build Coastguard Worker " this CONFIG_ symbol\n"
254*cf5a6c84SAndroid Build Coastguard Worker "o The 'Defined at' line tell at what file / line number the symbol\n"
255*cf5a6c84SAndroid Build Coastguard Worker " is defined\n"
256*cf5a6c84SAndroid Build Coastguard Worker "o The 'Depends on:' line tell what symbols needs to be defined for\n"
257*cf5a6c84SAndroid Build Coastguard Worker " this symbol to be visible in the menu (selectable)\n"
258*cf5a6c84SAndroid Build Coastguard Worker "o The 'Location:' lines tell where in the menu structure this symbol\n"
259*cf5a6c84SAndroid Build Coastguard Worker " is located\n"
260*cf5a6c84SAndroid Build Coastguard Worker " A location followed by a [=y] indicate that this is a selectable\n"
261*cf5a6c84SAndroid Build Coastguard Worker " menu item - and current value is displayed inside brackets.\n"
262*cf5a6c84SAndroid Build Coastguard Worker "o The 'Selects:' line tell what symbol will be automatically\n"
263*cf5a6c84SAndroid Build Coastguard Worker " selected if this symbol is selected (y or m)\n"
264*cf5a6c84SAndroid Build Coastguard Worker "o The 'Selected by' line tell what symbol has selected this symbol\n"
265*cf5a6c84SAndroid Build Coastguard Worker "\n"
266*cf5a6c84SAndroid Build Coastguard Worker "Only relevant lines are shown.\n"
267*cf5a6c84SAndroid Build Coastguard Worker "\n\n"
268*cf5a6c84SAndroid Build Coastguard Worker "Search examples:\n"
269*cf5a6c84SAndroid Build Coastguard Worker "Examples: USB => find all CONFIG_ symbols containing USB\n"
270*cf5a6c84SAndroid Build Coastguard Worker " ^USB => find all CONFIG_ symbols starting with USB\n"
271*cf5a6c84SAndroid Build Coastguard Worker " USB$ => find all CONFIG_ symbols ending with USB\n"
272*cf5a6c84SAndroid Build Coastguard Worker "\n");
273*cf5a6c84SAndroid Build Coastguard Worker
274*cf5a6c84SAndroid Build Coastguard Worker static char filename[PATH_MAX+1] = ".config";
275*cf5a6c84SAndroid Build Coastguard Worker static int indent;
276*cf5a6c84SAndroid Build Coastguard Worker static struct termios ios_org;
277*cf5a6c84SAndroid Build Coastguard Worker static int rows = 0, cols = 0;
278*cf5a6c84SAndroid Build Coastguard Worker static struct menu *current_menu;
279*cf5a6c84SAndroid Build Coastguard Worker static int child_count;
280*cf5a6c84SAndroid Build Coastguard Worker static int single_menu_mode;
281*cf5a6c84SAndroid Build Coastguard Worker
282*cf5a6c84SAndroid Build Coastguard Worker static void conf(struct menu *menu);
283*cf5a6c84SAndroid Build Coastguard Worker static void conf_choice(struct menu *menu);
284*cf5a6c84SAndroid Build Coastguard Worker static void conf_string(struct menu *menu);
285*cf5a6c84SAndroid Build Coastguard Worker static void conf_load(void);
286*cf5a6c84SAndroid Build Coastguard Worker static void conf_save(void);
287*cf5a6c84SAndroid Build Coastguard Worker static void show_textbox(const char *title, const char *text, int r, int c);
288*cf5a6c84SAndroid Build Coastguard Worker static void show_helptext(const char *title, const char *text);
289*cf5a6c84SAndroid Build Coastguard Worker static void show_help(struct menu *menu);
290*cf5a6c84SAndroid Build Coastguard Worker
init_wsize(void)291*cf5a6c84SAndroid Build Coastguard Worker static void init_wsize(void)
292*cf5a6c84SAndroid Build Coastguard Worker {
293*cf5a6c84SAndroid Build Coastguard Worker struct winsize ws;
294*cf5a6c84SAndroid Build Coastguard Worker char *env;
295*cf5a6c84SAndroid Build Coastguard Worker
296*cf5a6c84SAndroid Build Coastguard Worker if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
297*cf5a6c84SAndroid Build Coastguard Worker rows = ws.ws_row;
298*cf5a6c84SAndroid Build Coastguard Worker cols = ws.ws_col;
299*cf5a6c84SAndroid Build Coastguard Worker }
300*cf5a6c84SAndroid Build Coastguard Worker
301*cf5a6c84SAndroid Build Coastguard Worker if (!rows) {
302*cf5a6c84SAndroid Build Coastguard Worker env = getenv("LINES");
303*cf5a6c84SAndroid Build Coastguard Worker if (env)
304*cf5a6c84SAndroid Build Coastguard Worker rows = atoi(env);
305*cf5a6c84SAndroid Build Coastguard Worker if (!rows)
306*cf5a6c84SAndroid Build Coastguard Worker rows = 24;
307*cf5a6c84SAndroid Build Coastguard Worker }
308*cf5a6c84SAndroid Build Coastguard Worker if (!cols) {
309*cf5a6c84SAndroid Build Coastguard Worker env = getenv("COLUMNS");
310*cf5a6c84SAndroid Build Coastguard Worker if (env)
311*cf5a6c84SAndroid Build Coastguard Worker cols = atoi(env);
312*cf5a6c84SAndroid Build Coastguard Worker if (!cols)
313*cf5a6c84SAndroid Build Coastguard Worker cols = 80;
314*cf5a6c84SAndroid Build Coastguard Worker }
315*cf5a6c84SAndroid Build Coastguard Worker
316*cf5a6c84SAndroid Build Coastguard Worker if (rows < 19 || cols < 80) {
317*cf5a6c84SAndroid Build Coastguard Worker fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
318*cf5a6c84SAndroid Build Coastguard Worker fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
319*cf5a6c84SAndroid Build Coastguard Worker exit(1);
320*cf5a6c84SAndroid Build Coastguard Worker }
321*cf5a6c84SAndroid Build Coastguard Worker
322*cf5a6c84SAndroid Build Coastguard Worker rows -= 4;
323*cf5a6c84SAndroid Build Coastguard Worker cols -= 5;
324*cf5a6c84SAndroid Build Coastguard Worker }
325*cf5a6c84SAndroid Build Coastguard Worker
get_prompt_str(struct gstr * r,struct property * prop)326*cf5a6c84SAndroid Build Coastguard Worker static void get_prompt_str(struct gstr *r, struct property *prop)
327*cf5a6c84SAndroid Build Coastguard Worker {
328*cf5a6c84SAndroid Build Coastguard Worker int i, j;
329*cf5a6c84SAndroid Build Coastguard Worker struct menu *submenu[8], *menu;
330*cf5a6c84SAndroid Build Coastguard Worker
331*cf5a6c84SAndroid Build Coastguard Worker str_printf(r, "Prompt: %s\n", prop->text);
332*cf5a6c84SAndroid Build Coastguard Worker str_printf(r, " Defined at %s:%d\n", prop->menu->file->name,
333*cf5a6c84SAndroid Build Coastguard Worker prop->menu->lineno);
334*cf5a6c84SAndroid Build Coastguard Worker if (!expr_is_yes(prop->visible.expr)) {
335*cf5a6c84SAndroid Build Coastguard Worker str_append(r, " Depends on: ");
336*cf5a6c84SAndroid Build Coastguard Worker expr_gstr_print(prop->visible.expr, r);
337*cf5a6c84SAndroid Build Coastguard Worker str_append(r, "\n");
338*cf5a6c84SAndroid Build Coastguard Worker }
339*cf5a6c84SAndroid Build Coastguard Worker menu = prop->menu->parent;
340*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
341*cf5a6c84SAndroid Build Coastguard Worker submenu[i++] = menu;
342*cf5a6c84SAndroid Build Coastguard Worker if (i > 0) {
343*cf5a6c84SAndroid Build Coastguard Worker str_printf(r, " Location:\n");
344*cf5a6c84SAndroid Build Coastguard Worker for (j = 4; --i >= 0; j += 2) {
345*cf5a6c84SAndroid Build Coastguard Worker menu = submenu[i];
346*cf5a6c84SAndroid Build Coastguard Worker str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
347*cf5a6c84SAndroid Build Coastguard Worker if (menu->sym) {
348*cf5a6c84SAndroid Build Coastguard Worker str_printf(r, " (%s [=%s])", menu->sym->name ?
349*cf5a6c84SAndroid Build Coastguard Worker menu->sym->name : "<choice>",
350*cf5a6c84SAndroid Build Coastguard Worker sym_get_string_value(menu->sym));
351*cf5a6c84SAndroid Build Coastguard Worker }
352*cf5a6c84SAndroid Build Coastguard Worker str_append(r, "\n");
353*cf5a6c84SAndroid Build Coastguard Worker }
354*cf5a6c84SAndroid Build Coastguard Worker }
355*cf5a6c84SAndroid Build Coastguard Worker }
356*cf5a6c84SAndroid Build Coastguard Worker
get_symbol_str(struct gstr * r,struct symbol * sym)357*cf5a6c84SAndroid Build Coastguard Worker static void get_symbol_str(struct gstr *r, struct symbol *sym)
358*cf5a6c84SAndroid Build Coastguard Worker {
359*cf5a6c84SAndroid Build Coastguard Worker bool hit;
360*cf5a6c84SAndroid Build Coastguard Worker struct property *prop;
361*cf5a6c84SAndroid Build Coastguard Worker
362*cf5a6c84SAndroid Build Coastguard Worker str_printf(r, "Symbol: %s [=%s]\n", sym->name,
363*cf5a6c84SAndroid Build Coastguard Worker sym_get_string_value(sym));
364*cf5a6c84SAndroid Build Coastguard Worker for_all_prompts(sym, prop)
365*cf5a6c84SAndroid Build Coastguard Worker get_prompt_str(r, prop);
366*cf5a6c84SAndroid Build Coastguard Worker hit = false;
367*cf5a6c84SAndroid Build Coastguard Worker for_all_properties(sym, prop, P_SELECT) {
368*cf5a6c84SAndroid Build Coastguard Worker if (!hit) {
369*cf5a6c84SAndroid Build Coastguard Worker str_append(r, " Selects: ");
370*cf5a6c84SAndroid Build Coastguard Worker hit = true;
371*cf5a6c84SAndroid Build Coastguard Worker } else
372*cf5a6c84SAndroid Build Coastguard Worker str_printf(r, " && ");
373*cf5a6c84SAndroid Build Coastguard Worker expr_gstr_print(prop->expr, r);
374*cf5a6c84SAndroid Build Coastguard Worker }
375*cf5a6c84SAndroid Build Coastguard Worker if (hit)
376*cf5a6c84SAndroid Build Coastguard Worker str_append(r, "\n");
377*cf5a6c84SAndroid Build Coastguard Worker if (sym->rev_dep.expr) {
378*cf5a6c84SAndroid Build Coastguard Worker str_append(r, " Selected by: ");
379*cf5a6c84SAndroid Build Coastguard Worker expr_gstr_print(sym->rev_dep.expr, r);
380*cf5a6c84SAndroid Build Coastguard Worker str_append(r, "\n");
381*cf5a6c84SAndroid Build Coastguard Worker }
382*cf5a6c84SAndroid Build Coastguard Worker str_append(r, "\n\n");
383*cf5a6c84SAndroid Build Coastguard Worker }
384*cf5a6c84SAndroid Build Coastguard Worker
get_relations_str(struct symbol ** sym_arr)385*cf5a6c84SAndroid Build Coastguard Worker static struct gstr get_relations_str(struct symbol **sym_arr)
386*cf5a6c84SAndroid Build Coastguard Worker {
387*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym;
388*cf5a6c84SAndroid Build Coastguard Worker struct gstr res = str_new();
389*cf5a6c84SAndroid Build Coastguard Worker int i;
390*cf5a6c84SAndroid Build Coastguard Worker
391*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
392*cf5a6c84SAndroid Build Coastguard Worker get_symbol_str(&res, sym);
393*cf5a6c84SAndroid Build Coastguard Worker if (!i)
394*cf5a6c84SAndroid Build Coastguard Worker str_append(&res, "No matches found.\n");
395*cf5a6c84SAndroid Build Coastguard Worker return res;
396*cf5a6c84SAndroid Build Coastguard Worker }
397*cf5a6c84SAndroid Build Coastguard Worker
search_conf(void)398*cf5a6c84SAndroid Build Coastguard Worker static void search_conf(void)
399*cf5a6c84SAndroid Build Coastguard Worker {
400*cf5a6c84SAndroid Build Coastguard Worker struct symbol **sym_arr;
401*cf5a6c84SAndroid Build Coastguard Worker struct gstr res;
402*cf5a6c84SAndroid Build Coastguard Worker int dres;
403*cf5a6c84SAndroid Build Coastguard Worker again:
404*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
405*cf5a6c84SAndroid Build Coastguard Worker dres = dialog_inputbox(_("Search Configuration Parameter"),
406*cf5a6c84SAndroid Build Coastguard Worker _("Enter CONFIG_ (sub)string to search for (omit CONFIG_)"),
407*cf5a6c84SAndroid Build Coastguard Worker 10, 75, "");
408*cf5a6c84SAndroid Build Coastguard Worker switch (dres) {
409*cf5a6c84SAndroid Build Coastguard Worker case 0:
410*cf5a6c84SAndroid Build Coastguard Worker break;
411*cf5a6c84SAndroid Build Coastguard Worker case 1:
412*cf5a6c84SAndroid Build Coastguard Worker show_helptext(_("Search Configuration"), search_help);
413*cf5a6c84SAndroid Build Coastguard Worker goto again;
414*cf5a6c84SAndroid Build Coastguard Worker default:
415*cf5a6c84SAndroid Build Coastguard Worker return;
416*cf5a6c84SAndroid Build Coastguard Worker }
417*cf5a6c84SAndroid Build Coastguard Worker
418*cf5a6c84SAndroid Build Coastguard Worker sym_arr = sym_re_search(dialog_input_result);
419*cf5a6c84SAndroid Build Coastguard Worker res = get_relations_str(sym_arr);
420*cf5a6c84SAndroid Build Coastguard Worker free(sym_arr);
421*cf5a6c84SAndroid Build Coastguard Worker show_textbox(_("Search Results"), str_get(&res), 0, 0);
422*cf5a6c84SAndroid Build Coastguard Worker str_free(&res);
423*cf5a6c84SAndroid Build Coastguard Worker }
424*cf5a6c84SAndroid Build Coastguard Worker
build_conf(struct menu * menu)425*cf5a6c84SAndroid Build Coastguard Worker static void build_conf(struct menu *menu)
426*cf5a6c84SAndroid Build Coastguard Worker {
427*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym;
428*cf5a6c84SAndroid Build Coastguard Worker struct property *prop;
429*cf5a6c84SAndroid Build Coastguard Worker struct menu *child;
430*cf5a6c84SAndroid Build Coastguard Worker int type, tmp, doint = 2;
431*cf5a6c84SAndroid Build Coastguard Worker tristate val;
432*cf5a6c84SAndroid Build Coastguard Worker char ch;
433*cf5a6c84SAndroid Build Coastguard Worker
434*cf5a6c84SAndroid Build Coastguard Worker if (!menu_is_visible(menu))
435*cf5a6c84SAndroid Build Coastguard Worker return;
436*cf5a6c84SAndroid Build Coastguard Worker
437*cf5a6c84SAndroid Build Coastguard Worker sym = menu->sym;
438*cf5a6c84SAndroid Build Coastguard Worker prop = menu->prompt;
439*cf5a6c84SAndroid Build Coastguard Worker if (!sym) {
440*cf5a6c84SAndroid Build Coastguard Worker if (prop && menu != current_menu) {
441*cf5a6c84SAndroid Build Coastguard Worker const char *prompt = menu_get_prompt(menu);
442*cf5a6c84SAndroid Build Coastguard Worker switch (prop->type) {
443*cf5a6c84SAndroid Build Coastguard Worker case P_MENU:
444*cf5a6c84SAndroid Build Coastguard Worker child_count++;
445*cf5a6c84SAndroid Build Coastguard Worker if (single_menu_mode) {
446*cf5a6c84SAndroid Build Coastguard Worker item_make("%s%*c%s",
447*cf5a6c84SAndroid Build Coastguard Worker menu->data ? "-->" : "++>",
448*cf5a6c84SAndroid Build Coastguard Worker indent + 1, ' ', prompt);
449*cf5a6c84SAndroid Build Coastguard Worker } else
450*cf5a6c84SAndroid Build Coastguard Worker item_make(" %*c%s --->", indent + 1, ' ', prompt);
451*cf5a6c84SAndroid Build Coastguard Worker
452*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('m');
453*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
454*cf5a6c84SAndroid Build Coastguard Worker if (single_menu_mode && menu->data)
455*cf5a6c84SAndroid Build Coastguard Worker goto conf_childs;
456*cf5a6c84SAndroid Build Coastguard Worker return;
457*cf5a6c84SAndroid Build Coastguard Worker default:
458*cf5a6c84SAndroid Build Coastguard Worker if (prompt) {
459*cf5a6c84SAndroid Build Coastguard Worker child_count++;
460*cf5a6c84SAndroid Build Coastguard Worker item_make("---%*c%s", indent + 1, ' ', prompt);
461*cf5a6c84SAndroid Build Coastguard Worker item_set_tag(':');
462*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
463*cf5a6c84SAndroid Build Coastguard Worker }
464*cf5a6c84SAndroid Build Coastguard Worker }
465*cf5a6c84SAndroid Build Coastguard Worker } else
466*cf5a6c84SAndroid Build Coastguard Worker doint = 0;
467*cf5a6c84SAndroid Build Coastguard Worker goto conf_childs;
468*cf5a6c84SAndroid Build Coastguard Worker }
469*cf5a6c84SAndroid Build Coastguard Worker
470*cf5a6c84SAndroid Build Coastguard Worker type = sym_get_type(sym);
471*cf5a6c84SAndroid Build Coastguard Worker if (sym_is_choice(sym)) {
472*cf5a6c84SAndroid Build Coastguard Worker struct symbol *def_sym = sym_get_choice_value(sym);
473*cf5a6c84SAndroid Build Coastguard Worker struct menu *def_menu = NULL;
474*cf5a6c84SAndroid Build Coastguard Worker
475*cf5a6c84SAndroid Build Coastguard Worker child_count++;
476*cf5a6c84SAndroid Build Coastguard Worker for (child = menu->list; child; child = child->next) {
477*cf5a6c84SAndroid Build Coastguard Worker if (menu_is_visible(child) && child->sym == def_sym)
478*cf5a6c84SAndroid Build Coastguard Worker def_menu = child;
479*cf5a6c84SAndroid Build Coastguard Worker }
480*cf5a6c84SAndroid Build Coastguard Worker
481*cf5a6c84SAndroid Build Coastguard Worker val = sym_get_tristate_value(sym);
482*cf5a6c84SAndroid Build Coastguard Worker if (sym_is_changable(sym)) {
483*cf5a6c84SAndroid Build Coastguard Worker switch (type) {
484*cf5a6c84SAndroid Build Coastguard Worker case S_BOOLEAN:
485*cf5a6c84SAndroid Build Coastguard Worker item_make("[%c]", val == no ? ' ' : '*');
486*cf5a6c84SAndroid Build Coastguard Worker break;
487*cf5a6c84SAndroid Build Coastguard Worker case S_TRISTATE:
488*cf5a6c84SAndroid Build Coastguard Worker switch (val) {
489*cf5a6c84SAndroid Build Coastguard Worker case yes: ch = '*'; break;
490*cf5a6c84SAndroid Build Coastguard Worker case mod: ch = 'M'; break;
491*cf5a6c84SAndroid Build Coastguard Worker default: ch = ' '; break;
492*cf5a6c84SAndroid Build Coastguard Worker }
493*cf5a6c84SAndroid Build Coastguard Worker item_make("<%c>", ch);
494*cf5a6c84SAndroid Build Coastguard Worker break;
495*cf5a6c84SAndroid Build Coastguard Worker }
496*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('t');
497*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
498*cf5a6c84SAndroid Build Coastguard Worker } else {
499*cf5a6c84SAndroid Build Coastguard Worker item_make(" ");
500*cf5a6c84SAndroid Build Coastguard Worker item_set_tag(def_menu ? 't' : ':');
501*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
502*cf5a6c84SAndroid Build Coastguard Worker }
503*cf5a6c84SAndroid Build Coastguard Worker
504*cf5a6c84SAndroid Build Coastguard Worker item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
505*cf5a6c84SAndroid Build Coastguard Worker if (val == yes) {
506*cf5a6c84SAndroid Build Coastguard Worker if (def_menu) {
507*cf5a6c84SAndroid Build Coastguard Worker item_add_str(" (%s)", menu_get_prompt(def_menu));
508*cf5a6c84SAndroid Build Coastguard Worker item_add_str(" --->");
509*cf5a6c84SAndroid Build Coastguard Worker if (def_menu->list) {
510*cf5a6c84SAndroid Build Coastguard Worker indent += 2;
511*cf5a6c84SAndroid Build Coastguard Worker build_conf(def_menu);
512*cf5a6c84SAndroid Build Coastguard Worker indent -= 2;
513*cf5a6c84SAndroid Build Coastguard Worker }
514*cf5a6c84SAndroid Build Coastguard Worker }
515*cf5a6c84SAndroid Build Coastguard Worker return;
516*cf5a6c84SAndroid Build Coastguard Worker }
517*cf5a6c84SAndroid Build Coastguard Worker } else {
518*cf5a6c84SAndroid Build Coastguard Worker if (menu == current_menu) {
519*cf5a6c84SAndroid Build Coastguard Worker item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
520*cf5a6c84SAndroid Build Coastguard Worker item_set_tag(':');
521*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
522*cf5a6c84SAndroid Build Coastguard Worker goto conf_childs;
523*cf5a6c84SAndroid Build Coastguard Worker }
524*cf5a6c84SAndroid Build Coastguard Worker child_count++;
525*cf5a6c84SAndroid Build Coastguard Worker val = sym_get_tristate_value(sym);
526*cf5a6c84SAndroid Build Coastguard Worker if (sym_is_choice_value(sym) && val == yes) {
527*cf5a6c84SAndroid Build Coastguard Worker item_make(" ");
528*cf5a6c84SAndroid Build Coastguard Worker item_set_tag(':');
529*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
530*cf5a6c84SAndroid Build Coastguard Worker } else {
531*cf5a6c84SAndroid Build Coastguard Worker switch (type) {
532*cf5a6c84SAndroid Build Coastguard Worker case S_BOOLEAN:
533*cf5a6c84SAndroid Build Coastguard Worker if (sym_is_changable(sym))
534*cf5a6c84SAndroid Build Coastguard Worker item_make("[%c]", val == no ? ' ' : '*');
535*cf5a6c84SAndroid Build Coastguard Worker else
536*cf5a6c84SAndroid Build Coastguard Worker item_make("---");
537*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('t');
538*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
539*cf5a6c84SAndroid Build Coastguard Worker break;
540*cf5a6c84SAndroid Build Coastguard Worker case S_TRISTATE:
541*cf5a6c84SAndroid Build Coastguard Worker switch (val) {
542*cf5a6c84SAndroid Build Coastguard Worker case yes: ch = '*'; break;
543*cf5a6c84SAndroid Build Coastguard Worker case mod: ch = 'M'; break;
544*cf5a6c84SAndroid Build Coastguard Worker default: ch = ' '; break;
545*cf5a6c84SAndroid Build Coastguard Worker }
546*cf5a6c84SAndroid Build Coastguard Worker if (sym_is_changable(sym))
547*cf5a6c84SAndroid Build Coastguard Worker item_make("<%c>", ch);
548*cf5a6c84SAndroid Build Coastguard Worker else
549*cf5a6c84SAndroid Build Coastguard Worker item_make("---");
550*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('t');
551*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
552*cf5a6c84SAndroid Build Coastguard Worker break;
553*cf5a6c84SAndroid Build Coastguard Worker default:
554*cf5a6c84SAndroid Build Coastguard Worker tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
555*cf5a6c84SAndroid Build Coastguard Worker item_make("(%s)", sym_get_string_value(sym));
556*cf5a6c84SAndroid Build Coastguard Worker tmp = indent - tmp + 4;
557*cf5a6c84SAndroid Build Coastguard Worker if (tmp < 0)
558*cf5a6c84SAndroid Build Coastguard Worker tmp = 0;
559*cf5a6c84SAndroid Build Coastguard Worker item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
560*cf5a6c84SAndroid Build Coastguard Worker (sym_has_value(sym) || !sym_is_changable(sym)) ?
561*cf5a6c84SAndroid Build Coastguard Worker "" : " (NEW)");
562*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('s');
563*cf5a6c84SAndroid Build Coastguard Worker item_set_data(menu);
564*cf5a6c84SAndroid Build Coastguard Worker goto conf_childs;
565*cf5a6c84SAndroid Build Coastguard Worker }
566*cf5a6c84SAndroid Build Coastguard Worker }
567*cf5a6c84SAndroid Build Coastguard Worker item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
568*cf5a6c84SAndroid Build Coastguard Worker (sym_has_value(sym) || !sym_is_changable(sym)) ?
569*cf5a6c84SAndroid Build Coastguard Worker "" : " (NEW)");
570*cf5a6c84SAndroid Build Coastguard Worker if (menu->prompt->type == P_MENU) {
571*cf5a6c84SAndroid Build Coastguard Worker item_add_str(" --->");
572*cf5a6c84SAndroid Build Coastguard Worker return;
573*cf5a6c84SAndroid Build Coastguard Worker }
574*cf5a6c84SAndroid Build Coastguard Worker }
575*cf5a6c84SAndroid Build Coastguard Worker
576*cf5a6c84SAndroid Build Coastguard Worker conf_childs:
577*cf5a6c84SAndroid Build Coastguard Worker indent += doint;
578*cf5a6c84SAndroid Build Coastguard Worker for (child = menu->list; child; child = child->next)
579*cf5a6c84SAndroid Build Coastguard Worker build_conf(child);
580*cf5a6c84SAndroid Build Coastguard Worker indent -= doint;
581*cf5a6c84SAndroid Build Coastguard Worker }
582*cf5a6c84SAndroid Build Coastguard Worker
conf(struct menu * menu)583*cf5a6c84SAndroid Build Coastguard Worker static void conf(struct menu *menu)
584*cf5a6c84SAndroid Build Coastguard Worker {
585*cf5a6c84SAndroid Build Coastguard Worker struct menu *submenu;
586*cf5a6c84SAndroid Build Coastguard Worker const char *prompt = menu_get_prompt(menu);
587*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym;
588*cf5a6c84SAndroid Build Coastguard Worker struct menu *active_menu = NULL;
589*cf5a6c84SAndroid Build Coastguard Worker int res;
590*cf5a6c84SAndroid Build Coastguard Worker int s_scroll = 0;
591*cf5a6c84SAndroid Build Coastguard Worker
592*cf5a6c84SAndroid Build Coastguard Worker while (1) {
593*cf5a6c84SAndroid Build Coastguard Worker item_reset();
594*cf5a6c84SAndroid Build Coastguard Worker current_menu = menu;
595*cf5a6c84SAndroid Build Coastguard Worker build_conf(menu);
596*cf5a6c84SAndroid Build Coastguard Worker if (!child_count)
597*cf5a6c84SAndroid Build Coastguard Worker break;
598*cf5a6c84SAndroid Build Coastguard Worker if (menu == &rootmenu) {
599*cf5a6c84SAndroid Build Coastguard Worker item_make("--- ");
600*cf5a6c84SAndroid Build Coastguard Worker item_set_tag(':');
601*cf5a6c84SAndroid Build Coastguard Worker item_make(_(" Load an Alternate Configuration File"));
602*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('L');
603*cf5a6c84SAndroid Build Coastguard Worker item_make(_(" Save an Alternate Configuration File"));
604*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('S');
605*cf5a6c84SAndroid Build Coastguard Worker }
606*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
607*cf5a6c84SAndroid Build Coastguard Worker res = dialog_menu(prompt ? prompt : _("Main Menu"),
608*cf5a6c84SAndroid Build Coastguard Worker _(menu_instructions),
609*cf5a6c84SAndroid Build Coastguard Worker active_menu, &s_scroll);
610*cf5a6c84SAndroid Build Coastguard Worker if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
611*cf5a6c84SAndroid Build Coastguard Worker break;
612*cf5a6c84SAndroid Build Coastguard Worker if (!item_activate_selected())
613*cf5a6c84SAndroid Build Coastguard Worker continue;
614*cf5a6c84SAndroid Build Coastguard Worker if (!item_tag())
615*cf5a6c84SAndroid Build Coastguard Worker continue;
616*cf5a6c84SAndroid Build Coastguard Worker
617*cf5a6c84SAndroid Build Coastguard Worker submenu = item_data();
618*cf5a6c84SAndroid Build Coastguard Worker active_menu = item_data();
619*cf5a6c84SAndroid Build Coastguard Worker if (submenu)
620*cf5a6c84SAndroid Build Coastguard Worker sym = submenu->sym;
621*cf5a6c84SAndroid Build Coastguard Worker else
622*cf5a6c84SAndroid Build Coastguard Worker sym = NULL;
623*cf5a6c84SAndroid Build Coastguard Worker
624*cf5a6c84SAndroid Build Coastguard Worker switch (res) {
625*cf5a6c84SAndroid Build Coastguard Worker case 0:
626*cf5a6c84SAndroid Build Coastguard Worker switch (item_tag()) {
627*cf5a6c84SAndroid Build Coastguard Worker case 'm':
628*cf5a6c84SAndroid Build Coastguard Worker if (single_menu_mode)
629*cf5a6c84SAndroid Build Coastguard Worker submenu->data = (void *) (long) !submenu->data;
630*cf5a6c84SAndroid Build Coastguard Worker else
631*cf5a6c84SAndroid Build Coastguard Worker conf(submenu);
632*cf5a6c84SAndroid Build Coastguard Worker break;
633*cf5a6c84SAndroid Build Coastguard Worker case 't':
634*cf5a6c84SAndroid Build Coastguard Worker if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
635*cf5a6c84SAndroid Build Coastguard Worker conf_choice(submenu);
636*cf5a6c84SAndroid Build Coastguard Worker else if (submenu->prompt->type == P_MENU)
637*cf5a6c84SAndroid Build Coastguard Worker conf(submenu);
638*cf5a6c84SAndroid Build Coastguard Worker break;
639*cf5a6c84SAndroid Build Coastguard Worker case 's':
640*cf5a6c84SAndroid Build Coastguard Worker conf_string(submenu);
641*cf5a6c84SAndroid Build Coastguard Worker break;
642*cf5a6c84SAndroid Build Coastguard Worker case 'L':
643*cf5a6c84SAndroid Build Coastguard Worker conf_load();
644*cf5a6c84SAndroid Build Coastguard Worker break;
645*cf5a6c84SAndroid Build Coastguard Worker case 'S':
646*cf5a6c84SAndroid Build Coastguard Worker conf_save();
647*cf5a6c84SAndroid Build Coastguard Worker break;
648*cf5a6c84SAndroid Build Coastguard Worker }
649*cf5a6c84SAndroid Build Coastguard Worker break;
650*cf5a6c84SAndroid Build Coastguard Worker case 2:
651*cf5a6c84SAndroid Build Coastguard Worker if (sym)
652*cf5a6c84SAndroid Build Coastguard Worker show_help(submenu);
653*cf5a6c84SAndroid Build Coastguard Worker else
654*cf5a6c84SAndroid Build Coastguard Worker show_helptext("README", _(mconf_readme));
655*cf5a6c84SAndroid Build Coastguard Worker break;
656*cf5a6c84SAndroid Build Coastguard Worker case 3:
657*cf5a6c84SAndroid Build Coastguard Worker if (item_is_tag('t')) {
658*cf5a6c84SAndroid Build Coastguard Worker if (sym_set_tristate_value(sym, yes))
659*cf5a6c84SAndroid Build Coastguard Worker break;
660*cf5a6c84SAndroid Build Coastguard Worker if (sym_set_tristate_value(sym, mod))
661*cf5a6c84SAndroid Build Coastguard Worker show_textbox(NULL, setmod_text, 6, 74);
662*cf5a6c84SAndroid Build Coastguard Worker }
663*cf5a6c84SAndroid Build Coastguard Worker break;
664*cf5a6c84SAndroid Build Coastguard Worker case 4:
665*cf5a6c84SAndroid Build Coastguard Worker if (item_is_tag('t'))
666*cf5a6c84SAndroid Build Coastguard Worker sym_set_tristate_value(sym, no);
667*cf5a6c84SAndroid Build Coastguard Worker break;
668*cf5a6c84SAndroid Build Coastguard Worker case 5:
669*cf5a6c84SAndroid Build Coastguard Worker if (item_is_tag('t'))
670*cf5a6c84SAndroid Build Coastguard Worker sym_set_tristate_value(sym, mod);
671*cf5a6c84SAndroid Build Coastguard Worker break;
672*cf5a6c84SAndroid Build Coastguard Worker case 6:
673*cf5a6c84SAndroid Build Coastguard Worker if (item_is_tag('t'))
674*cf5a6c84SAndroid Build Coastguard Worker sym_toggle_tristate_value(sym);
675*cf5a6c84SAndroid Build Coastguard Worker else if (item_is_tag('m'))
676*cf5a6c84SAndroid Build Coastguard Worker conf(submenu);
677*cf5a6c84SAndroid Build Coastguard Worker break;
678*cf5a6c84SAndroid Build Coastguard Worker case 7:
679*cf5a6c84SAndroid Build Coastguard Worker search_conf();
680*cf5a6c84SAndroid Build Coastguard Worker break;
681*cf5a6c84SAndroid Build Coastguard Worker }
682*cf5a6c84SAndroid Build Coastguard Worker }
683*cf5a6c84SAndroid Build Coastguard Worker }
684*cf5a6c84SAndroid Build Coastguard Worker
show_textbox(const char * title,const char * text,int r,int c)685*cf5a6c84SAndroid Build Coastguard Worker static void show_textbox(const char *title, const char *text, int r, int c)
686*cf5a6c84SAndroid Build Coastguard Worker {
687*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
688*cf5a6c84SAndroid Build Coastguard Worker dialog_textbox(title, text, r, c);
689*cf5a6c84SAndroid Build Coastguard Worker }
690*cf5a6c84SAndroid Build Coastguard Worker
show_helptext(const char * title,const char * text)691*cf5a6c84SAndroid Build Coastguard Worker static void show_helptext(const char *title, const char *text)
692*cf5a6c84SAndroid Build Coastguard Worker {
693*cf5a6c84SAndroid Build Coastguard Worker show_textbox(title, text, 0, 0);
694*cf5a6c84SAndroid Build Coastguard Worker }
695*cf5a6c84SAndroid Build Coastguard Worker
show_help(struct menu * menu)696*cf5a6c84SAndroid Build Coastguard Worker static void show_help(struct menu *menu)
697*cf5a6c84SAndroid Build Coastguard Worker {
698*cf5a6c84SAndroid Build Coastguard Worker struct gstr help = str_new();
699*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym = menu->sym;
700*cf5a6c84SAndroid Build Coastguard Worker
701*cf5a6c84SAndroid Build Coastguard Worker if (sym->help)
702*cf5a6c84SAndroid Build Coastguard Worker {
703*cf5a6c84SAndroid Build Coastguard Worker if (sym->name) {
704*cf5a6c84SAndroid Build Coastguard Worker str_printf(&help, "CONFIG_%s:\n\n", sym->name);
705*cf5a6c84SAndroid Build Coastguard Worker str_append(&help, _(sym->help));
706*cf5a6c84SAndroid Build Coastguard Worker str_append(&help, "\n");
707*cf5a6c84SAndroid Build Coastguard Worker }
708*cf5a6c84SAndroid Build Coastguard Worker } else {
709*cf5a6c84SAndroid Build Coastguard Worker str_append(&help, nohelp_text);
710*cf5a6c84SAndroid Build Coastguard Worker }
711*cf5a6c84SAndroid Build Coastguard Worker get_symbol_str(&help, sym);
712*cf5a6c84SAndroid Build Coastguard Worker show_helptext(menu_get_prompt(menu), str_get(&help));
713*cf5a6c84SAndroid Build Coastguard Worker str_free(&help);
714*cf5a6c84SAndroid Build Coastguard Worker }
715*cf5a6c84SAndroid Build Coastguard Worker
conf_choice(struct menu * menu)716*cf5a6c84SAndroid Build Coastguard Worker static void conf_choice(struct menu *menu)
717*cf5a6c84SAndroid Build Coastguard Worker {
718*cf5a6c84SAndroid Build Coastguard Worker const char *prompt = menu_get_prompt(menu);
719*cf5a6c84SAndroid Build Coastguard Worker struct menu *child;
720*cf5a6c84SAndroid Build Coastguard Worker struct symbol *active;
721*cf5a6c84SAndroid Build Coastguard Worker
722*cf5a6c84SAndroid Build Coastguard Worker active = sym_get_choice_value(menu->sym);
723*cf5a6c84SAndroid Build Coastguard Worker while (1) {
724*cf5a6c84SAndroid Build Coastguard Worker int res;
725*cf5a6c84SAndroid Build Coastguard Worker int selected;
726*cf5a6c84SAndroid Build Coastguard Worker item_reset();
727*cf5a6c84SAndroid Build Coastguard Worker
728*cf5a6c84SAndroid Build Coastguard Worker current_menu = menu;
729*cf5a6c84SAndroid Build Coastguard Worker for (child = menu->list; child; child = child->next) {
730*cf5a6c84SAndroid Build Coastguard Worker if (!menu_is_visible(child))
731*cf5a6c84SAndroid Build Coastguard Worker continue;
732*cf5a6c84SAndroid Build Coastguard Worker item_make("%s", menu_get_prompt(child));
733*cf5a6c84SAndroid Build Coastguard Worker item_set_data(child);
734*cf5a6c84SAndroid Build Coastguard Worker if (child->sym == active)
735*cf5a6c84SAndroid Build Coastguard Worker item_set_selected(1);
736*cf5a6c84SAndroid Build Coastguard Worker if (child->sym == sym_get_choice_value(menu->sym))
737*cf5a6c84SAndroid Build Coastguard Worker item_set_tag('X');
738*cf5a6c84SAndroid Build Coastguard Worker }
739*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
740*cf5a6c84SAndroid Build Coastguard Worker res = dialog_checklist(prompt ? prompt : _("Main Menu"),
741*cf5a6c84SAndroid Build Coastguard Worker _(radiolist_instructions),
742*cf5a6c84SAndroid Build Coastguard Worker 15, 70, 6);
743*cf5a6c84SAndroid Build Coastguard Worker selected = item_activate_selected();
744*cf5a6c84SAndroid Build Coastguard Worker switch (res) {
745*cf5a6c84SAndroid Build Coastguard Worker case 0:
746*cf5a6c84SAndroid Build Coastguard Worker if (selected) {
747*cf5a6c84SAndroid Build Coastguard Worker child = item_data();
748*cf5a6c84SAndroid Build Coastguard Worker sym_set_tristate_value(child->sym, yes);
749*cf5a6c84SAndroid Build Coastguard Worker }
750*cf5a6c84SAndroid Build Coastguard Worker return;
751*cf5a6c84SAndroid Build Coastguard Worker case 1:
752*cf5a6c84SAndroid Build Coastguard Worker if (selected) {
753*cf5a6c84SAndroid Build Coastguard Worker child = item_data();
754*cf5a6c84SAndroid Build Coastguard Worker show_help(child);
755*cf5a6c84SAndroid Build Coastguard Worker active = child->sym;
756*cf5a6c84SAndroid Build Coastguard Worker } else
757*cf5a6c84SAndroid Build Coastguard Worker show_help(menu);
758*cf5a6c84SAndroid Build Coastguard Worker break;
759*cf5a6c84SAndroid Build Coastguard Worker case KEY_ESC:
760*cf5a6c84SAndroid Build Coastguard Worker return;
761*cf5a6c84SAndroid Build Coastguard Worker case -ERRDISPLAYTOOSMALL:
762*cf5a6c84SAndroid Build Coastguard Worker return;
763*cf5a6c84SAndroid Build Coastguard Worker }
764*cf5a6c84SAndroid Build Coastguard Worker }
765*cf5a6c84SAndroid Build Coastguard Worker }
766*cf5a6c84SAndroid Build Coastguard Worker
conf_string(struct menu * menu)767*cf5a6c84SAndroid Build Coastguard Worker static void conf_string(struct menu *menu)
768*cf5a6c84SAndroid Build Coastguard Worker {
769*cf5a6c84SAndroid Build Coastguard Worker const char *prompt = menu_get_prompt(menu);
770*cf5a6c84SAndroid Build Coastguard Worker
771*cf5a6c84SAndroid Build Coastguard Worker while (1) {
772*cf5a6c84SAndroid Build Coastguard Worker int res;
773*cf5a6c84SAndroid Build Coastguard Worker char *heading;
774*cf5a6c84SAndroid Build Coastguard Worker
775*cf5a6c84SAndroid Build Coastguard Worker switch (sym_get_type(menu->sym)) {
776*cf5a6c84SAndroid Build Coastguard Worker case S_INT:
777*cf5a6c84SAndroid Build Coastguard Worker heading = (char *)_(inputbox_instructions_int);
778*cf5a6c84SAndroid Build Coastguard Worker break;
779*cf5a6c84SAndroid Build Coastguard Worker case S_HEX:
780*cf5a6c84SAndroid Build Coastguard Worker heading = (char *)_(inputbox_instructions_hex);
781*cf5a6c84SAndroid Build Coastguard Worker break;
782*cf5a6c84SAndroid Build Coastguard Worker case S_STRING:
783*cf5a6c84SAndroid Build Coastguard Worker heading = (char *)_(inputbox_instructions_string);
784*cf5a6c84SAndroid Build Coastguard Worker break;
785*cf5a6c84SAndroid Build Coastguard Worker default:
786*cf5a6c84SAndroid Build Coastguard Worker heading = "Internal mconf error!";
787*cf5a6c84SAndroid Build Coastguard Worker }
788*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
789*cf5a6c84SAndroid Build Coastguard Worker res = dialog_inputbox(prompt ? prompt : _("Main Menu"),
790*cf5a6c84SAndroid Build Coastguard Worker heading, 10, 75,
791*cf5a6c84SAndroid Build Coastguard Worker sym_get_string_value(menu->sym));
792*cf5a6c84SAndroid Build Coastguard Worker switch (res) {
793*cf5a6c84SAndroid Build Coastguard Worker case 0:
794*cf5a6c84SAndroid Build Coastguard Worker if (sym_set_string_value(menu->sym, dialog_input_result))
795*cf5a6c84SAndroid Build Coastguard Worker return;
796*cf5a6c84SAndroid Build Coastguard Worker show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
797*cf5a6c84SAndroid Build Coastguard Worker break;
798*cf5a6c84SAndroid Build Coastguard Worker case 1:
799*cf5a6c84SAndroid Build Coastguard Worker show_help(menu);
800*cf5a6c84SAndroid Build Coastguard Worker break;
801*cf5a6c84SAndroid Build Coastguard Worker case KEY_ESC:
802*cf5a6c84SAndroid Build Coastguard Worker return;
803*cf5a6c84SAndroid Build Coastguard Worker }
804*cf5a6c84SAndroid Build Coastguard Worker }
805*cf5a6c84SAndroid Build Coastguard Worker }
806*cf5a6c84SAndroid Build Coastguard Worker
conf_load(void)807*cf5a6c84SAndroid Build Coastguard Worker static void conf_load(void)
808*cf5a6c84SAndroid Build Coastguard Worker {
809*cf5a6c84SAndroid Build Coastguard Worker
810*cf5a6c84SAndroid Build Coastguard Worker while (1) {
811*cf5a6c84SAndroid Build Coastguard Worker int res;
812*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
813*cf5a6c84SAndroid Build Coastguard Worker res = dialog_inputbox(NULL, load_config_text,
814*cf5a6c84SAndroid Build Coastguard Worker 11, 55, filename);
815*cf5a6c84SAndroid Build Coastguard Worker switch(res) {
816*cf5a6c84SAndroid Build Coastguard Worker case 0:
817*cf5a6c84SAndroid Build Coastguard Worker if (!dialog_input_result[0])
818*cf5a6c84SAndroid Build Coastguard Worker return;
819*cf5a6c84SAndroid Build Coastguard Worker if (!conf_read(dialog_input_result))
820*cf5a6c84SAndroid Build Coastguard Worker return;
821*cf5a6c84SAndroid Build Coastguard Worker show_textbox(NULL, _("File does not exist!"), 5, 38);
822*cf5a6c84SAndroid Build Coastguard Worker break;
823*cf5a6c84SAndroid Build Coastguard Worker case 1:
824*cf5a6c84SAndroid Build Coastguard Worker show_helptext(_("Load Alternate Configuration"), load_config_help);
825*cf5a6c84SAndroid Build Coastguard Worker break;
826*cf5a6c84SAndroid Build Coastguard Worker case KEY_ESC:
827*cf5a6c84SAndroid Build Coastguard Worker return;
828*cf5a6c84SAndroid Build Coastguard Worker }
829*cf5a6c84SAndroid Build Coastguard Worker }
830*cf5a6c84SAndroid Build Coastguard Worker }
831*cf5a6c84SAndroid Build Coastguard Worker
conf_save(void)832*cf5a6c84SAndroid Build Coastguard Worker static void conf_save(void)
833*cf5a6c84SAndroid Build Coastguard Worker {
834*cf5a6c84SAndroid Build Coastguard Worker while (1) {
835*cf5a6c84SAndroid Build Coastguard Worker int res;
836*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
837*cf5a6c84SAndroid Build Coastguard Worker res = dialog_inputbox(NULL, save_config_text,
838*cf5a6c84SAndroid Build Coastguard Worker 11, 55, filename);
839*cf5a6c84SAndroid Build Coastguard Worker switch(res) {
840*cf5a6c84SAndroid Build Coastguard Worker case 0:
841*cf5a6c84SAndroid Build Coastguard Worker if (!dialog_input_result[0])
842*cf5a6c84SAndroid Build Coastguard Worker return;
843*cf5a6c84SAndroid Build Coastguard Worker if (!conf_write(dialog_input_result))
844*cf5a6c84SAndroid Build Coastguard Worker return;
845*cf5a6c84SAndroid Build Coastguard Worker show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60);
846*cf5a6c84SAndroid Build Coastguard Worker break;
847*cf5a6c84SAndroid Build Coastguard Worker case 1:
848*cf5a6c84SAndroid Build Coastguard Worker show_helptext(_("Save Alternate Configuration"), save_config_help);
849*cf5a6c84SAndroid Build Coastguard Worker break;
850*cf5a6c84SAndroid Build Coastguard Worker case KEY_ESC:
851*cf5a6c84SAndroid Build Coastguard Worker return;
852*cf5a6c84SAndroid Build Coastguard Worker }
853*cf5a6c84SAndroid Build Coastguard Worker }
854*cf5a6c84SAndroid Build Coastguard Worker }
855*cf5a6c84SAndroid Build Coastguard Worker
conf_cleanup(void)856*cf5a6c84SAndroid Build Coastguard Worker static void conf_cleanup(void)
857*cf5a6c84SAndroid Build Coastguard Worker {
858*cf5a6c84SAndroid Build Coastguard Worker tcsetattr(1, TCSAFLUSH, &ios_org);
859*cf5a6c84SAndroid Build Coastguard Worker }
860*cf5a6c84SAndroid Build Coastguard Worker
main(int ac,char ** av)861*cf5a6c84SAndroid Build Coastguard Worker int main(int ac, char **av)
862*cf5a6c84SAndroid Build Coastguard Worker {
863*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym;
864*cf5a6c84SAndroid Build Coastguard Worker char *mode;
865*cf5a6c84SAndroid Build Coastguard Worker int res;
866*cf5a6c84SAndroid Build Coastguard Worker
867*cf5a6c84SAndroid Build Coastguard Worker setlocale(LC_ALL, "");
868*cf5a6c84SAndroid Build Coastguard Worker bindtextdomain(PACKAGE, LOCALEDIR);
869*cf5a6c84SAndroid Build Coastguard Worker textdomain(PACKAGE);
870*cf5a6c84SAndroid Build Coastguard Worker
871*cf5a6c84SAndroid Build Coastguard Worker conf_parse(av[1] ? av[1] : "");
872*cf5a6c84SAndroid Build Coastguard Worker conf_read(NULL);
873*cf5a6c84SAndroid Build Coastguard Worker
874*cf5a6c84SAndroid Build Coastguard Worker sym = sym_lookup("KERNELVERSION", 0);
875*cf5a6c84SAndroid Build Coastguard Worker sym_calc_value(sym);
876*cf5a6c84SAndroid Build Coastguard Worker sprintf(menu_backtitle, _(PROJECT_NAME" v%s Configuration"),
877*cf5a6c84SAndroid Build Coastguard Worker sym_get_string_value(sym));
878*cf5a6c84SAndroid Build Coastguard Worker
879*cf5a6c84SAndroid Build Coastguard Worker mode = getenv("MENUCONFIG_MODE");
880*cf5a6c84SAndroid Build Coastguard Worker if (mode) {
881*cf5a6c84SAndroid Build Coastguard Worker if (!strcasecmp(mode, "single_menu"))
882*cf5a6c84SAndroid Build Coastguard Worker single_menu_mode = 1;
883*cf5a6c84SAndroid Build Coastguard Worker }
884*cf5a6c84SAndroid Build Coastguard Worker
885*cf5a6c84SAndroid Build Coastguard Worker tcgetattr(1, &ios_org);
886*cf5a6c84SAndroid Build Coastguard Worker atexit(conf_cleanup);
887*cf5a6c84SAndroid Build Coastguard Worker init_wsize();
888*cf5a6c84SAndroid Build Coastguard Worker reset_dialog();
889*cf5a6c84SAndroid Build Coastguard Worker init_dialog(menu_backtitle);
890*cf5a6c84SAndroid Build Coastguard Worker do {
891*cf5a6c84SAndroid Build Coastguard Worker conf(&rootmenu);
892*cf5a6c84SAndroid Build Coastguard Worker dialog_clear();
893*cf5a6c84SAndroid Build Coastguard Worker res = dialog_yesno(NULL,
894*cf5a6c84SAndroid Build Coastguard Worker _("Do you wish to save your "
895*cf5a6c84SAndroid Build Coastguard Worker "new "PROJECT_NAME" configuration?\n"
896*cf5a6c84SAndroid Build Coastguard Worker "<ESC><ESC> to continue."),
897*cf5a6c84SAndroid Build Coastguard Worker 6, 60);
898*cf5a6c84SAndroid Build Coastguard Worker } while (res == KEY_ESC);
899*cf5a6c84SAndroid Build Coastguard Worker end_dialog();
900*cf5a6c84SAndroid Build Coastguard Worker if (res == 0) {
901*cf5a6c84SAndroid Build Coastguard Worker if (conf_write(NULL)) {
902*cf5a6c84SAndroid Build Coastguard Worker fprintf(stderr, _("\n\n"
903*cf5a6c84SAndroid Build Coastguard Worker "Error writing "PROJECT_NAME" configuration.\n"
904*cf5a6c84SAndroid Build Coastguard Worker "Your configuration changes were NOT saved."
905*cf5a6c84SAndroid Build Coastguard Worker "\n\n"));
906*cf5a6c84SAndroid Build Coastguard Worker return 1;
907*cf5a6c84SAndroid Build Coastguard Worker }
908*cf5a6c84SAndroid Build Coastguard Worker printf(_("\n\n"
909*cf5a6c84SAndroid Build Coastguard Worker "*** End of "PROJECT_NAME" configuration.\n"
910*cf5a6c84SAndroid Build Coastguard Worker "*** Execute 'make' to build, or try 'make help'."
911*cf5a6c84SAndroid Build Coastguard Worker "\n\n"));
912*cf5a6c84SAndroid Build Coastguard Worker } else {
913*cf5a6c84SAndroid Build Coastguard Worker fprintf(stderr, _("\n\n"
914*cf5a6c84SAndroid Build Coastguard Worker "Your configuration changes were NOT saved."
915*cf5a6c84SAndroid Build Coastguard Worker "\n\n"));
916*cf5a6c84SAndroid Build Coastguard Worker }
917*cf5a6c84SAndroid Build Coastguard Worker
918*cf5a6c84SAndroid Build Coastguard Worker return 0;
919*cf5a6c84SAndroid Build Coastguard Worker }
920