Annotation of qemu/roms/seabios/tools/kconfig/mconf.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (C) 2002 Roman Zippel <[email protected]>
                      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 <[email protected]>
                      7:  *
                      8:  * i18n, 2005, Arnaldo Carvalho de Melo <[email protected]>
                      9:  */
                     10: 
                     11: #include <ctype.h>
                     12: #include <errno.h>
                     13: #include <fcntl.h>
                     14: #include <limits.h>
                     15: #include <stdarg.h>
                     16: #include <stdlib.h>
                     17: #include <string.h>
                     18: #include <unistd.h>
                     19: #include <locale.h>
                     20: 
                     21: #define LKC_DIRECT_LINK
                     22: #include "lkc.h"
                     23: #include "lxdialog/dialog.h"
                     24: 
                     25: static const char mconf_readme[] = N_(
                     26: "Overview\n"
                     27: "--------\n"
                     28: "This interface let you select features and parameters for the build.\n"
                     29: "Features can either be built-in, modularized, or ignored. Parameters\n"
                     30: "must be entered in as decimal or hexadecimal numbers or text.\n"
                     31: "\n"
                     32: "Menu items beginning with following braces represent features that\n"
                     33: "  [ ] can be built in or removed\n"
                     34: "  < > can be built in, modularized or removed\n"
                     35: "  { } can be built in or modularized (selected by other feature)\n"
                     36: "  - - are selected by other feature,\n"
                     37: "while *, M or whitespace inside braces means to build in, build as\n"
                     38: "a module or to exclude the feature respectively.\n"
                     39: "\n"
                     40: "To change any of these features, highlight it with the cursor\n"
                     41: "keys and press <Y> to build it in, <M> to make it a module or\n"
                     42: "<N> to removed it.  You may also press the <Space Bar> to cycle\n"
                     43: "through the available options (ie. Y->N->M->Y).\n"
                     44: "\n"
                     45: "Some additional keyboard hints:\n"
                     46: "\n"
                     47: "Menus\n"
                     48: "----------\n"
                     49: "o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
                     50: "   you wish to change or submenu wish to select and press <Enter>.\n"
                     51: "   Submenus are designated by \"--->\".\n"
                     52: "\n"
                     53: "   Shortcut: Press the option's highlighted letter (hotkey).\n"
                     54: "             Pressing a hotkey more than once will sequence\n"
                     55: "             through all visible items which use that hotkey.\n"
                     56: "\n"
                     57: "   You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
                     58: "   unseen options into view.\n"
                     59: "\n"
                     60: "o  To exit a menu use the cursor keys to highlight the <Exit> button\n"
                     61: "   and press <ENTER>.\n"
                     62: "\n"
                     63: "   Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
                     64: "             using those letters.  You may press a single <ESC>, but\n"
                     65: "             there is a delayed response which you may find annoying.\n"
                     66: "\n"
                     67: "   Also, the <TAB> and cursor keys will cycle between <Select>,\n"
                     68: "   <Exit> and <Help>.\n"
                     69: "\n"
                     70: "o  To get help with an item, use the cursor keys to highlight <Help>\n"
                     71: "   and press <ENTER>.\n"
                     72: "\n"
                     73: "   Shortcut: Press <H> or <?>.\n"
                     74: "\n"
                     75: "o  To toggle the display of hidden options, press <Z>.\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 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 options listed in a single menu, rather\n"
                    152: "than the default multimenu hierarchy, run the menuconfig with\n"
                    153: "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"
                    162: "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"
                    174: " classic    => theme with blue background. The classic look\n"
                    175: " bluetitle  => a LCD friendly version of classic. (default)\n"
                    176: "\n"),
                    177: menu_instructions[] = N_(
                    178:        "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.  "
                    183:        "Legend: [*] built-in  [ ] excluded  <M> module  < > module capable"),
                    184: radiolist_instructions[] = N_(
                    185:        "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>. "
                    188:        "Press <?> for additional information about this option."),
                    189: inputbox_instructions_int[] = N_(
                    190:        "Please enter a decimal value. "
                    191:        "Fractions will not be accepted.  "
                    192:        "Use the <TAB> key to move from the input field to the buttons below it."),
                    193: inputbox_instructions_hex[] = N_(
                    194:        "Please enter a hexadecimal value. "
                    195:        "Use the <TAB> key to move from the input field to the buttons below it."),
                    196: inputbox_instructions_string[] = N_(
                    197:        "Please enter a string value. "
                    198:        "Use the <TAB> key to move from the input field to the buttons below it."),
                    199: setmod_text[] = N_(
                    200:        "This feature depends on another which has been configured as a module.\n"
                    201:        "As a result, this feature will be built as a module."),
                    202: load_config_text[] = N_(
                    203:        "Enter the name of the configuration file you wish to load.  "
                    204:        "Accept the name shown to restore the configuration you "
                    205:        "last retrieved.  Leave blank to abort."),
                    206: load_config_help[] = N_(
                    207:        "\n"
                    208:        "For various reasons, one may wish to keep several different\n"
                    209:        "configurations available on a single machine.\n"
                    210:        "\n"
                    211:        "If you have saved a previous configuration in a file other than the\n"
                    212:        "default one, entering its name here will allow you to modify that\n"
                    213:        "configuration.\n"
                    214:        "\n"
                    215:        "If you are uncertain, then you have probably never used alternate\n"
                    216:        "configuration files. You should therefore leave this blank to abort.\n"),
                    217: save_config_text[] = N_(
                    218:        "Enter a filename to which this configuration should be saved "
                    219:        "as an alternate.  Leave blank to abort."),
                    220: save_config_help[] = N_(
                    221:        "\n"
                    222:        "For various reasons, one may wish to keep different configurations\n"
                    223:        "available on a single machine.\n"
                    224:        "\n"
                    225:        "Entering a file name here will allow you to later retrieve, modify\n"
                    226:        "and use the current configuration as an alternate to whatever\n"
                    227:        "configuration options you have selected at that time.\n"
                    228:        "\n"
                    229:        "If you are uncertain what all this means then you should probably\n"
                    230:        "leave this blank.\n"),
                    231: search_help[] = N_(
                    232:        "\n"
                    233:        "Search for symbols and display their relations.\n"
                    234:        "Regular expressions are allowed.\n"
                    235:        "Example: search for \"^FOO\"\n"
                    236:        "Result:\n"
                    237:        "-----------------------------------------------------------------\n"
                    238:        "Symbol: FOO [=m]\n"
                    239:        "Prompt: Foo bus is used to drive the bar HW\n"
                    240:        "Defined at drivers/pci/Kconfig:47\n"
                    241:        "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
                    242:        "Location:\n"
                    243:        "  -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
                    244:        "    -> PCI support (PCI [=y])\n"
                    245:        "      -> PCI access mode (<choice> [=y])\n"
                    246:        "Selects: LIBCRC32\n"
                    247:        "Selected by: BAR\n"
                    248:        "-----------------------------------------------------------------\n"
                    249:        "o The line 'Prompt:' shows the text used in the menu structure for\n"
                    250:        "  this symbol\n"
                    251:        "o The 'Defined at' line tell at what file / line number the symbol\n"
                    252:        "  is defined\n"
                    253:        "o The 'Depends on:' line tell what symbols needs to be defined for\n"
                    254:        "  this symbol to be visible in the menu (selectable)\n"
                    255:        "o The 'Location:' lines tell where in the menu structure this symbol\n"
                    256:        "  is located\n"
                    257:        "    A location followed by a [=y] indicate that this is a selectable\n"
                    258:        "    menu item - and current value is displayed inside brackets.\n"
                    259:        "o The 'Selects:' line tell what symbol will be automatically\n"
                    260:        "  selected if this symbol is selected (y or m)\n"
                    261:        "o The 'Selected by' line tell what symbol has selected this symbol\n"
                    262:        "\n"
                    263:        "Only relevant lines are shown.\n"
                    264:        "\n\n"
                    265:        "Search examples:\n"
                    266:        "Examples: USB  => find all symbols containing USB\n"
                    267:        "          ^USB => find all symbols starting with USB\n"
                    268:        "          USB$ => find all symbols ending with USB\n"
                    269:        "\n");
                    270: 
                    271: static int indent;
                    272: static struct menu *current_menu;
                    273: static int child_count;
                    274: static int single_menu_mode;
                    275: static int show_all_options;
                    276: 
                    277: static void conf(struct menu *menu);
                    278: static void conf_choice(struct menu *menu);
                    279: static void conf_string(struct menu *menu);
                    280: static void conf_load(void);
                    281: static void conf_save(void);
                    282: static void show_textbox(const char *title, const char *text, int r, int c);
                    283: static void show_helptext(const char *title, const char *text);
                    284: static void show_help(struct menu *menu);
                    285: 
                    286: static char filename[PATH_MAX+1];
                    287: static void set_config_filename(const char *config_filename)
                    288: {
                    289:        static char menu_backtitle[PATH_MAX+128];
                    290:        int size;
                    291: 
                    292:        size = snprintf(menu_backtitle, sizeof(menu_backtitle),
                    293:                        "%s - %s", config_filename, rootmenu.prompt->text);
                    294:        if (size >= sizeof(menu_backtitle))
                    295:                menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
                    296:        set_dialog_backtitle(menu_backtitle);
                    297: 
                    298:        size = snprintf(filename, sizeof(filename), "%s", config_filename);
                    299:        if (size >= sizeof(filename))
                    300:                filename[sizeof(filename)-1] = '\0';
                    301: }
                    302: 
                    303: 
                    304: static void search_conf(void)
                    305: {
                    306:        struct symbol **sym_arr;
                    307:        struct gstr res;
                    308:        char *dialog_input;
                    309:        int dres;
                    310: again:
                    311:        dialog_clear();
                    312:        dres = dialog_inputbox(_("Search Configuration Parameter"),
                    313:                              _("Enter " CONFIG_ " (sub)string to search for "
                    314:                                "(with or without \"" CONFIG_ "\")"),
                    315:                              10, 75, "");
                    316:        switch (dres) {
                    317:        case 0:
                    318:                break;
                    319:        case 1:
                    320:                show_helptext(_("Search Configuration"), search_help);
                    321:                goto again;
                    322:        default:
                    323:                return;
                    324:        }
                    325: 
                    326:        /* strip the prefix if necessary */
                    327:        dialog_input = dialog_input_result;
                    328:        if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
                    329:                dialog_input += strlen(CONFIG_);
                    330: 
                    331:        sym_arr = sym_re_search(dialog_input);
                    332:        res = get_relations_str(sym_arr);
                    333:        free(sym_arr);
                    334:        show_textbox(_("Search Results"), str_get(&res), 0, 0);
                    335:        str_free(&res);
                    336: }
                    337: 
                    338: static void build_conf(struct menu *menu)
                    339: {
                    340:        struct symbol *sym;
                    341:        struct property *prop;
                    342:        struct menu *child;
                    343:        int type, tmp, doint = 2;
                    344:        tristate val;
                    345:        char ch;
                    346:        bool visible;
                    347: 
                    348:        /*
                    349:         * note: menu_is_visible() has side effect that it will
                    350:         * recalc the value of the symbol.
                    351:         */
                    352:        visible = menu_is_visible(menu);
                    353:        if (show_all_options && !menu_has_prompt(menu))
                    354:                return;
                    355:        else if (!show_all_options && !visible)
                    356:                return;
                    357: 
                    358:        sym = menu->sym;
                    359:        prop = menu->prompt;
                    360:        if (!sym) {
                    361:                if (prop && menu != current_menu) {
                    362:                        const char *prompt = menu_get_prompt(menu);
                    363:                        switch (prop->type) {
                    364:                        case P_MENU:
                    365:                                child_count++;
                    366:                                prompt = _(prompt);
                    367:                                if (single_menu_mode) {
                    368:                                        item_make("%s%*c%s",
                    369:                                                  menu->data ? "-->" : "++>",
                    370:                                                  indent + 1, ' ', prompt);
                    371:                                } else
                    372:                                        item_make("   %*c%s  --->", indent + 1, ' ', prompt);
                    373: 
                    374:                                item_set_tag('m');
                    375:                                item_set_data(menu);
                    376:                                if (single_menu_mode && menu->data)
                    377:                                        goto conf_childs;
                    378:                                return;
                    379:                        case P_COMMENT:
                    380:                                if (prompt) {
                    381:                                        child_count++;
                    382:                                        item_make("   %*c*** %s ***", indent + 1, ' ', _(prompt));
                    383:                                        item_set_tag(':');
                    384:                                        item_set_data(menu);
                    385:                                }
                    386:                                break;
                    387:                        default:
                    388:                                if (prompt) {
                    389:                                        child_count++;
                    390:                                        item_make("---%*c%s", indent + 1, ' ', _(prompt));
                    391:                                        item_set_tag(':');
                    392:                                        item_set_data(menu);
                    393:                                }
                    394:                        }
                    395:                } else
                    396:                        doint = 0;
                    397:                goto conf_childs;
                    398:        }
                    399: 
                    400:        type = sym_get_type(sym);
                    401:        if (sym_is_choice(sym)) {
                    402:                struct symbol *def_sym = sym_get_choice_value(sym);
                    403:                struct menu *def_menu = NULL;
                    404: 
                    405:                child_count++;
                    406:                for (child = menu->list; child; child = child->next) {
                    407:                        if (menu_is_visible(child) && child->sym == def_sym)
                    408:                                def_menu = child;
                    409:                }
                    410: 
                    411:                val = sym_get_tristate_value(sym);
                    412:                if (sym_is_changable(sym)) {
                    413:                        switch (type) {
                    414:                        case S_BOOLEAN:
                    415:                                item_make("[%c]", val == no ? ' ' : '*');
                    416:                                break;
                    417:                        case S_TRISTATE:
                    418:                                switch (val) {
                    419:                                case yes: ch = '*'; break;
                    420:                                case mod: ch = 'M'; break;
                    421:                                default:  ch = ' '; break;
                    422:                                }
                    423:                                item_make("<%c>", ch);
                    424:                                break;
                    425:                        }
                    426:                        item_set_tag('t');
                    427:                        item_set_data(menu);
                    428:                } else {
                    429:                        item_make("   ");
                    430:                        item_set_tag(def_menu ? 't' : ':');
                    431:                        item_set_data(menu);
                    432:                }
                    433: 
                    434:                item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
                    435:                if (val == yes) {
                    436:                        if (def_menu) {
                    437:                                item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
                    438:                                item_add_str("  --->");
                    439:                                if (def_menu->list) {
                    440:                                        indent += 2;
                    441:                                        build_conf(def_menu);
                    442:                                        indent -= 2;
                    443:                                }
                    444:                        }
                    445:                        return;
                    446:                }
                    447:        } else {
                    448:                if (menu == current_menu) {
                    449:                        item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
                    450:                        item_set_tag(':');
                    451:                        item_set_data(menu);
                    452:                        goto conf_childs;
                    453:                }
                    454:                child_count++;
                    455:                val = sym_get_tristate_value(sym);
                    456:                if (sym_is_choice_value(sym) && val == yes) {
                    457:                        item_make("   ");
                    458:                        item_set_tag(':');
                    459:                        item_set_data(menu);
                    460:                } else {
                    461:                        switch (type) {
                    462:                        case S_BOOLEAN:
                    463:                                if (sym_is_changable(sym))
                    464:                                        item_make("[%c]", val == no ? ' ' : '*');
                    465:                                else
                    466:                                        item_make("-%c-", val == no ? ' ' : '*');
                    467:                                item_set_tag('t');
                    468:                                item_set_data(menu);
                    469:                                break;
                    470:                        case S_TRISTATE:
                    471:                                switch (val) {
                    472:                                case yes: ch = '*'; break;
                    473:                                case mod: ch = 'M'; break;
                    474:                                default:  ch = ' '; break;
                    475:                                }
                    476:                                if (sym_is_changable(sym)) {
                    477:                                        if (sym->rev_dep.tri == mod)
                    478:                                                item_make("{%c}", ch);
                    479:                                        else
                    480:                                                item_make("<%c>", ch);
                    481:                                } else
                    482:                                        item_make("-%c-", ch);
                    483:                                item_set_tag('t');
                    484:                                item_set_data(menu);
                    485:                                break;
                    486:                        default:
                    487:                                tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
                    488:                                item_make("(%s)", sym_get_string_value(sym));
                    489:                                tmp = indent - tmp + 4;
                    490:                                if (tmp < 0)
                    491:                                        tmp = 0;
                    492:                                item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
                    493:                                             (sym_has_value(sym) || !sym_is_changable(sym)) ?
                    494:                                             "" : _(" (NEW)"));
                    495:                                item_set_tag('s');
                    496:                                item_set_data(menu);
                    497:                                goto conf_childs;
                    498:                        }
                    499:                }
                    500:                item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
                    501:                          (sym_has_value(sym) || !sym_is_changable(sym)) ?
                    502:                          "" : _(" (NEW)"));
                    503:                if (menu->prompt->type == P_MENU) {
                    504:                        item_add_str("  --->");
                    505:                        return;
                    506:                }
                    507:        }
                    508: 
                    509: conf_childs:
                    510:        indent += doint;
                    511:        for (child = menu->list; child; child = child->next)
                    512:                build_conf(child);
                    513:        indent -= doint;
                    514: }
                    515: 
                    516: static void conf(struct menu *menu)
                    517: {
                    518:        struct menu *submenu;
                    519:        const char *prompt = menu_get_prompt(menu);
                    520:        struct symbol *sym;
                    521:        struct menu *active_menu = NULL;
                    522:        int res;
                    523:        int s_scroll = 0;
                    524: 
                    525:        while (1) {
                    526:                item_reset();
                    527:                current_menu = menu;
                    528:                build_conf(menu);
                    529:                if (!child_count)
                    530:                        break;
                    531:                if (menu == &rootmenu) {
                    532:                        item_make("--- ");
                    533:                        item_set_tag(':');
                    534:                        item_make(_("    Load an Alternate Configuration File"));
                    535:                        item_set_tag('L');
                    536:                        item_make(_("    Save an Alternate Configuration File"));
                    537:                        item_set_tag('S');
                    538:                }
                    539:                dialog_clear();
                    540:                res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
                    541:                                  _(menu_instructions),
                    542:                                  active_menu, &s_scroll);
                    543:                if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
                    544:                        break;
                    545:                if (!item_activate_selected())
                    546:                        continue;
                    547:                if (!item_tag())
                    548:                        continue;
                    549: 
                    550:                submenu = item_data();
                    551:                active_menu = item_data();
                    552:                if (submenu)
                    553:                        sym = submenu->sym;
                    554:                else
                    555:                        sym = NULL;
                    556: 
                    557:                switch (res) {
                    558:                case 0:
                    559:                        switch (item_tag()) {
                    560:                        case 'm':
                    561:                                if (single_menu_mode)
                    562:                                        submenu->data = (void *) (long) !submenu->data;
                    563:                                else
                    564:                                        conf(submenu);
                    565:                                break;
                    566:                        case 't':
                    567:                                if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
                    568:                                        conf_choice(submenu);
                    569:                                else if (submenu->prompt->type == P_MENU)
                    570:                                        conf(submenu);
                    571:                                break;
                    572:                        case 's':
                    573:                                conf_string(submenu);
                    574:                                break;
                    575:                        case 'L':
                    576:                                conf_load();
                    577:                                break;
                    578:                        case 'S':
                    579:                                conf_save();
                    580:                                break;
                    581:                        }
                    582:                        break;
                    583:                case 2:
                    584:                        if (sym)
                    585:                                show_help(submenu);
                    586:                        else
                    587:                                show_helptext(_("README"), _(mconf_readme));
                    588:                        break;
                    589:                case 3:
                    590:                        if (item_is_tag('t')) {
                    591:                                if (sym_set_tristate_value(sym, yes))
                    592:                                        break;
                    593:                                if (sym_set_tristate_value(sym, mod))
                    594:                                        show_textbox(NULL, setmod_text, 6, 74);
                    595:                        }
                    596:                        break;
                    597:                case 4:
                    598:                        if (item_is_tag('t'))
                    599:                                sym_set_tristate_value(sym, no);
                    600:                        break;
                    601:                case 5:
                    602:                        if (item_is_tag('t'))
                    603:                                sym_set_tristate_value(sym, mod);
                    604:                        break;
                    605:                case 6:
                    606:                        if (item_is_tag('t'))
                    607:                                sym_toggle_tristate_value(sym);
                    608:                        else if (item_is_tag('m'))
                    609:                                conf(submenu);
                    610:                        break;
                    611:                case 7:
                    612:                        search_conf();
                    613:                        break;
                    614:                case 8:
                    615:                        show_all_options = !show_all_options;
                    616:                        break;
                    617:                }
                    618:        }
                    619: }
                    620: 
                    621: static void show_textbox(const char *title, const char *text, int r, int c)
                    622: {
                    623:        dialog_clear();
                    624:        dialog_textbox(title, text, r, c);
                    625: }
                    626: 
                    627: static void show_helptext(const char *title, const char *text)
                    628: {
                    629:        show_textbox(title, text, 0, 0);
                    630: }
                    631: 
                    632: static void show_help(struct menu *menu)
                    633: {
                    634:        struct gstr help = str_new();
                    635: 
                    636:        help.max_width = getmaxx(stdscr) - 10;
                    637:        menu_get_ext_help(menu, &help);
                    638: 
                    639:        show_helptext(_(menu_get_prompt(menu)), str_get(&help));
                    640:        str_free(&help);
                    641: }
                    642: 
                    643: static void conf_choice(struct menu *menu)
                    644: {
                    645:        const char *prompt = _(menu_get_prompt(menu));
                    646:        struct menu *child;
                    647:        struct symbol *active;
                    648: 
                    649:        active = sym_get_choice_value(menu->sym);
                    650:        while (1) {
                    651:                int res;
                    652:                int selected;
                    653:                item_reset();
                    654: 
                    655:                current_menu = menu;
                    656:                for (child = menu->list; child; child = child->next) {
                    657:                        if (!menu_is_visible(child))
                    658:                                continue;
                    659:                        if (child->sym)
                    660:                                item_make("%s", _(menu_get_prompt(child)));
                    661:                        else {
                    662:                                item_make("*** %s ***", _(menu_get_prompt(child)));
                    663:                                item_set_tag(':');
                    664:                        }
                    665:                        item_set_data(child);
                    666:                        if (child->sym == active)
                    667:                                item_set_selected(1);
                    668:                        if (child->sym == sym_get_choice_value(menu->sym))
                    669:                                item_set_tag('X');
                    670:                }
                    671:                dialog_clear();
                    672:                res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
                    673:                                        _(radiolist_instructions),
                    674:                                         15, 70, 6);
                    675:                selected = item_activate_selected();
                    676:                switch (res) {
                    677:                case 0:
                    678:                        if (selected) {
                    679:                                child = item_data();
                    680:                                if (!child->sym)
                    681:                                        break;
                    682: 
                    683:                                sym_set_tristate_value(child->sym, yes);
                    684:                        }
                    685:                        return;
                    686:                case 1:
                    687:                        if (selected) {
                    688:                                child = item_data();
                    689:                                show_help(child);
                    690:                                active = child->sym;
                    691:                        } else
                    692:                                show_help(menu);
                    693:                        break;
                    694:                case KEY_ESC:
                    695:                        return;
                    696:                case -ERRDISPLAYTOOSMALL:
                    697:                        return;
                    698:                }
                    699:        }
                    700: }
                    701: 
                    702: static void conf_string(struct menu *menu)
                    703: {
                    704:        const char *prompt = menu_get_prompt(menu);
                    705: 
                    706:        while (1) {
                    707:                int res;
                    708:                const char *heading;
                    709: 
                    710:                switch (sym_get_type(menu->sym)) {
                    711:                case S_INT:
                    712:                        heading = _(inputbox_instructions_int);
                    713:                        break;
                    714:                case S_HEX:
                    715:                        heading = _(inputbox_instructions_hex);
                    716:                        break;
                    717:                case S_STRING:
                    718:                        heading = _(inputbox_instructions_string);
                    719:                        break;
                    720:                default:
                    721:                        heading = _("Internal mconf error!");
                    722:                }
                    723:                dialog_clear();
                    724:                res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
                    725:                                      heading, 10, 75,
                    726:                                      sym_get_string_value(menu->sym));
                    727:                switch (res) {
                    728:                case 0:
                    729:                        if (sym_set_string_value(menu->sym, dialog_input_result))
                    730:                                return;
                    731:                        show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
                    732:                        break;
                    733:                case 1:
                    734:                        show_help(menu);
                    735:                        break;
                    736:                case KEY_ESC:
                    737:                        return;
                    738:                }
                    739:        }
                    740: }
                    741: 
                    742: static void conf_load(void)
                    743: {
                    744: 
                    745:        while (1) {
                    746:                int res;
                    747:                dialog_clear();
                    748:                res = dialog_inputbox(NULL, load_config_text,
                    749:                                      11, 55, filename);
                    750:                switch(res) {
                    751:                case 0:
                    752:                        if (!dialog_input_result[0])
                    753:                                return;
                    754:                        if (!conf_read(dialog_input_result)) {
                    755:                                set_config_filename(dialog_input_result);
                    756:                                sym_set_change_count(1);
                    757:                                return;
                    758:                        }
                    759:                        show_textbox(NULL, _("File does not exist!"), 5, 38);
                    760:                        break;
                    761:                case 1:
                    762:                        show_helptext(_("Load Alternate Configuration"), load_config_help);
                    763:                        break;
                    764:                case KEY_ESC:
                    765:                        return;
                    766:                }
                    767:        }
                    768: }
                    769: 
                    770: static void conf_save(void)
                    771: {
                    772:        while (1) {
                    773:                int res;
                    774:                dialog_clear();
                    775:                res = dialog_inputbox(NULL, save_config_text,
                    776:                                      11, 55, filename);
                    777:                switch(res) {
                    778:                case 0:
                    779:                        if (!dialog_input_result[0])
                    780:                                return;
                    781:                        if (!conf_write(dialog_input_result)) {
                    782:                                set_config_filename(dialog_input_result);
                    783:                                return;
                    784:                        }
                    785:                        show_textbox(NULL, _("Can't create file!  Probably a nonexistent directory."), 5, 60);
                    786:                        break;
                    787:                case 1:
                    788:                        show_helptext(_("Save Alternate Configuration"), save_config_help);
                    789:                        break;
                    790:                case KEY_ESC:
                    791:                        return;
                    792:                }
                    793:        }
                    794: }
                    795: 
                    796: int main(int ac, char **av)
                    797: {
                    798:        int saved_x, saved_y;
                    799:        char *mode;
                    800:        int res;
                    801: 
                    802:        setlocale(LC_ALL, "");
                    803:        bindtextdomain(PACKAGE, LOCALEDIR);
                    804:        textdomain(PACKAGE);
                    805: 
                    806:        conf_parse(av[1]);
                    807:        conf_read(NULL);
                    808: 
                    809:        mode = getenv("MENUCONFIG_MODE");
                    810:        if (mode) {
                    811:                if (!strcasecmp(mode, "single_menu"))
                    812:                        single_menu_mode = 1;
                    813:        }
                    814: 
                    815:        initscr();
                    816: 
                    817:        getyx(stdscr, saved_y, saved_x);
                    818:        if (init_dialog(NULL)) {
                    819:                fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
                    820:                fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
                    821:                return 1;
                    822:        }
                    823: 
                    824:        set_config_filename(conf_get_configname());
                    825:        do {
                    826:                conf(&rootmenu);
                    827:                dialog_clear();
                    828:                if (conf_get_changed())
                    829:                        res = dialog_yesno(NULL,
                    830:                                           _("Do you wish to save your "
                    831:                                             "new configuration?\n"
                    832:                                             "<ESC><ESC> to continue."),
                    833:                                           6, 60);
                    834:                else
                    835:                        res = -1;
                    836:        } while (res == KEY_ESC);
                    837:        end_dialog(saved_x, saved_y);
                    838: 
                    839:        switch (res) {
                    840:        case 0:
                    841:                if (conf_write(filename)) {
                    842:                        fprintf(stderr, _("\n\n"
                    843:                                "Error while writing of the configuration.\n"
                    844:                                "Your configuration changes were NOT saved."
                    845:                                "\n\n"));
                    846:                        return 1;
                    847:                }
                    848:        case -1:
                    849:                printf(_("\n\n"
                    850:                        "*** End of the configuration.\n"
                    851:                        "*** Execute 'make' to start the build or try 'make help'."
                    852:                        "\n\n"));
                    853:                break;
                    854:        default:
                    855:                fprintf(stderr, _("\n\n"
                    856:                        "Your configuration changes were NOT saved."
                    857:                        "\n\n"));
                    858:        }
                    859: 
                    860:        return 0;
                    861: }
                    862: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.