blob: 25b60bc117f738fabc26efb9a2e8f4f7546cd8d1 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
4 *
5 * Introduced single menu mode (show all sub-menus in one large tree).
6 * 2002-11-06 Petr Baudis <pasky@ucw.cz>
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -07007 *
8 * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br>
Linus Torvalds1da177e2005-04-16 15:20:36 -07009 */
10
Linus Torvalds1da177e2005-04-16 15:20:36 -070011#include <ctype.h>
12#include <errno.h>
13#include <fcntl.h>
14#include <limits.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070015#include <stdarg.h>
16#include <stdlib.h>
17#include <string.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <unistd.h>
Jean-Christophe Dubois442ff702005-06-25 14:55:43 -070019#include <locale.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070020
21#define LKC_DIRECT_LINK
22#include "lkc.h"
Sam Ravnborg2982de62006-07-27 22:10:27 +020023#include "lxdialog/dialog.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -070025static const char mconf_readme[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -070026"Overview\n"
27"--------\n"
28"Some kernel features may be built directly into the kernel.\n"
29"Some may be made into loadable runtime modules. Some features\n"
30"may be completely removed altogether. There are also certain\n"
31"kernel parameters which are not really features, but must be\n"
32"entered in as decimal or hexadecimal numbers or possibly text.\n"
33"\n"
Matej Laitlb5d609d2007-10-02 13:46:50 -070034"Menu items beginning with following braces represent features that\n"
35" [ ] can be built in or removed\n"
36" < > can be built in, modularized or removed\n"
37" { } can be built in or modularized (selected by other feature)\n"
38" - - are selected by other feature,\n"
39"while *, M or whitespace inside braces means to build in, build as\n"
40"a module or to exclude the feature respectively.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -070041"\n"
42"To change any of these features, highlight it with the cursor\n"
43"keys and press <Y> to build it in, <M> to make it a module or\n"
44"<N> to removed it. You may also press the <Space Bar> to cycle\n"
45"through the available options (ie. Y->N->M->Y).\n"
46"\n"
47"Some additional keyboard hints:\n"
48"\n"
49"Menus\n"
50"----------\n"
51"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
52" you wish to change or submenu wish to select and press <Enter>.\n"
53" Submenus are designated by \"--->\".\n"
54"\n"
55" Shortcut: Press the option's highlighted letter (hotkey).\n"
56" Pressing a hotkey more than once will sequence\n"
57" through all visible items which use that hotkey.\n"
58"\n"
59" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
60" unseen options into view.\n"
61"\n"
62"o To exit a menu use the cursor keys to highlight the <Exit> button\n"
63" and press <ENTER>.\n"
64"\n"
65" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
66" using those letters. You may press a single <ESC>, but\n"
67" there is a delayed response which you may find annoying.\n"
68"\n"
69" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
70" <Exit> and <Help>\n"
71"\n"
72"o To get help with an item, use the cursor keys to highlight <Help>\n"
73" and Press <ENTER>.\n"
74"\n"
75" Shortcut: Press <H> or <?>.\n"
76"\n"
77"\n"
78"Radiolists (Choice lists)\n"
79"-----------\n"
80"o Use the cursor keys to select the option you wish to set and press\n"
81" <S> or the <SPACE BAR>.\n"
82"\n"
83" Shortcut: Press the first letter of the option you wish to set then\n"
84" press <S> or <SPACE BAR>.\n"
85"\n"
86"o To see available help for the item, use the cursor keys to highlight\n"
87" <Help> and Press <ENTER>.\n"
88"\n"
89" Shortcut: Press <H> or <?>.\n"
90"\n"
91" Also, the <TAB> and cursor keys will cycle between <Select> and\n"
92" <Help>\n"
93"\n"
94"\n"
95"Data Entry\n"
96"-----------\n"
97"o Enter the requested information and press <ENTER>\n"
98" If you are entering hexadecimal values, it is not necessary to\n"
99" add the '0x' prefix to the entry.\n"
100"\n"
101"o For help, use the <TAB> or cursor keys to highlight the help option\n"
102" and press <ENTER>. You can try <TAB><H> as well.\n"
103"\n"
104"\n"
105"Text Box (Help Window)\n"
106"--------\n"
107"o Use the cursor keys to scroll up/down/left/right. The VI editor\n"
108" keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
109" who are familiar with less and lynx.\n"
110"\n"
111"o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
112"\n"
113"\n"
114"Alternate Configuration Files\n"
115"-----------------------------\n"
116"Menuconfig supports the use of alternate configuration files for\n"
117"those who, for various reasons, find it necessary to switch\n"
118"between different kernel configurations.\n"
119"\n"
120"At the end of the main menu you will find two options. One is\n"
121"for saving the current configuration to a file of your choosing.\n"
122"The other option is for loading a previously saved alternate\n"
123"configuration.\n"
124"\n"
125"Even if you don't use alternate configuration files, but you\n"
126"find during a Menuconfig session that you have completely messed\n"
127"up your settings, you may use the \"Load Alternate...\" option to\n"
128"restore your previously saved settings from \".config\" without\n"
129"restarting Menuconfig.\n"
130"\n"
131"Other information\n"
132"-----------------\n"
133"If you use Menuconfig in an XTERM window make sure you have your\n"
134"$TERM variable set to point to a xterm definition which supports color.\n"
135"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n"
136"display correctly in a RXVT window because rxvt displays only one\n"
137"intensity of color, bright.\n"
138"\n"
139"Menuconfig will display larger menus on screens or xterms which are\n"
140"set to display more than the standard 25 row by 80 column geometry.\n"
141"In order for this to work, the \"stty size\" command must be able to\n"
142"display the screen's current row and column geometry. I STRONGLY\n"
143"RECOMMEND that you make sure you do NOT have the shell variables\n"
144"LINES and COLUMNS exported into your environment. Some distributions\n"
145"export those variables via /etc/profile. Some ncurses programs can\n"
146"become confused when those variables (LINES & COLUMNS) don't reflect\n"
147"the true screen size.\n"
148"\n"
149"Optional personality available\n"
150"------------------------------\n"
151"If you prefer to have all of the kernel options listed in a single\n"
152"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
153"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
154"\n"
155"make MENUCONFIG_MODE=single_menu menuconfig\n"
156"\n"
157"<Enter> will then unroll the appropriate category, or enfold it if it\n"
158"is already unrolled.\n"
159"\n"
160"Note that this mode can eventually be a little more CPU expensive\n"
161"(especially with a larger number of unrolled categories) than the\n"
Sam Ravnborg45897212006-07-24 22:04:04 +0200162"default mode.\n"
163"\n"
164"Different color themes available\n"
165"--------------------------------\n"
166"It is possible to select different color themes using the variable\n"
167"MENUCONFIG_COLOR. To select a theme use:\n"
168"\n"
169"make MENUCONFIG_COLOR=<theme> menuconfig\n"
170"\n"
171"Available themes are\n"
172" mono => selects colors suitable for monochrome displays\n"
173" blackbg => selects a color scheme with black background\n"
Sam Ravnborg350b5b72006-07-24 22:19:51 +0200174" classic => theme with blue background. The classic look\n"
175" bluetitle => a LCD friendly version of classic. (default)\n"
Sam Ravnborg45897212006-07-24 22:04:04 +0200176"\n"),
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700177menu_instructions[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178 "Arrow keys navigate the menu. "
179 "<Enter> selects submenus --->. "
180 "Highlighted letters are hotkeys. "
181 "Pressing <Y> includes, <N> excludes, <M> modularizes features. "
182 "Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700183 "Legend: [*] built-in [ ] excluded <M> module < > module capable"),
184radiolist_instructions[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185 "Use the arrow keys to navigate this window or "
186 "press the hotkey of the item you wish to select "
187 "followed by the <SPACE BAR>. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700188 "Press <?> for additional information about this option."),
189inputbox_instructions_int[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 "Please enter a decimal value. "
191 "Fractions will not be accepted. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700192 "Use the <TAB> key to move from the input field to the buttons below it."),
193inputbox_instructions_hex[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194 "Please enter a hexadecimal value. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700195 "Use the <TAB> key to move from the input field to the buttons below it."),
196inputbox_instructions_string[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 "Please enter a string value. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700198 "Use the <TAB> key to move from the input field to the buttons below it."),
199setmod_text[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200 "This feature depends on another which has been configured as a module.\n"
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700201 "As a result, this feature will be built as a module."),
202nohelp_text[] = N_(
203 "There is no help available for this kernel option.\n"),
204load_config_text[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 "Enter the name of the configuration file you wish to load. "
206 "Accept the name shown to restore the configuration you "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700207 "last retrieved. Leave blank to abort."),
208load_config_help[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 "\n"
210 "For various reasons, one may wish to keep several different kernel\n"
211 "configurations available on a single machine.\n"
212 "\n"
213 "If you have saved a previous configuration in a file other than the\n"
214 "kernel's default, entering the name of the file here will allow you\n"
215 "to modify that configuration.\n"
216 "\n"
217 "If you are uncertain, then you have probably never used alternate\n"
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700218 "configuration files. You should therefor leave this blank to abort.\n"),
219save_config_text[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220 "Enter a filename to which this configuration should be saved "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700221 "as an alternate. Leave blank to abort."),
222save_config_help[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 "\n"
224 "For various reasons, one may wish to keep different kernel\n"
225 "configurations available on a single machine.\n"
226 "\n"
227 "Entering a file name here will allow you to later retrieve, modify\n"
228 "and use the current configuration as an alternate to whatever\n"
229 "configuration options you have selected at that time.\n"
230 "\n"
231 "If you are uncertain what all this means then you should probably\n"
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700232 "leave this blank.\n"),
233search_help[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234 "\n"
235 "Search for CONFIG_ symbols and display their relations.\n"
Randy Dunlap503af332005-10-30 15:02:15 -0800236 "Regular expressions are allowed.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237 "Example: search for \"^FOO\"\n"
238 "Result:\n"
239 "-----------------------------------------------------------------\n"
240 "Symbol: FOO [=m]\n"
241 "Prompt: Foo bus is used to drive the bar HW\n"
242 "Defined at drivers/pci/Kconfig:47\n"
243 "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
244 "Location:\n"
245 " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
246 " -> PCI support (PCI [=y])\n"
247 " -> PCI access mode (<choice> [=y])\n"
248 "Selects: LIBCRC32\n"
249 "Selected by: BAR\n"
250 "-----------------------------------------------------------------\n"
251 "o The line 'Prompt:' shows the text used in the menu structure for\n"
252 " this CONFIG_ symbol\n"
253 "o The 'Defined at' line tell at what file / line number the symbol\n"
254 " is defined\n"
255 "o The 'Depends on:' line tell what symbols needs to be defined for\n"
256 " this symbol to be visible in the menu (selectable)\n"
257 "o The 'Location:' lines tell where in the menu structure this symbol\n"
258 " is located\n"
259 " A location followed by a [=y] indicate that this is a selectable\n"
260 " menu item - and current value is displayed inside brackets.\n"
261 "o The 'Selects:' line tell what symbol will be automatically\n"
262 " selected if this symbol is selected (y or m)\n"
263 "o The 'Selected by' line tell what symbol has selected this symbol\n"
264 "\n"
265 "Only relevant lines are shown.\n"
266 "\n\n"
267 "Search examples:\n"
268 "Examples: USB => find all CONFIG_ symbols containing USB\n"
269 " ^USB => find all CONFIG_ symbols starting with USB\n"
270 " USB$ => find all CONFIG_ symbols ending with USB\n"
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700271 "\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700272
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273static int indent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274static struct menu *current_menu;
275static int child_count;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276static int single_menu_mode;
277
278static void conf(struct menu *menu);
279static void conf_choice(struct menu *menu);
280static void conf_string(struct menu *menu);
281static void conf_load(void);
282static void conf_save(void);
283static void show_textbox(const char *title, const char *text, int r, int c);
284static void show_helptext(const char *title, const char *text);
285static void show_help(struct menu *menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287static void get_prompt_str(struct gstr *r, struct property *prop)
288{
289 int i, j;
290 struct menu *submenu[8], *menu;
291
EGRY Gabor413f0062008-01-11 23:50:37 +0100292 str_printf(r, _("Prompt: %s\n"), _(prop->text));
293 str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294 prop->menu->lineno);
295 if (!expr_is_yes(prop->visible.expr)) {
EGRY Gabor413f0062008-01-11 23:50:37 +0100296 str_append(r, _(" Depends on: "));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297 expr_gstr_print(prop->visible.expr, r);
298 str_append(r, "\n");
299 }
300 menu = prop->menu->parent;
301 for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
302 submenu[i++] = menu;
303 if (i > 0) {
EGRY Gabor413f0062008-01-11 23:50:37 +0100304 str_printf(r, _(" Location:\n"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305 for (j = 4; --i >= 0; j += 2) {
306 menu = submenu[i];
EGRY Gabor413f0062008-01-11 23:50:37 +0100307 str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu)));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308 if (menu->sym) {
309 str_printf(r, " (%s [=%s])", menu->sym->name ?
EGRY Gabor413f0062008-01-11 23:50:37 +0100310 menu->sym->name : _("<choice>"),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311 sym_get_string_value(menu->sym));
312 }
313 str_append(r, "\n");
314 }
315 }
316}
317
318static void get_symbol_str(struct gstr *r, struct symbol *sym)
319{
320 bool hit;
321 struct property *prop;
322
Sam Ravnborga67cb132007-09-19 21:23:09 +0200323 if (sym && sym->name)
324 str_printf(r, "Symbol: %s [=%s]\n", sym->name,
325 sym_get_string_value(sym));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 for_all_prompts(sym, prop)
327 get_prompt_str(r, prop);
328 hit = false;
329 for_all_properties(sym, prop, P_SELECT) {
330 if (!hit) {
331 str_append(r, " Selects: ");
332 hit = true;
333 } else
334 str_printf(r, " && ");
335 expr_gstr_print(prop->expr, r);
336 }
337 if (hit)
338 str_append(r, "\n");
339 if (sym->rev_dep.expr) {
EGRY Gabor413f0062008-01-11 23:50:37 +0100340 str_append(r, _(" Selected by: "));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341 expr_gstr_print(sym->rev_dep.expr, r);
342 str_append(r, "\n");
343 }
344 str_append(r, "\n\n");
345}
346
347static struct gstr get_relations_str(struct symbol **sym_arr)
348{
349 struct symbol *sym;
350 struct gstr res = str_new();
351 int i;
352
353 for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
354 get_symbol_str(&res, sym);
355 if (!i)
EGRY Gabor413f0062008-01-11 23:50:37 +0100356 str_append(&res, _("No matches found.\n"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357 return res;
358}
359
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100360static char filename[PATH_MAX+1];
361static void set_config_filename(const char *config_filename)
362{
363 static char menu_backtitle[PATH_MAX+128];
364 int size;
365 struct symbol *sym;
366
367 sym = sym_lookup("KERNELVERSION", 0);
368 sym_calc_value(sym);
369 size = snprintf(menu_backtitle, sizeof(menu_backtitle),
370 _("%s - Linux Kernel v%s Configuration"),
371 config_filename, sym_get_string_value(sym));
372 if (size >= sizeof(menu_backtitle))
373 menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
374 set_dialog_backtitle(menu_backtitle);
375
376 size = snprintf(filename, sizeof(filename), "%s", config_filename);
377 if (size >= sizeof(filename))
378 filename[sizeof(filename)-1] = '\0';
379}
380
381
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382static void search_conf(void)
383{
384 struct symbol **sym_arr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 struct gstr res;
Bernhard Walle0584f9f2007-07-09 11:43:56 -0700386 char *dialog_input;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200387 int dres;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388again:
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200389 dialog_clear();
Sam Ravnborg2982de62006-07-27 22:10:27 +0200390 dres = dialog_inputbox(_("Search Configuration Parameter"),
Bernhard Walle0584f9f2007-07-09 11:43:56 -0700391 _("Enter CONFIG_ (sub)string to search for "
392 "(with or without \"CONFIG\")"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200393 10, 75, "");
394 switch (dres) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 case 0:
396 break;
397 case 1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700398 show_helptext(_("Search Configuration"), search_help);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399 goto again;
400 default:
401 return;
402 }
403
Bernhard Walle0584f9f2007-07-09 11:43:56 -0700404 /* strip CONFIG_ if necessary */
405 dialog_input = dialog_input_result;
406 if (strncasecmp(dialog_input_result, "CONFIG_", 7) == 0)
407 dialog_input += 7;
408
409 sym_arr = sym_re_search(dialog_input);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410 res = get_relations_str(sym_arr);
411 free(sym_arr);
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700412 show_textbox(_("Search Results"), str_get(&res), 0, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 str_free(&res);
414}
415
416static void build_conf(struct menu *menu)
417{
418 struct symbol *sym;
419 struct property *prop;
420 struct menu *child;
421 int type, tmp, doint = 2;
422 tristate val;
423 char ch;
424
425 if (!menu_is_visible(menu))
426 return;
427
428 sym = menu->sym;
429 prop = menu->prompt;
430 if (!sym) {
431 if (prop && menu != current_menu) {
432 const char *prompt = menu_get_prompt(menu);
433 switch (prop->type) {
434 case P_MENU:
435 child_count++;
EGRY Gabor413f0062008-01-11 23:50:37 +0100436 prompt = _(prompt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437 if (single_menu_mode) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200438 item_make("%s%*c%s",
439 menu->data ? "-->" : "++>",
440 indent + 1, ' ', prompt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 } else
Sam Ravnborg2982de62006-07-27 22:10:27 +0200442 item_make(" %*c%s --->", indent + 1, ' ', prompt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443
Sam Ravnborg2982de62006-07-27 22:10:27 +0200444 item_set_tag('m');
445 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 if (single_menu_mode && menu->data)
447 goto conf_childs;
448 return;
Sam Ravnborg48874072007-09-18 21:12:26 +0200449 case P_COMMENT:
450 if (prompt) {
451 child_count++;
EGRY Gabor413f0062008-01-11 23:50:37 +0100452 item_make(" %*c*** %s ***", indent + 1, ' ', _(prompt));
Sam Ravnborg48874072007-09-18 21:12:26 +0200453 item_set_tag(':');
454 item_set_data(menu);
455 }
456 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 default:
458 if (prompt) {
459 child_count++;
EGRY Gabor413f0062008-01-11 23:50:37 +0100460 item_make("---%*c%s", indent + 1, ' ', _(prompt));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200461 item_set_tag(':');
462 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 }
464 }
465 } else
466 doint = 0;
467 goto conf_childs;
468 }
469
470 type = sym_get_type(sym);
471 if (sym_is_choice(sym)) {
472 struct symbol *def_sym = sym_get_choice_value(sym);
473 struct menu *def_menu = NULL;
474
475 child_count++;
476 for (child = menu->list; child; child = child->next) {
477 if (menu_is_visible(child) && child->sym == def_sym)
478 def_menu = child;
479 }
480
481 val = sym_get_tristate_value(sym);
482 if (sym_is_changable(sym)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 switch (type) {
484 case S_BOOLEAN:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200485 item_make("[%c]", val == no ? ' ' : '*');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 break;
487 case S_TRISTATE:
488 switch (val) {
489 case yes: ch = '*'; break;
490 case mod: ch = 'M'; break;
491 default: ch = ' '; break;
492 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200493 item_make("<%c>", ch);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 break;
495 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200496 item_set_tag('t');
497 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498 } else {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200499 item_make(" ");
500 item_set_tag(def_menu ? 't' : ':');
501 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502 }
503
EGRY Gabor413f0062008-01-11 23:50:37 +0100504 item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 if (val == yes) {
506 if (def_menu) {
EGRY Gabor413f0062008-01-11 23:50:37 +0100507 item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200508 item_add_str(" --->");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 if (def_menu->list) {
510 indent += 2;
511 build_conf(def_menu);
512 indent -= 2;
513 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200514 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515 return;
516 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517 } else {
518 if (menu == current_menu) {
EGRY Gabor413f0062008-01-11 23:50:37 +0100519 item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200520 item_set_tag(':');
521 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 goto conf_childs;
523 }
524 child_count++;
525 val = sym_get_tristate_value(sym);
526 if (sym_is_choice_value(sym) && val == yes) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200527 item_make(" ");
528 item_set_tag(':');
529 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530 } else {
531 switch (type) {
532 case S_BOOLEAN:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533 if (sym_is_changable(sym))
Sam Ravnborg2982de62006-07-27 22:10:27 +0200534 item_make("[%c]", val == no ? ' ' : '*');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535 else
Matej Laitlb5d609d2007-10-02 13:46:50 -0700536 item_make("-%c-", val == no ? ' ' : '*');
Sam Ravnborg2982de62006-07-27 22:10:27 +0200537 item_set_tag('t');
538 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 break;
540 case S_TRISTATE:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 switch (val) {
542 case yes: ch = '*'; break;
543 case mod: ch = 'M'; break;
544 default: ch = ' '; break;
545 }
Matej Laitlb5d609d2007-10-02 13:46:50 -0700546 if (sym_is_changable(sym)) {
547 if (sym->rev_dep.tri == mod)
548 item_make("{%c}", ch);
549 else
550 item_make("<%c>", ch);
551 } else
552 item_make("-%c-", ch);
Sam Ravnborg2982de62006-07-27 22:10:27 +0200553 item_set_tag('t');
554 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555 break;
556 default:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200557 tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
558 item_make("(%s)", sym_get_string_value(sym));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559 tmp = indent - tmp + 4;
560 if (tmp < 0)
561 tmp = 0;
EGRY Gabor413f0062008-01-11 23:50:37 +0100562 item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200563 (sym_has_value(sym) || !sym_is_changable(sym)) ?
EGRY Gabor413f0062008-01-11 23:50:37 +0100564 "" : _(" (NEW)"));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200565 item_set_tag('s');
566 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567 goto conf_childs;
568 }
569 }
EGRY Gabor413f0062008-01-11 23:50:37 +0100570 item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200571 (sym_has_value(sym) || !sym_is_changable(sym)) ?
EGRY Gabor413f0062008-01-11 23:50:37 +0100572 "" : _(" (NEW)"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 if (menu->prompt->type == P_MENU) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200574 item_add_str(" --->");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 return;
576 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 }
578
579conf_childs:
580 indent += doint;
581 for (child = menu->list; child; child = child->next)
582 build_conf(child);
583 indent -= doint;
584}
585
586static void conf(struct menu *menu)
587{
588 struct menu *submenu;
589 const char *prompt = menu_get_prompt(menu);
590 struct symbol *sym;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200591 struct menu *active_menu = NULL;
592 int res;
593 int s_scroll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700594
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200596 item_reset();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597 current_menu = menu;
598 build_conf(menu);
599 if (!child_count)
600 break;
601 if (menu == &rootmenu) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200602 item_make("--- ");
603 item_set_tag(':');
604 item_make(_(" Load an Alternate Configuration File"));
605 item_set_tag('L');
606 item_make(_(" Save an Alternate Configuration File"));
607 item_set_tag('S');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608 }
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200609 dialog_clear();
EGRY Gabor413f0062008-01-11 23:50:37 +0100610 res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200611 _(menu_instructions),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200612 active_menu, &s_scroll);
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200613 if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 break;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200615 if (!item_activate_selected())
616 continue;
617 if (!item_tag())
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618 continue;
619
Sam Ravnborg2982de62006-07-27 22:10:27 +0200620 submenu = item_data();
621 active_menu = item_data();
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200622 if (submenu)
623 sym = submenu->sym;
624 else
625 sym = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626
Sam Ravnborg2982de62006-07-27 22:10:27 +0200627 switch (res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200629 switch (item_tag()) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630 case 'm':
631 if (single_menu_mode)
632 submenu->data = (void *) (long) !submenu->data;
633 else
634 conf(submenu);
635 break;
636 case 't':
637 if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
638 conf_choice(submenu);
639 else if (submenu->prompt->type == P_MENU)
640 conf(submenu);
641 break;
642 case 's':
643 conf_string(submenu);
644 break;
645 case 'L':
646 conf_load();
647 break;
648 case 'S':
649 conf_save();
650 break;
651 }
652 break;
653 case 2:
654 if (sym)
655 show_help(submenu);
656 else
EGRY Gabor413f0062008-01-11 23:50:37 +0100657 show_helptext(_("README"), _(mconf_readme));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658 break;
659 case 3:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200660 if (item_is_tag('t')) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 if (sym_set_tristate_value(sym, yes))
662 break;
663 if (sym_set_tristate_value(sym, mod))
664 show_textbox(NULL, setmod_text, 6, 74);
665 }
666 break;
667 case 4:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200668 if (item_is_tag('t'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 sym_set_tristate_value(sym, no);
670 break;
671 case 5:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200672 if (item_is_tag('t'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 sym_set_tristate_value(sym, mod);
674 break;
675 case 6:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200676 if (item_is_tag('t'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 sym_toggle_tristate_value(sym);
Sam Ravnborg2982de62006-07-27 22:10:27 +0200678 else if (item_is_tag('m'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 conf(submenu);
680 break;
681 case 7:
682 search_conf();
683 break;
684 }
685 }
686}
687
688static void show_textbox(const char *title, const char *text, int r, int c)
689{
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200690 dialog_clear();
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200691 dialog_textbox(title, text, r, c);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692}
693
694static void show_helptext(const char *title, const char *text)
695{
696 show_textbox(title, text, 0, 0);
697}
698
699static void show_help(struct menu *menu)
700{
701 struct gstr help = str_new();
702 struct symbol *sym = menu->sym;
703
Sam Ravnborg03d29122007-07-21 00:00:36 +0200704 if (menu_has_help(menu))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705 {
706 if (sym->name) {
707 str_printf(&help, "CONFIG_%s:\n\n", sym->name);
Sam Ravnborg03d29122007-07-21 00:00:36 +0200708 str_append(&help, _(menu_get_help(menu)));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709 str_append(&help, "\n");
710 }
711 } else {
712 str_append(&help, nohelp_text);
713 }
714 get_symbol_str(&help, sym);
EGRY Gabor413f0062008-01-11 23:50:37 +0100715 show_helptext(_(menu_get_prompt(menu)), str_get(&help));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 str_free(&help);
717}
718
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719static void conf_choice(struct menu *menu)
720{
EGRY Gabor413f0062008-01-11 23:50:37 +0100721 const char *prompt = _(menu_get_prompt(menu));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 struct menu *child;
723 struct symbol *active;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724
725 active = sym_get_choice_value(menu->sym);
726 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200727 int res;
728 int selected;
729 item_reset();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730
731 current_menu = menu;
732 for (child = menu->list; child; child = child->next) {
733 if (!menu_is_visible(child))
734 continue;
Peter Korsgaardaf6c1592009-02-15 22:15:16 +0100735 if (child->sym)
736 item_make("%s", _(menu_get_prompt(child)));
737 else {
738 item_make("*** %s ***", _(menu_get_prompt(child)));
739 item_set_tag(':');
740 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200741 item_set_data(child);
742 if (child->sym == active)
743 item_set_selected(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744 if (child->sym == sym_get_choice_value(menu->sym))
Sam Ravnborg2982de62006-07-27 22:10:27 +0200745 item_set_tag('X');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746 }
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200747 dialog_clear();
EGRY Gabor413f0062008-01-11 23:50:37 +0100748 res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200749 _(radiolist_instructions),
750 15, 70, 6);
751 selected = item_activate_selected();
752 switch (res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200754 if (selected) {
755 child = item_data();
Peter Korsgaardaf6c1592009-02-15 22:15:16 +0100756 if (!child->sym)
757 break;
758
Sam Ravnborg2982de62006-07-27 22:10:27 +0200759 sym_set_tristate_value(child->sym, yes);
760 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700761 return;
762 case 1:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200763 if (selected) {
764 child = item_data();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765 show_help(child);
766 active = child->sym;
767 } else
768 show_help(menu);
769 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200770 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 return;
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200772 case -ERRDISPLAYTOOSMALL:
773 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774 }
775 }
776}
777
778static void conf_string(struct menu *menu)
779{
780 const char *prompt = menu_get_prompt(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781
782 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200783 int res;
Sam Ravnborgc4143a82008-05-04 21:03:20 +0200784 const char *heading;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200785
Linus Torvalds1da177e2005-04-16 15:20:36 -0700786 switch (sym_get_type(menu->sym)) {
787 case S_INT:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200788 heading = _(inputbox_instructions_int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 break;
790 case S_HEX:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200791 heading = _(inputbox_instructions_hex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792 break;
793 case S_STRING:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200794 heading = _(inputbox_instructions_string);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 break;
796 default:
EGRY Gabor413f0062008-01-11 23:50:37 +0100797 heading = _("Internal mconf error!");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798 }
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200799 dialog_clear();
EGRY Gabor413f0062008-01-11 23:50:37 +0100800 res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200801 heading, 10, 75,
802 sym_get_string_value(menu->sym));
803 switch (res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200805 if (sym_set_string_value(menu->sym, dialog_input_result))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 return;
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700807 show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 break;
809 case 1:
810 show_help(menu);
811 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200812 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 return;
814 }
815 }
816}
817
818static void conf_load(void)
819{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820
821 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200822 int res;
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200823 dialog_clear();
Sam Ravnborg2982de62006-07-27 22:10:27 +0200824 res = dialog_inputbox(NULL, load_config_text,
825 11, 55, filename);
826 switch(res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200828 if (!dialog_input_result[0])
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100830 if (!conf_read(dialog_input_result)) {
831 set_config_filename(dialog_input_result);
Sam Ravnborg36ef8052008-02-02 20:44:09 +0100832 sym_set_change_count(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100834 }
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700835 show_textbox(NULL, _("File does not exist!"), 5, 38);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836 break;
837 case 1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700838 show_helptext(_("Load Alternate Configuration"), load_config_help);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200840 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841 return;
842 }
843 }
844}
845
846static void conf_save(void)
847{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200849 int res;
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200850 dialog_clear();
Sam Ravnborg2982de62006-07-27 22:10:27 +0200851 res = dialog_inputbox(NULL, save_config_text,
852 11, 55, filename);
853 switch(res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200855 if (!dialog_input_result[0])
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100857 if (!conf_write(dialog_input_result)) {
858 set_config_filename(dialog_input_result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100860 }
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700861 show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 break;
863 case 1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700864 show_helptext(_("Save Alternate Configuration"), save_config_help);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200866 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 return;
868 }
869 }
870}
871
Linus Torvalds1da177e2005-04-16 15:20:36 -0700872int main(int ac, char **av)
873{
Ladislav Michl09af0912007-12-17 19:07:41 +0100874 int saved_x, saved_y;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 char *mode;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200876 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700878 setlocale(LC_ALL, "");
879 bindtextdomain(PACKAGE, LOCALEDIR);
880 textdomain(PACKAGE);
881
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 conf_parse(av[1]);
883 conf_read(NULL);
884
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885 mode = getenv("MENUCONFIG_MODE");
886 if (mode) {
887 if (!strcasecmp(mode, "single_menu"))
888 single_menu_mode = 1;
889 }
890
Arnaud Lacombed0e1e092009-07-06 00:07:28 -0400891 initscr();
892
Ladislav Michl09af0912007-12-17 19:07:41 +0100893 getyx(stdscr, saved_y, saved_x);
894 if (init_dialog(NULL)) {
895 fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
896 fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
897 return 1;
898 }
899
Sam Ravnborgd802b502007-04-01 22:29:38 +0200900 set_config_filename(conf_get_configname());
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200901 do {
902 conf(&rootmenu);
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200903 dialog_clear();
Karsten Wieseb3214292006-12-13 00:34:06 -0800904 if (conf_get_changed())
905 res = dialog_yesno(NULL,
906 _("Do you wish to save your "
907 "new kernel configuration?\n"
908 "<ESC><ESC> to continue."),
909 6, 60);
910 else
911 res = -1;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200912 } while (res == KEY_ESC);
Ladislav Michl09af0912007-12-17 19:07:41 +0100913 end_dialog(saved_x, saved_y);
Karsten Wieseb3214292006-12-13 00:34:06 -0800914
915 switch (res) {
916 case 0:
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100917 if (conf_write(filename)) {
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700918 fprintf(stderr, _("\n\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 "Error during writing of the kernel configuration.\n"
920 "Your kernel configuration changes were NOT saved."
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700921 "\n\n"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922 return 1;
923 }
Karsten Wieseb3214292006-12-13 00:34:06 -0800924 case -1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700925 printf(_("\n\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926 "*** End of Linux kernel configuration.\n"
927 "*** Execute 'make' to build the kernel or try 'make help'."
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700928 "\n\n"));
Karsten Wieseb3214292006-12-13 00:34:06 -0800929 break;
930 default:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700931 fprintf(stderr, _("\n\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 "Your kernel configuration changes were NOT saved."
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700933 "\n\n"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934 }
935
936 return 0;
937}
Sam Ravnborgc4143a82008-05-04 21:03:20 +0200938