10a9064fbSMasahiro Yamada /* 20a9064fbSMasahiro Yamada * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 30a9064fbSMasahiro Yamada * Released under the terms of the GNU GPL v2.0. 40a9064fbSMasahiro Yamada * 50a9064fbSMasahiro Yamada * Introduced single menu mode (show all sub-menus in one large tree). 60a9064fbSMasahiro Yamada * 2002-11-06 Petr Baudis <pasky@ucw.cz> 70a9064fbSMasahiro Yamada * 80a9064fbSMasahiro Yamada * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br> 90a9064fbSMasahiro Yamada */ 100a9064fbSMasahiro Yamada 110a9064fbSMasahiro Yamada #include <ctype.h> 120a9064fbSMasahiro Yamada #include <errno.h> 130a9064fbSMasahiro Yamada #include <fcntl.h> 140a9064fbSMasahiro Yamada #include <limits.h> 150a9064fbSMasahiro Yamada #include <stdarg.h> 160a9064fbSMasahiro Yamada #include <stdlib.h> 170a9064fbSMasahiro Yamada #include <string.h> 180a9064fbSMasahiro Yamada #include <signal.h> 190a9064fbSMasahiro Yamada #include <unistd.h> 200a9064fbSMasahiro Yamada #include <locale.h> 210a9064fbSMasahiro Yamada 220a9064fbSMasahiro Yamada #include "lkc.h" 230a9064fbSMasahiro Yamada #include "lxdialog/dialog.h" 240a9064fbSMasahiro Yamada 250a9064fbSMasahiro Yamada static const char mconf_readme[] = N_( 260a9064fbSMasahiro Yamada "Overview\n" 270a9064fbSMasahiro Yamada "--------\n" 280a9064fbSMasahiro Yamada "This interface lets you select features and parameters for the build.\n" 290a9064fbSMasahiro Yamada "Features can either be built-in, modularized, or ignored. Parameters\n" 300a9064fbSMasahiro Yamada "must be entered in as decimal or hexadecimal numbers or text.\n" 310a9064fbSMasahiro Yamada "\n" 320a9064fbSMasahiro Yamada "Menu items beginning with following braces represent features that\n" 330a9064fbSMasahiro Yamada " [ ] can be built in or removed\n" 340a9064fbSMasahiro Yamada " < > can be built in, modularized or removed\n" 350a9064fbSMasahiro Yamada " { } can be built in or modularized (selected by other feature)\n" 360a9064fbSMasahiro Yamada " - - are selected by other feature,\n" 370a9064fbSMasahiro Yamada "while *, M or whitespace inside braces means to build in, build as\n" 380a9064fbSMasahiro Yamada "a module or to exclude the feature respectively.\n" 390a9064fbSMasahiro Yamada "\n" 400a9064fbSMasahiro Yamada "To change any of these features, highlight it with the cursor\n" 410a9064fbSMasahiro Yamada "keys and press <Y> to build it in, <M> to make it a module or\n" 420a9064fbSMasahiro Yamada "<N> to remove it. You may also press the <Space Bar> to cycle\n" 430a9064fbSMasahiro Yamada "through the available options (i.e. Y->N->M->Y).\n" 440a9064fbSMasahiro Yamada "\n" 450a9064fbSMasahiro Yamada "Some additional keyboard hints:\n" 460a9064fbSMasahiro Yamada "\n" 470a9064fbSMasahiro Yamada "Menus\n" 480a9064fbSMasahiro Yamada "----------\n" 490a9064fbSMasahiro Yamada "o Use the Up/Down arrow keys (cursor keys) to highlight the item you\n" 500a9064fbSMasahiro Yamada " wish to change or the submenu you wish to select and press <Enter>.\n" 510a9064fbSMasahiro Yamada " Submenus are designated by \"--->\", empty ones by \"----\".\n" 520a9064fbSMasahiro Yamada "\n" 530a9064fbSMasahiro Yamada " Shortcut: Press the option's highlighted letter (hotkey).\n" 540a9064fbSMasahiro Yamada " Pressing a hotkey more than once will sequence\n" 550a9064fbSMasahiro Yamada " through all visible items which use that hotkey.\n" 560a9064fbSMasahiro Yamada "\n" 570a9064fbSMasahiro Yamada " You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n" 580a9064fbSMasahiro Yamada " unseen options into view.\n" 590a9064fbSMasahiro Yamada "\n" 600a9064fbSMasahiro Yamada "o To exit a menu use the cursor keys to highlight the <Exit> button\n" 610a9064fbSMasahiro Yamada " and press <ENTER>.\n" 620a9064fbSMasahiro Yamada "\n" 630a9064fbSMasahiro Yamada " Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n" 640a9064fbSMasahiro Yamada " using those letters. You may press a single <ESC>, but\n" 650a9064fbSMasahiro Yamada " there is a delayed response which you may find annoying.\n" 660a9064fbSMasahiro Yamada "\n" 670a9064fbSMasahiro Yamada " Also, the <TAB> and cursor keys will cycle between <Select>,\n" 680a9064fbSMasahiro Yamada " <Exit>, <Help>, <Save>, and <Load>.\n" 690a9064fbSMasahiro Yamada "\n" 700a9064fbSMasahiro Yamada "o To get help with an item, use the cursor keys to highlight <Help>\n" 710a9064fbSMasahiro Yamada " and press <ENTER>.\n" 720a9064fbSMasahiro Yamada "\n" 730a9064fbSMasahiro Yamada " Shortcut: Press <H> or <?>.\n" 740a9064fbSMasahiro Yamada "\n" 750a9064fbSMasahiro Yamada "o To toggle the display of hidden options, press <Z>.\n" 760a9064fbSMasahiro Yamada "\n" 770a9064fbSMasahiro Yamada "\n" 780a9064fbSMasahiro Yamada "Radiolists (Choice lists)\n" 790a9064fbSMasahiro Yamada "-----------\n" 800a9064fbSMasahiro Yamada "o Use the cursor keys to select the option you wish to set and press\n" 810a9064fbSMasahiro Yamada " <S> or the <SPACE BAR>.\n" 820a9064fbSMasahiro Yamada "\n" 830a9064fbSMasahiro Yamada " Shortcut: Press the first letter of the option you wish to set then\n" 840a9064fbSMasahiro Yamada " press <S> or <SPACE BAR>.\n" 850a9064fbSMasahiro Yamada "\n" 860a9064fbSMasahiro Yamada "o To see available help for the item, use the cursor keys to highlight\n" 870a9064fbSMasahiro Yamada " <Help> and Press <ENTER>.\n" 880a9064fbSMasahiro Yamada "\n" 890a9064fbSMasahiro Yamada " Shortcut: Press <H> or <?>.\n" 900a9064fbSMasahiro Yamada "\n" 910a9064fbSMasahiro Yamada " Also, the <TAB> and cursor keys will cycle between <Select> and\n" 920a9064fbSMasahiro Yamada " <Help>\n" 930a9064fbSMasahiro Yamada "\n" 940a9064fbSMasahiro Yamada "\n" 950a9064fbSMasahiro Yamada "Data Entry\n" 960a9064fbSMasahiro Yamada "-----------\n" 970a9064fbSMasahiro Yamada "o Enter the requested information and press <ENTER>\n" 980a9064fbSMasahiro Yamada " If you are entering hexadecimal values, it is not necessary to\n" 990a9064fbSMasahiro Yamada " add the '0x' prefix to the entry.\n" 1000a9064fbSMasahiro Yamada "\n" 1010a9064fbSMasahiro Yamada "o For help, use the <TAB> or cursor keys to highlight the help option\n" 1020a9064fbSMasahiro Yamada " and press <ENTER>. You can try <TAB><H> as well.\n" 1030a9064fbSMasahiro Yamada "\n" 1040a9064fbSMasahiro Yamada "\n" 1050a9064fbSMasahiro Yamada "Text Box (Help Window)\n" 1060a9064fbSMasahiro Yamada "--------\n" 1070a9064fbSMasahiro Yamada "o Use the cursor keys to scroll up/down/left/right. The VI editor\n" 1080a9064fbSMasahiro Yamada " keys h,j,k,l function here as do <u>, <d>, <SPACE BAR> and <B> for\n" 1090a9064fbSMasahiro Yamada " those who are familiar with less and lynx.\n" 1100a9064fbSMasahiro Yamada "\n" 1110a9064fbSMasahiro Yamada "o Press <E>, <X>, <q>, <Enter> or <Esc><Esc> to exit.\n" 1120a9064fbSMasahiro Yamada "\n" 1130a9064fbSMasahiro Yamada "\n" 1140a9064fbSMasahiro Yamada "Alternate Configuration Files\n" 1150a9064fbSMasahiro Yamada "-----------------------------\n" 1160a9064fbSMasahiro Yamada "Menuconfig supports the use of alternate configuration files for\n" 1170a9064fbSMasahiro Yamada "those who, for various reasons, find it necessary to switch\n" 1180a9064fbSMasahiro Yamada "between different configurations.\n" 1190a9064fbSMasahiro Yamada "\n" 1200a9064fbSMasahiro Yamada "The <Save> button will let you save the current configuration to\n" 1210a9064fbSMasahiro Yamada "a file of your choosing. Use the <Load> button to load a previously\n" 1220a9064fbSMasahiro Yamada "saved alternate configuration.\n" 1230a9064fbSMasahiro Yamada "\n" 1240a9064fbSMasahiro Yamada "Even if you don't use alternate configuration files, but you find\n" 1250a9064fbSMasahiro Yamada "during a Menuconfig session that you have completely messed up your\n" 1260a9064fbSMasahiro Yamada "settings, you may use the <Load> button to restore your previously\n" 1270a9064fbSMasahiro Yamada "saved settings from \".config\" without restarting Menuconfig.\n" 1280a9064fbSMasahiro Yamada "\n" 1290a9064fbSMasahiro Yamada "Other information\n" 1300a9064fbSMasahiro Yamada "-----------------\n" 1310a9064fbSMasahiro Yamada "If you use Menuconfig in an XTERM window, make sure you have your\n" 1320a9064fbSMasahiro Yamada "$TERM variable set to point to an xterm definition which supports\n" 1330a9064fbSMasahiro Yamada "color. Otherwise, Menuconfig will look rather bad. Menuconfig will\n" 1340a9064fbSMasahiro Yamada "not display correctly in an RXVT window because rxvt displays only one\n" 1350a9064fbSMasahiro Yamada "intensity of color, bright.\n" 1360a9064fbSMasahiro Yamada "\n" 1370a9064fbSMasahiro Yamada "Menuconfig will display larger menus on screens or xterms which are\n" 1380a9064fbSMasahiro Yamada "set to display more than the standard 25 row by 80 column geometry.\n" 1390a9064fbSMasahiro Yamada "In order for this to work, the \"stty size\" command must be able to\n" 1400a9064fbSMasahiro Yamada "display the screen's current row and column geometry. I STRONGLY\n" 1410a9064fbSMasahiro Yamada "RECOMMEND that you make sure you do NOT have the shell variables\n" 1420a9064fbSMasahiro Yamada "LINES and COLUMNS exported into your environment. Some distributions\n" 1430a9064fbSMasahiro Yamada "export those variables via /etc/profile. Some ncurses programs can\n" 1440a9064fbSMasahiro Yamada "become confused when those variables (LINES & COLUMNS) don't reflect\n" 1450a9064fbSMasahiro Yamada "the true screen size.\n" 1460a9064fbSMasahiro Yamada "\n" 1470a9064fbSMasahiro Yamada "Optional personality available\n" 1480a9064fbSMasahiro Yamada "------------------------------\n" 1490a9064fbSMasahiro Yamada "If you prefer to have all of the options listed in a single menu,\n" 1500a9064fbSMasahiro Yamada "rather than the default multimenu hierarchy, run the menuconfig with\n" 1510a9064fbSMasahiro Yamada "MENUCONFIG_MODE environment variable set to single_menu. Example:\n" 1520a9064fbSMasahiro Yamada "\n" 1530a9064fbSMasahiro Yamada "make MENUCONFIG_MODE=single_menu menuconfig\n" 1540a9064fbSMasahiro Yamada "\n" 1550a9064fbSMasahiro Yamada "<Enter> will then unroll the appropriate category, or enfold it if it\n" 1560a9064fbSMasahiro Yamada "is already unrolled.\n" 1570a9064fbSMasahiro Yamada "\n" 1580a9064fbSMasahiro Yamada "Note that this mode can eventually be a little more CPU expensive\n" 1590a9064fbSMasahiro Yamada "(especially with a larger number of unrolled categories) than the\n" 1600a9064fbSMasahiro Yamada "default mode.\n" 1610a9064fbSMasahiro Yamada "\n" 1620a9064fbSMasahiro Yamada "Different color themes available\n" 1630a9064fbSMasahiro Yamada "--------------------------------\n" 1640a9064fbSMasahiro Yamada "It is possible to select different color themes using the variable\n" 1650a9064fbSMasahiro Yamada "MENUCONFIG_COLOR. To select a theme use:\n" 1660a9064fbSMasahiro Yamada "\n" 1670a9064fbSMasahiro Yamada "make MENUCONFIG_COLOR=<theme> menuconfig\n" 1680a9064fbSMasahiro Yamada "\n" 1690a9064fbSMasahiro Yamada "Available themes are\n" 1700a9064fbSMasahiro Yamada " mono => selects colors suitable for monochrome displays\n" 1710a9064fbSMasahiro Yamada " blackbg => selects a color scheme with black background\n" 1720a9064fbSMasahiro Yamada " classic => theme with blue background. The classic look\n" 1730a9064fbSMasahiro Yamada " bluetitle => an LCD friendly version of classic. (default)\n" 1740a9064fbSMasahiro Yamada "\n"), 1750a9064fbSMasahiro Yamada menu_instructions[] = N_( 1760a9064fbSMasahiro Yamada "Arrow keys navigate the menu. " 1770a9064fbSMasahiro Yamada "<Enter> selects submenus ---> (or empty submenus ----). " 1780a9064fbSMasahiro Yamada "Highlighted letters are hotkeys. " 1790a9064fbSMasahiro Yamada "Pressing <Y> includes, <N> excludes, <M> modularizes features. " 1800a9064fbSMasahiro Yamada "Press <Esc><Esc> to exit, <?> for Help, </> for Search. " 1810a9064fbSMasahiro Yamada "Legend: [*] built-in [ ] excluded <M> module < > module capable"), 1820a9064fbSMasahiro Yamada radiolist_instructions[] = N_( 1830a9064fbSMasahiro Yamada "Use the arrow keys to navigate this window or " 1840a9064fbSMasahiro Yamada "press the hotkey of the item you wish to select " 1850a9064fbSMasahiro Yamada "followed by the <SPACE BAR>. " 1860a9064fbSMasahiro Yamada "Press <?> for additional information about this option."), 1870a9064fbSMasahiro Yamada inputbox_instructions_int[] = N_( 1880a9064fbSMasahiro Yamada "Please enter a decimal value. " 1890a9064fbSMasahiro Yamada "Fractions will not be accepted. " 1900a9064fbSMasahiro Yamada "Use the <TAB> key to move from the input field to the buttons below it."), 1910a9064fbSMasahiro Yamada inputbox_instructions_hex[] = N_( 1920a9064fbSMasahiro Yamada "Please enter a hexadecimal value. " 1930a9064fbSMasahiro Yamada "Use the <TAB> key to move from the input field to the buttons below it."), 1940a9064fbSMasahiro Yamada inputbox_instructions_string[] = N_( 1950a9064fbSMasahiro Yamada "Please enter a string value. " 1960a9064fbSMasahiro Yamada "Use the <TAB> key to move from the input field to the buttons below it."), 1970a9064fbSMasahiro Yamada setmod_text[] = N_( 1980a9064fbSMasahiro Yamada "This feature depends on another which has been configured as a module.\n" 1990a9064fbSMasahiro Yamada "As a result, this feature will be built as a module."), 2000a9064fbSMasahiro Yamada load_config_text[] = N_( 2010a9064fbSMasahiro Yamada "Enter the name of the configuration file you wish to load. " 2020a9064fbSMasahiro Yamada "Accept the name shown to restore the configuration you " 2030a9064fbSMasahiro Yamada "last retrieved. Leave blank to abort."), 2040a9064fbSMasahiro Yamada load_config_help[] = N_( 2050a9064fbSMasahiro Yamada "\n" 2060a9064fbSMasahiro Yamada "For various reasons, one may wish to keep several different\n" 2070a9064fbSMasahiro Yamada "configurations available on a single machine.\n" 2080a9064fbSMasahiro Yamada "\n" 2090a9064fbSMasahiro Yamada "If you have saved a previous configuration in a file other than the\n" 2100a9064fbSMasahiro Yamada "default one, entering its name here will allow you to modify that\n" 2110a9064fbSMasahiro Yamada "configuration.\n" 2120a9064fbSMasahiro Yamada "\n" 2130a9064fbSMasahiro Yamada "If you are uncertain, then you have probably never used alternate\n" 2140a9064fbSMasahiro Yamada "configuration files. You should therefore leave this blank to abort.\n"), 2150a9064fbSMasahiro Yamada save_config_text[] = N_( 2160a9064fbSMasahiro Yamada "Enter a filename to which this configuration should be saved " 2170a9064fbSMasahiro Yamada "as an alternate. Leave blank to abort."), 2180a9064fbSMasahiro Yamada save_config_help[] = N_( 2190a9064fbSMasahiro Yamada "\n" 2200a9064fbSMasahiro Yamada "For various reasons, one may wish to keep different configurations\n" 2210a9064fbSMasahiro Yamada "available on a single machine.\n" 2220a9064fbSMasahiro Yamada "\n" 2230a9064fbSMasahiro Yamada "Entering a file name here will allow you to later retrieve, modify\n" 2240a9064fbSMasahiro Yamada "and use the current configuration as an alternate to whatever\n" 2250a9064fbSMasahiro Yamada "configuration options you have selected at that time.\n" 2260a9064fbSMasahiro Yamada "\n" 2270a9064fbSMasahiro Yamada "If you are uncertain what all this means then you should probably\n" 2280a9064fbSMasahiro Yamada "leave this blank.\n"), 2290a9064fbSMasahiro Yamada search_help[] = N_( 2300a9064fbSMasahiro Yamada "\n" 2310a9064fbSMasahiro Yamada "Search for symbols and display their relations.\n" 2320a9064fbSMasahiro Yamada "Regular expressions are allowed.\n" 2330a9064fbSMasahiro Yamada "Example: search for \"^FOO\"\n" 2340a9064fbSMasahiro Yamada "Result:\n" 2350a9064fbSMasahiro Yamada "-----------------------------------------------------------------\n" 2360a9064fbSMasahiro Yamada "Symbol: FOO [=m]\n" 2370a9064fbSMasahiro Yamada "Type : tristate\n" 2380a9064fbSMasahiro Yamada "Prompt: Foo bus is used to drive the bar HW\n" 2390a9064fbSMasahiro Yamada " Location:\n" 2400a9064fbSMasahiro Yamada " -> Bus options (PCI, PCMCIA, EISA, ISA)\n" 2410a9064fbSMasahiro Yamada " -> PCI support (PCI [=y])\n" 2420a9064fbSMasahiro Yamada "(1) -> PCI access mode (<choice> [=y])\n" 2430a9064fbSMasahiro Yamada " Defined at drivers/pci/Kconfig:47\n" 2440a9064fbSMasahiro Yamada " Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" 2450a9064fbSMasahiro Yamada " Selects: LIBCRC32\n" 2460a9064fbSMasahiro Yamada " Selected by: BAR [=n]\n" 2470a9064fbSMasahiro Yamada "-----------------------------------------------------------------\n" 2480a9064fbSMasahiro Yamada "o The line 'Type:' shows the type of the configuration option for\n" 2490a9064fbSMasahiro Yamada " this symbol (boolean, tristate, string, ...)\n" 2500a9064fbSMasahiro Yamada "o The line 'Prompt:' shows the text used in the menu structure for\n" 2510a9064fbSMasahiro Yamada " this symbol\n" 2520a9064fbSMasahiro Yamada "o The 'Defined at' line tells at what file / line number the symbol\n" 2530a9064fbSMasahiro Yamada " is defined\n" 2540a9064fbSMasahiro Yamada "o The 'Depends on:' line tells what symbols need to be defined for\n" 2550a9064fbSMasahiro Yamada " this symbol to be visible in the menu (selectable)\n" 2560a9064fbSMasahiro Yamada "o The 'Location:' lines tells where in the menu structure this symbol\n" 2570a9064fbSMasahiro Yamada " is located\n" 2580a9064fbSMasahiro Yamada " A location followed by a [=y] indicates that this is a\n" 2590a9064fbSMasahiro Yamada " selectable menu item - and the current value is displayed inside\n" 2600a9064fbSMasahiro Yamada " brackets.\n" 2610a9064fbSMasahiro Yamada " Press the key in the (#) prefix to jump directly to that\n" 2620a9064fbSMasahiro Yamada " location. You will be returned to the current search results\n" 2630a9064fbSMasahiro Yamada " after exiting this new menu.\n" 2640a9064fbSMasahiro Yamada "o The 'Selects:' line tells what symbols will be automatically\n" 2650a9064fbSMasahiro Yamada " selected if this symbol is selected (y or m)\n" 2660a9064fbSMasahiro Yamada "o The 'Selected by' line tells what symbol has selected this symbol\n" 2670a9064fbSMasahiro Yamada "\n" 2680a9064fbSMasahiro Yamada "Only relevant lines are shown.\n" 2690a9064fbSMasahiro Yamada "\n\n" 2700a9064fbSMasahiro Yamada "Search examples:\n" 2710a9064fbSMasahiro Yamada "Examples: USB => find all symbols containing USB\n" 2720a9064fbSMasahiro Yamada " ^USB => find all symbols starting with USB\n" 2730a9064fbSMasahiro Yamada " USB$ => find all symbols ending with USB\n" 2740a9064fbSMasahiro Yamada "\n"); 2750a9064fbSMasahiro Yamada 2760a9064fbSMasahiro Yamada static int indent; 2770a9064fbSMasahiro Yamada static struct menu *current_menu; 2780a9064fbSMasahiro Yamada static int child_count; 2790a9064fbSMasahiro Yamada static int single_menu_mode; 2800a9064fbSMasahiro Yamada static int show_all_options; 2810a9064fbSMasahiro Yamada static int save_and_exit; 282*9b5f0b1dSMasahiro Yamada static int silent; 2830a9064fbSMasahiro Yamada 2840a9064fbSMasahiro Yamada static void conf(struct menu *menu, struct menu *active_menu); 2850a9064fbSMasahiro Yamada static void conf_choice(struct menu *menu); 2860a9064fbSMasahiro Yamada static void conf_string(struct menu *menu); 2870a9064fbSMasahiro Yamada static void conf_load(void); 2880a9064fbSMasahiro Yamada static void conf_save(void); 2890a9064fbSMasahiro Yamada static int show_textbox_ext(const char *title, char *text, int r, int c, 2900a9064fbSMasahiro Yamada int *keys, int *vscroll, int *hscroll, 2910a9064fbSMasahiro Yamada update_text_fn update_text, void *data); 2920a9064fbSMasahiro Yamada static void show_textbox(const char *title, const char *text, int r, int c); 2930a9064fbSMasahiro Yamada static void show_helptext(const char *title, const char *text); 2940a9064fbSMasahiro Yamada static void show_help(struct menu *menu); 2950a9064fbSMasahiro Yamada 2960a9064fbSMasahiro Yamada static char filename[PATH_MAX+1]; 2970a9064fbSMasahiro Yamada static void set_config_filename(const char *config_filename) 2980a9064fbSMasahiro Yamada { 2990a9064fbSMasahiro Yamada static char menu_backtitle[PATH_MAX+128]; 3000a9064fbSMasahiro Yamada int size; 3010a9064fbSMasahiro Yamada 3020a9064fbSMasahiro Yamada size = snprintf(menu_backtitle, sizeof(menu_backtitle), 3030a9064fbSMasahiro Yamada "%s - %s", config_filename, rootmenu.prompt->text); 3040a9064fbSMasahiro Yamada if (size >= sizeof(menu_backtitle)) 3050a9064fbSMasahiro Yamada menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; 3060a9064fbSMasahiro Yamada set_dialog_backtitle(menu_backtitle); 3070a9064fbSMasahiro Yamada 3080a9064fbSMasahiro Yamada size = snprintf(filename, sizeof(filename), "%s", config_filename); 3090a9064fbSMasahiro Yamada if (size >= sizeof(filename)) 3100a9064fbSMasahiro Yamada filename[sizeof(filename)-1] = '\0'; 3110a9064fbSMasahiro Yamada } 3120a9064fbSMasahiro Yamada 3130a9064fbSMasahiro Yamada struct subtitle_part { 3140a9064fbSMasahiro Yamada struct list_head entries; 3150a9064fbSMasahiro Yamada const char *text; 3160a9064fbSMasahiro Yamada }; 3170a9064fbSMasahiro Yamada static LIST_HEAD(trail); 3180a9064fbSMasahiro Yamada 3190a9064fbSMasahiro Yamada static struct subtitle_list *subtitles; 3200a9064fbSMasahiro Yamada static void set_subtitle(void) 3210a9064fbSMasahiro Yamada { 3220a9064fbSMasahiro Yamada struct subtitle_part *sp; 3230a9064fbSMasahiro Yamada struct subtitle_list *pos, *tmp; 3240a9064fbSMasahiro Yamada 3250a9064fbSMasahiro Yamada for (pos = subtitles; pos != NULL; pos = tmp) { 3260a9064fbSMasahiro Yamada tmp = pos->next; 3270a9064fbSMasahiro Yamada free(pos); 3280a9064fbSMasahiro Yamada } 3290a9064fbSMasahiro Yamada 3300a9064fbSMasahiro Yamada subtitles = NULL; 3310a9064fbSMasahiro Yamada list_for_each_entry(sp, &trail, entries) { 3320a9064fbSMasahiro Yamada if (sp->text) { 3330a9064fbSMasahiro Yamada if (pos) { 334*9b5f0b1dSMasahiro Yamada pos->next = xcalloc(1, sizeof(*pos)); 3350a9064fbSMasahiro Yamada pos = pos->next; 3360a9064fbSMasahiro Yamada } else { 337*9b5f0b1dSMasahiro Yamada subtitles = pos = xcalloc(1, sizeof(*pos)); 3380a9064fbSMasahiro Yamada } 3390a9064fbSMasahiro Yamada pos->text = sp->text; 3400a9064fbSMasahiro Yamada } 3410a9064fbSMasahiro Yamada } 3420a9064fbSMasahiro Yamada 3430a9064fbSMasahiro Yamada set_dialog_subtitles(subtitles); 3440a9064fbSMasahiro Yamada } 3450a9064fbSMasahiro Yamada 3460a9064fbSMasahiro Yamada static void reset_subtitle(void) 3470a9064fbSMasahiro Yamada { 3480a9064fbSMasahiro Yamada struct subtitle_list *pos, *tmp; 3490a9064fbSMasahiro Yamada 3500a9064fbSMasahiro Yamada for (pos = subtitles; pos != NULL; pos = tmp) { 3510a9064fbSMasahiro Yamada tmp = pos->next; 3520a9064fbSMasahiro Yamada free(pos); 3530a9064fbSMasahiro Yamada } 3540a9064fbSMasahiro Yamada subtitles = NULL; 3550a9064fbSMasahiro Yamada set_dialog_subtitles(subtitles); 3560a9064fbSMasahiro Yamada } 3570a9064fbSMasahiro Yamada 3580a9064fbSMasahiro Yamada struct search_data { 3590a9064fbSMasahiro Yamada struct list_head *head; 3600a9064fbSMasahiro Yamada struct menu **targets; 3610a9064fbSMasahiro Yamada int *keys; 3620a9064fbSMasahiro Yamada }; 3630a9064fbSMasahiro Yamada 3640a9064fbSMasahiro Yamada static void update_text(char *buf, size_t start, size_t end, void *_data) 3650a9064fbSMasahiro Yamada { 3660a9064fbSMasahiro Yamada struct search_data *data = _data; 3670a9064fbSMasahiro Yamada struct jump_key *pos; 3680a9064fbSMasahiro Yamada int k = 0; 3690a9064fbSMasahiro Yamada 3700a9064fbSMasahiro Yamada list_for_each_entry(pos, data->head, entries) { 3710a9064fbSMasahiro Yamada if (pos->offset >= start && pos->offset < end) { 3720a9064fbSMasahiro Yamada char header[4]; 3730a9064fbSMasahiro Yamada 3740a9064fbSMasahiro Yamada if (k < JUMP_NB) { 3750a9064fbSMasahiro Yamada int key = '0' + (pos->index % JUMP_NB) + 1; 3760a9064fbSMasahiro Yamada 3770a9064fbSMasahiro Yamada sprintf(header, "(%c)", key); 3780a9064fbSMasahiro Yamada data->keys[k] = key; 3790a9064fbSMasahiro Yamada data->targets[k] = pos->target; 3800a9064fbSMasahiro Yamada k++; 3810a9064fbSMasahiro Yamada } else { 3820a9064fbSMasahiro Yamada sprintf(header, " "); 3830a9064fbSMasahiro Yamada } 3840a9064fbSMasahiro Yamada 3850a9064fbSMasahiro Yamada memcpy(buf + pos->offset, header, sizeof(header) - 1); 3860a9064fbSMasahiro Yamada } 3870a9064fbSMasahiro Yamada } 3880a9064fbSMasahiro Yamada data->keys[k] = 0; 3890a9064fbSMasahiro Yamada } 3900a9064fbSMasahiro Yamada 3910a9064fbSMasahiro Yamada static void search_conf(void) 3920a9064fbSMasahiro Yamada { 3930a9064fbSMasahiro Yamada struct symbol **sym_arr; 3940a9064fbSMasahiro Yamada struct gstr res; 3950a9064fbSMasahiro Yamada struct gstr title; 3960a9064fbSMasahiro Yamada char *dialog_input; 3970a9064fbSMasahiro Yamada int dres, vscroll = 0, hscroll = 0; 3980a9064fbSMasahiro Yamada bool again; 3990a9064fbSMasahiro Yamada struct gstr sttext; 4000a9064fbSMasahiro Yamada struct subtitle_part stpart; 4010a9064fbSMasahiro Yamada 4020a9064fbSMasahiro Yamada title = str_new(); 4030a9064fbSMasahiro Yamada str_printf( &title, _("Enter (sub)string or regexp to search for " 4040a9064fbSMasahiro Yamada "(with or without \"%s\")"), CONFIG_); 4050a9064fbSMasahiro Yamada 4060a9064fbSMasahiro Yamada again: 4070a9064fbSMasahiro Yamada dialog_clear(); 4080a9064fbSMasahiro Yamada dres = dialog_inputbox(_("Search Configuration Parameter"), 4090a9064fbSMasahiro Yamada str_get(&title), 4100a9064fbSMasahiro Yamada 10, 75, ""); 4110a9064fbSMasahiro Yamada switch (dres) { 4120a9064fbSMasahiro Yamada case 0: 4130a9064fbSMasahiro Yamada break; 4140a9064fbSMasahiro Yamada case 1: 4150a9064fbSMasahiro Yamada show_helptext(_("Search Configuration"), search_help); 4160a9064fbSMasahiro Yamada goto again; 4170a9064fbSMasahiro Yamada default: 4180a9064fbSMasahiro Yamada str_free(&title); 4190a9064fbSMasahiro Yamada return; 4200a9064fbSMasahiro Yamada } 4210a9064fbSMasahiro Yamada 4220a9064fbSMasahiro Yamada /* strip the prefix if necessary */ 4230a9064fbSMasahiro Yamada dialog_input = dialog_input_result; 4240a9064fbSMasahiro Yamada if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0) 4250a9064fbSMasahiro Yamada dialog_input += strlen(CONFIG_); 4260a9064fbSMasahiro Yamada 4270a9064fbSMasahiro Yamada sttext = str_new(); 4280a9064fbSMasahiro Yamada str_printf(&sttext, "Search (%s)", dialog_input_result); 4290a9064fbSMasahiro Yamada stpart.text = str_get(&sttext); 4300a9064fbSMasahiro Yamada list_add_tail(&stpart.entries, &trail); 4310a9064fbSMasahiro Yamada 4320a9064fbSMasahiro Yamada sym_arr = sym_re_search(dialog_input); 4330a9064fbSMasahiro Yamada do { 4340a9064fbSMasahiro Yamada LIST_HEAD(head); 4350a9064fbSMasahiro Yamada struct menu *targets[JUMP_NB]; 4360a9064fbSMasahiro Yamada int keys[JUMP_NB + 1], i; 4370a9064fbSMasahiro Yamada struct search_data data = { 4380a9064fbSMasahiro Yamada .head = &head, 4390a9064fbSMasahiro Yamada .targets = targets, 4400a9064fbSMasahiro Yamada .keys = keys, 4410a9064fbSMasahiro Yamada }; 4420a9064fbSMasahiro Yamada struct jump_key *pos, *tmp; 4430a9064fbSMasahiro Yamada 4440a9064fbSMasahiro Yamada res = get_relations_str(sym_arr, &head); 4450a9064fbSMasahiro Yamada set_subtitle(); 4460a9064fbSMasahiro Yamada dres = show_textbox_ext(_("Search Results"), (char *) 4470a9064fbSMasahiro Yamada str_get(&res), 0, 0, keys, &vscroll, 4480a9064fbSMasahiro Yamada &hscroll, &update_text, (void *) 4490a9064fbSMasahiro Yamada &data); 4500a9064fbSMasahiro Yamada again = false; 4510a9064fbSMasahiro Yamada for (i = 0; i < JUMP_NB && keys[i]; i++) 4520a9064fbSMasahiro Yamada if (dres == keys[i]) { 4530a9064fbSMasahiro Yamada conf(targets[i]->parent, targets[i]); 4540a9064fbSMasahiro Yamada again = true; 4550a9064fbSMasahiro Yamada } 4560a9064fbSMasahiro Yamada str_free(&res); 4570a9064fbSMasahiro Yamada list_for_each_entry_safe(pos, tmp, &head, entries) 4580a9064fbSMasahiro Yamada free(pos); 4590a9064fbSMasahiro Yamada } while (again); 4600a9064fbSMasahiro Yamada free(sym_arr); 4610a9064fbSMasahiro Yamada str_free(&title); 4620a9064fbSMasahiro Yamada list_del(trail.prev); 4630a9064fbSMasahiro Yamada str_free(&sttext); 4640a9064fbSMasahiro Yamada } 4650a9064fbSMasahiro Yamada 4660a9064fbSMasahiro Yamada static void build_conf(struct menu *menu) 4670a9064fbSMasahiro Yamada { 4680a9064fbSMasahiro Yamada struct symbol *sym; 4690a9064fbSMasahiro Yamada struct property *prop; 4700a9064fbSMasahiro Yamada struct menu *child; 4710a9064fbSMasahiro Yamada int type, tmp, doint = 2; 4720a9064fbSMasahiro Yamada tristate val; 4730a9064fbSMasahiro Yamada char ch; 4740a9064fbSMasahiro Yamada bool visible; 4750a9064fbSMasahiro Yamada 4760a9064fbSMasahiro Yamada /* 4770a9064fbSMasahiro Yamada * note: menu_is_visible() has side effect that it will 4780a9064fbSMasahiro Yamada * recalc the value of the symbol. 4790a9064fbSMasahiro Yamada */ 4800a9064fbSMasahiro Yamada visible = menu_is_visible(menu); 4810a9064fbSMasahiro Yamada if (show_all_options && !menu_has_prompt(menu)) 4820a9064fbSMasahiro Yamada return; 4830a9064fbSMasahiro Yamada else if (!show_all_options && !visible) 4840a9064fbSMasahiro Yamada return; 4850a9064fbSMasahiro Yamada 4860a9064fbSMasahiro Yamada sym = menu->sym; 4870a9064fbSMasahiro Yamada prop = menu->prompt; 4880a9064fbSMasahiro Yamada if (!sym) { 4890a9064fbSMasahiro Yamada if (prop && menu != current_menu) { 4900a9064fbSMasahiro Yamada const char *prompt = menu_get_prompt(menu); 4910a9064fbSMasahiro Yamada switch (prop->type) { 4920a9064fbSMasahiro Yamada case P_MENU: 4930a9064fbSMasahiro Yamada child_count++; 4940a9064fbSMasahiro Yamada prompt = _(prompt); 4950a9064fbSMasahiro Yamada if (single_menu_mode) { 4960a9064fbSMasahiro Yamada item_make("%s%*c%s", 4970a9064fbSMasahiro Yamada menu->data ? "-->" : "++>", 4980a9064fbSMasahiro Yamada indent + 1, ' ', prompt); 4990a9064fbSMasahiro Yamada } else 5000a9064fbSMasahiro Yamada item_make(" %*c%s %s", 5010a9064fbSMasahiro Yamada indent + 1, ' ', prompt, 5020a9064fbSMasahiro Yamada menu_is_empty(menu) ? "----" : "--->"); 5030a9064fbSMasahiro Yamada item_set_tag('m'); 5040a9064fbSMasahiro Yamada item_set_data(menu); 5050a9064fbSMasahiro Yamada if (single_menu_mode && menu->data) 5060a9064fbSMasahiro Yamada goto conf_childs; 5070a9064fbSMasahiro Yamada return; 5080a9064fbSMasahiro Yamada case P_COMMENT: 5090a9064fbSMasahiro Yamada if (prompt) { 5100a9064fbSMasahiro Yamada child_count++; 5110a9064fbSMasahiro Yamada item_make(" %*c*** %s ***", indent + 1, ' ', _(prompt)); 5120a9064fbSMasahiro Yamada item_set_tag(':'); 5130a9064fbSMasahiro Yamada item_set_data(menu); 5140a9064fbSMasahiro Yamada } 5150a9064fbSMasahiro Yamada break; 5160a9064fbSMasahiro Yamada default: 5170a9064fbSMasahiro Yamada if (prompt) { 5180a9064fbSMasahiro Yamada child_count++; 5190a9064fbSMasahiro Yamada item_make("---%*c%s", indent + 1, ' ', _(prompt)); 5200a9064fbSMasahiro Yamada item_set_tag(':'); 5210a9064fbSMasahiro Yamada item_set_data(menu); 5220a9064fbSMasahiro Yamada } 5230a9064fbSMasahiro Yamada } 5240a9064fbSMasahiro Yamada } else 5250a9064fbSMasahiro Yamada doint = 0; 5260a9064fbSMasahiro Yamada goto conf_childs; 5270a9064fbSMasahiro Yamada } 5280a9064fbSMasahiro Yamada 5290a9064fbSMasahiro Yamada type = sym_get_type(sym); 5300a9064fbSMasahiro Yamada if (sym_is_choice(sym)) { 5310a9064fbSMasahiro Yamada struct symbol *def_sym = sym_get_choice_value(sym); 5320a9064fbSMasahiro Yamada struct menu *def_menu = NULL; 5330a9064fbSMasahiro Yamada 5340a9064fbSMasahiro Yamada child_count++; 5350a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next) { 5360a9064fbSMasahiro Yamada if (menu_is_visible(child) && child->sym == def_sym) 5370a9064fbSMasahiro Yamada def_menu = child; 5380a9064fbSMasahiro Yamada } 5390a9064fbSMasahiro Yamada 5400a9064fbSMasahiro Yamada val = sym_get_tristate_value(sym); 5410a9064fbSMasahiro Yamada if (sym_is_changable(sym)) { 5420a9064fbSMasahiro Yamada switch (type) { 5430a9064fbSMasahiro Yamada case S_BOOLEAN: 5440a9064fbSMasahiro Yamada item_make("[%c]", val == no ? ' ' : '*'); 5450a9064fbSMasahiro Yamada break; 5460a9064fbSMasahiro Yamada case S_TRISTATE: 5470a9064fbSMasahiro Yamada switch (val) { 5480a9064fbSMasahiro Yamada case yes: ch = '*'; break; 5490a9064fbSMasahiro Yamada case mod: ch = 'M'; break; 5500a9064fbSMasahiro Yamada default: ch = ' '; break; 5510a9064fbSMasahiro Yamada } 5520a9064fbSMasahiro Yamada item_make("<%c>", ch); 5530a9064fbSMasahiro Yamada break; 5540a9064fbSMasahiro Yamada } 5550a9064fbSMasahiro Yamada item_set_tag('t'); 5560a9064fbSMasahiro Yamada item_set_data(menu); 5570a9064fbSMasahiro Yamada } else { 5580a9064fbSMasahiro Yamada item_make(" "); 5590a9064fbSMasahiro Yamada item_set_tag(def_menu ? 't' : ':'); 5600a9064fbSMasahiro Yamada item_set_data(menu); 5610a9064fbSMasahiro Yamada } 5620a9064fbSMasahiro Yamada 5630a9064fbSMasahiro Yamada item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu))); 5640a9064fbSMasahiro Yamada if (val == yes) { 5650a9064fbSMasahiro Yamada if (def_menu) { 5660a9064fbSMasahiro Yamada item_add_str(" (%s)", _(menu_get_prompt(def_menu))); 5670a9064fbSMasahiro Yamada item_add_str(" --->"); 5680a9064fbSMasahiro Yamada if (def_menu->list) { 5690a9064fbSMasahiro Yamada indent += 2; 5700a9064fbSMasahiro Yamada build_conf(def_menu); 5710a9064fbSMasahiro Yamada indent -= 2; 5720a9064fbSMasahiro Yamada } 5730a9064fbSMasahiro Yamada } 5740a9064fbSMasahiro Yamada return; 5750a9064fbSMasahiro Yamada } 5760a9064fbSMasahiro Yamada } else { 5770a9064fbSMasahiro Yamada if (menu == current_menu) { 5780a9064fbSMasahiro Yamada item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu))); 5790a9064fbSMasahiro Yamada item_set_tag(':'); 5800a9064fbSMasahiro Yamada item_set_data(menu); 5810a9064fbSMasahiro Yamada goto conf_childs; 5820a9064fbSMasahiro Yamada } 5830a9064fbSMasahiro Yamada child_count++; 5840a9064fbSMasahiro Yamada val = sym_get_tristate_value(sym); 5850a9064fbSMasahiro Yamada if (sym_is_choice_value(sym) && val == yes) { 5860a9064fbSMasahiro Yamada item_make(" "); 5870a9064fbSMasahiro Yamada item_set_tag(':'); 5880a9064fbSMasahiro Yamada item_set_data(menu); 5890a9064fbSMasahiro Yamada } else { 5900a9064fbSMasahiro Yamada switch (type) { 5910a9064fbSMasahiro Yamada case S_BOOLEAN: 5920a9064fbSMasahiro Yamada if (sym_is_changable(sym)) 5930a9064fbSMasahiro Yamada item_make("[%c]", val == no ? ' ' : '*'); 5940a9064fbSMasahiro Yamada else 5950a9064fbSMasahiro Yamada item_make("-%c-", val == no ? ' ' : '*'); 5960a9064fbSMasahiro Yamada item_set_tag('t'); 5970a9064fbSMasahiro Yamada item_set_data(menu); 5980a9064fbSMasahiro Yamada break; 5990a9064fbSMasahiro Yamada case S_TRISTATE: 6000a9064fbSMasahiro Yamada switch (val) { 6010a9064fbSMasahiro Yamada case yes: ch = '*'; break; 6020a9064fbSMasahiro Yamada case mod: ch = 'M'; break; 6030a9064fbSMasahiro Yamada default: ch = ' '; break; 6040a9064fbSMasahiro Yamada } 6050a9064fbSMasahiro Yamada if (sym_is_changable(sym)) { 6060a9064fbSMasahiro Yamada if (sym->rev_dep.tri == mod) 6070a9064fbSMasahiro Yamada item_make("{%c}", ch); 6080a9064fbSMasahiro Yamada else 6090a9064fbSMasahiro Yamada item_make("<%c>", ch); 6100a9064fbSMasahiro Yamada } else 6110a9064fbSMasahiro Yamada item_make("-%c-", ch); 6120a9064fbSMasahiro Yamada item_set_tag('t'); 6130a9064fbSMasahiro Yamada item_set_data(menu); 6140a9064fbSMasahiro Yamada break; 6150a9064fbSMasahiro Yamada default: 6160a9064fbSMasahiro Yamada tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */ 6170a9064fbSMasahiro Yamada item_make("(%s)", sym_get_string_value(sym)); 6180a9064fbSMasahiro Yamada tmp = indent - tmp + 4; 6190a9064fbSMasahiro Yamada if (tmp < 0) 6200a9064fbSMasahiro Yamada tmp = 0; 6210a9064fbSMasahiro Yamada item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)), 6220a9064fbSMasahiro Yamada (sym_has_value(sym) || !sym_is_changable(sym)) ? 6230a9064fbSMasahiro Yamada "" : _(" (NEW)")); 6240a9064fbSMasahiro Yamada item_set_tag('s'); 6250a9064fbSMasahiro Yamada item_set_data(menu); 6260a9064fbSMasahiro Yamada goto conf_childs; 6270a9064fbSMasahiro Yamada } 6280a9064fbSMasahiro Yamada } 6290a9064fbSMasahiro Yamada item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)), 6300a9064fbSMasahiro Yamada (sym_has_value(sym) || !sym_is_changable(sym)) ? 6310a9064fbSMasahiro Yamada "" : _(" (NEW)")); 6320a9064fbSMasahiro Yamada if (menu->prompt->type == P_MENU) { 6330a9064fbSMasahiro Yamada item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->"); 6340a9064fbSMasahiro Yamada return; 6350a9064fbSMasahiro Yamada } 6360a9064fbSMasahiro Yamada } 6370a9064fbSMasahiro Yamada 6380a9064fbSMasahiro Yamada conf_childs: 6390a9064fbSMasahiro Yamada indent += doint; 6400a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next) 6410a9064fbSMasahiro Yamada build_conf(child); 6420a9064fbSMasahiro Yamada indent -= doint; 6430a9064fbSMasahiro Yamada } 6440a9064fbSMasahiro Yamada 6450a9064fbSMasahiro Yamada static void conf(struct menu *menu, struct menu *active_menu) 6460a9064fbSMasahiro Yamada { 6470a9064fbSMasahiro Yamada struct menu *submenu; 6480a9064fbSMasahiro Yamada const char *prompt = menu_get_prompt(menu); 6490a9064fbSMasahiro Yamada struct subtitle_part stpart; 6500a9064fbSMasahiro Yamada struct symbol *sym; 6510a9064fbSMasahiro Yamada int res; 6520a9064fbSMasahiro Yamada int s_scroll = 0; 6530a9064fbSMasahiro Yamada 6540a9064fbSMasahiro Yamada if (menu != &rootmenu) 6550a9064fbSMasahiro Yamada stpart.text = menu_get_prompt(menu); 6560a9064fbSMasahiro Yamada else 6570a9064fbSMasahiro Yamada stpart.text = NULL; 6580a9064fbSMasahiro Yamada list_add_tail(&stpart.entries, &trail); 6590a9064fbSMasahiro Yamada 6600a9064fbSMasahiro Yamada while (1) { 6610a9064fbSMasahiro Yamada item_reset(); 6620a9064fbSMasahiro Yamada current_menu = menu; 6630a9064fbSMasahiro Yamada build_conf(menu); 6640a9064fbSMasahiro Yamada if (!child_count) 6650a9064fbSMasahiro Yamada break; 6660a9064fbSMasahiro Yamada set_subtitle(); 6670a9064fbSMasahiro Yamada dialog_clear(); 6680a9064fbSMasahiro Yamada res = dialog_menu(prompt ? _(prompt) : _("Main Menu"), 6690a9064fbSMasahiro Yamada _(menu_instructions), 6700a9064fbSMasahiro Yamada active_menu, &s_scroll); 6710a9064fbSMasahiro Yamada if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) 6720a9064fbSMasahiro Yamada break; 6730a9064fbSMasahiro Yamada if (item_count() != 0) { 6740a9064fbSMasahiro Yamada if (!item_activate_selected()) 6750a9064fbSMasahiro Yamada continue; 6760a9064fbSMasahiro Yamada if (!item_tag()) 6770a9064fbSMasahiro Yamada continue; 6780a9064fbSMasahiro Yamada } 6790a9064fbSMasahiro Yamada submenu = item_data(); 6800a9064fbSMasahiro Yamada active_menu = item_data(); 6810a9064fbSMasahiro Yamada if (submenu) 6820a9064fbSMasahiro Yamada sym = submenu->sym; 6830a9064fbSMasahiro Yamada else 6840a9064fbSMasahiro Yamada sym = NULL; 6850a9064fbSMasahiro Yamada 6860a9064fbSMasahiro Yamada switch (res) { 6870a9064fbSMasahiro Yamada case 0: 6880a9064fbSMasahiro Yamada switch (item_tag()) { 6890a9064fbSMasahiro Yamada case 'm': 6900a9064fbSMasahiro Yamada if (single_menu_mode) 6910a9064fbSMasahiro Yamada submenu->data = (void *) (long) !submenu->data; 6920a9064fbSMasahiro Yamada else 6930a9064fbSMasahiro Yamada conf(submenu, NULL); 6940a9064fbSMasahiro Yamada break; 6950a9064fbSMasahiro Yamada case 't': 6960a9064fbSMasahiro Yamada if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) 6970a9064fbSMasahiro Yamada conf_choice(submenu); 6980a9064fbSMasahiro Yamada else if (submenu->prompt->type == P_MENU) 6990a9064fbSMasahiro Yamada conf(submenu, NULL); 7000a9064fbSMasahiro Yamada break; 7010a9064fbSMasahiro Yamada case 's': 7020a9064fbSMasahiro Yamada conf_string(submenu); 7030a9064fbSMasahiro Yamada break; 7040a9064fbSMasahiro Yamada } 7050a9064fbSMasahiro Yamada break; 7060a9064fbSMasahiro Yamada case 2: 7070a9064fbSMasahiro Yamada if (sym) 7080a9064fbSMasahiro Yamada show_help(submenu); 7090a9064fbSMasahiro Yamada else { 7100a9064fbSMasahiro Yamada reset_subtitle(); 7110a9064fbSMasahiro Yamada show_helptext(_("README"), _(mconf_readme)); 7120a9064fbSMasahiro Yamada } 7130a9064fbSMasahiro Yamada break; 7140a9064fbSMasahiro Yamada case 3: 7150a9064fbSMasahiro Yamada reset_subtitle(); 7160a9064fbSMasahiro Yamada conf_save(); 7170a9064fbSMasahiro Yamada break; 7180a9064fbSMasahiro Yamada case 4: 7190a9064fbSMasahiro Yamada reset_subtitle(); 7200a9064fbSMasahiro Yamada conf_load(); 7210a9064fbSMasahiro Yamada break; 7220a9064fbSMasahiro Yamada case 5: 7230a9064fbSMasahiro Yamada if (item_is_tag('t')) { 7240a9064fbSMasahiro Yamada if (sym_set_tristate_value(sym, yes)) 7250a9064fbSMasahiro Yamada break; 7260a9064fbSMasahiro Yamada if (sym_set_tristate_value(sym, mod)) 7270a9064fbSMasahiro Yamada show_textbox(NULL, setmod_text, 6, 74); 7280a9064fbSMasahiro Yamada } 7290a9064fbSMasahiro Yamada break; 7300a9064fbSMasahiro Yamada case 6: 7310a9064fbSMasahiro Yamada if (item_is_tag('t')) 7320a9064fbSMasahiro Yamada sym_set_tristate_value(sym, no); 7330a9064fbSMasahiro Yamada break; 7340a9064fbSMasahiro Yamada case 7: 7350a9064fbSMasahiro Yamada if (item_is_tag('t')) 7360a9064fbSMasahiro Yamada sym_set_tristate_value(sym, mod); 7370a9064fbSMasahiro Yamada break; 7380a9064fbSMasahiro Yamada case 8: 7390a9064fbSMasahiro Yamada if (item_is_tag('t')) 7400a9064fbSMasahiro Yamada sym_toggle_tristate_value(sym); 7410a9064fbSMasahiro Yamada else if (item_is_tag('m')) 7420a9064fbSMasahiro Yamada conf(submenu, NULL); 7430a9064fbSMasahiro Yamada break; 7440a9064fbSMasahiro Yamada case 9: 7450a9064fbSMasahiro Yamada search_conf(); 7460a9064fbSMasahiro Yamada break; 7470a9064fbSMasahiro Yamada case 10: 7480a9064fbSMasahiro Yamada show_all_options = !show_all_options; 7490a9064fbSMasahiro Yamada break; 7500a9064fbSMasahiro Yamada } 7510a9064fbSMasahiro Yamada } 7520a9064fbSMasahiro Yamada 7530a9064fbSMasahiro Yamada list_del(trail.prev); 7540a9064fbSMasahiro Yamada } 7550a9064fbSMasahiro Yamada 7560a9064fbSMasahiro Yamada static int show_textbox_ext(const char *title, char *text, int r, int c, int 7570a9064fbSMasahiro Yamada *keys, int *vscroll, int *hscroll, update_text_fn 7580a9064fbSMasahiro Yamada update_text, void *data) 7590a9064fbSMasahiro Yamada { 7600a9064fbSMasahiro Yamada dialog_clear(); 7610a9064fbSMasahiro Yamada return dialog_textbox(title, text, r, c, keys, vscroll, hscroll, 7620a9064fbSMasahiro Yamada update_text, data); 7630a9064fbSMasahiro Yamada } 7640a9064fbSMasahiro Yamada 7650a9064fbSMasahiro Yamada static void show_textbox(const char *title, const char *text, int r, int c) 7660a9064fbSMasahiro Yamada { 7670a9064fbSMasahiro Yamada show_textbox_ext(title, (char *) text, r, c, (int []) {0}, NULL, NULL, 7680a9064fbSMasahiro Yamada NULL, NULL); 7690a9064fbSMasahiro Yamada } 7700a9064fbSMasahiro Yamada 7710a9064fbSMasahiro Yamada static void show_helptext(const char *title, const char *text) 7720a9064fbSMasahiro Yamada { 7730a9064fbSMasahiro Yamada show_textbox(title, text, 0, 0); 7740a9064fbSMasahiro Yamada } 7750a9064fbSMasahiro Yamada 7760a9064fbSMasahiro Yamada static void conf_message_callback(const char *fmt, va_list ap) 7770a9064fbSMasahiro Yamada { 7780a9064fbSMasahiro Yamada char buf[PATH_MAX+1]; 7790a9064fbSMasahiro Yamada 7800a9064fbSMasahiro Yamada vsnprintf(buf, sizeof(buf), fmt, ap); 781*9b5f0b1dSMasahiro Yamada if (save_and_exit) { 782*9b5f0b1dSMasahiro Yamada if (!silent) 7830a9064fbSMasahiro Yamada printf("%s", buf); 784*9b5f0b1dSMasahiro Yamada } else { 7850a9064fbSMasahiro Yamada show_textbox(NULL, buf, 6, 60); 7860a9064fbSMasahiro Yamada } 787*9b5f0b1dSMasahiro Yamada } 7880a9064fbSMasahiro Yamada 7890a9064fbSMasahiro Yamada static void show_help(struct menu *menu) 7900a9064fbSMasahiro Yamada { 7910a9064fbSMasahiro Yamada struct gstr help = str_new(); 7920a9064fbSMasahiro Yamada 7930a9064fbSMasahiro Yamada help.max_width = getmaxx(stdscr) - 10; 7940a9064fbSMasahiro Yamada menu_get_ext_help(menu, &help); 7950a9064fbSMasahiro Yamada 7960a9064fbSMasahiro Yamada show_helptext(_(menu_get_prompt(menu)), str_get(&help)); 7970a9064fbSMasahiro Yamada str_free(&help); 7980a9064fbSMasahiro Yamada } 7990a9064fbSMasahiro Yamada 8000a9064fbSMasahiro Yamada static void conf_choice(struct menu *menu) 8010a9064fbSMasahiro Yamada { 8020a9064fbSMasahiro Yamada const char *prompt = _(menu_get_prompt(menu)); 8030a9064fbSMasahiro Yamada struct menu *child; 8040a9064fbSMasahiro Yamada struct symbol *active; 8050a9064fbSMasahiro Yamada 8060a9064fbSMasahiro Yamada active = sym_get_choice_value(menu->sym); 8070a9064fbSMasahiro Yamada while (1) { 8080a9064fbSMasahiro Yamada int res; 8090a9064fbSMasahiro Yamada int selected; 8100a9064fbSMasahiro Yamada item_reset(); 8110a9064fbSMasahiro Yamada 8120a9064fbSMasahiro Yamada current_menu = menu; 8130a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next) { 8140a9064fbSMasahiro Yamada if (!menu_is_visible(child)) 8150a9064fbSMasahiro Yamada continue; 8160a9064fbSMasahiro Yamada if (child->sym) 8170a9064fbSMasahiro Yamada item_make("%s", _(menu_get_prompt(child))); 8180a9064fbSMasahiro Yamada else { 8190a9064fbSMasahiro Yamada item_make("*** %s ***", _(menu_get_prompt(child))); 8200a9064fbSMasahiro Yamada item_set_tag(':'); 8210a9064fbSMasahiro Yamada } 8220a9064fbSMasahiro Yamada item_set_data(child); 8230a9064fbSMasahiro Yamada if (child->sym == active) 8240a9064fbSMasahiro Yamada item_set_selected(1); 8250a9064fbSMasahiro Yamada if (child->sym == sym_get_choice_value(menu->sym)) 8260a9064fbSMasahiro Yamada item_set_tag('X'); 8270a9064fbSMasahiro Yamada } 8280a9064fbSMasahiro Yamada dialog_clear(); 8290a9064fbSMasahiro Yamada res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"), 8300a9064fbSMasahiro Yamada _(radiolist_instructions), 8310a9064fbSMasahiro Yamada MENUBOX_HEIGTH_MIN, 8320a9064fbSMasahiro Yamada MENUBOX_WIDTH_MIN, 8330a9064fbSMasahiro Yamada CHECKLIST_HEIGTH_MIN); 8340a9064fbSMasahiro Yamada selected = item_activate_selected(); 8350a9064fbSMasahiro Yamada switch (res) { 8360a9064fbSMasahiro Yamada case 0: 8370a9064fbSMasahiro Yamada if (selected) { 8380a9064fbSMasahiro Yamada child = item_data(); 8390a9064fbSMasahiro Yamada if (!child->sym) 8400a9064fbSMasahiro Yamada break; 8410a9064fbSMasahiro Yamada 8420a9064fbSMasahiro Yamada sym_set_tristate_value(child->sym, yes); 8430a9064fbSMasahiro Yamada } 8440a9064fbSMasahiro Yamada return; 8450a9064fbSMasahiro Yamada case 1: 8460a9064fbSMasahiro Yamada if (selected) { 8470a9064fbSMasahiro Yamada child = item_data(); 8480a9064fbSMasahiro Yamada show_help(child); 8490a9064fbSMasahiro Yamada active = child->sym; 8500a9064fbSMasahiro Yamada } else 8510a9064fbSMasahiro Yamada show_help(menu); 8520a9064fbSMasahiro Yamada break; 8530a9064fbSMasahiro Yamada case KEY_ESC: 8540a9064fbSMasahiro Yamada return; 8550a9064fbSMasahiro Yamada case -ERRDISPLAYTOOSMALL: 8560a9064fbSMasahiro Yamada return; 8570a9064fbSMasahiro Yamada } 8580a9064fbSMasahiro Yamada } 8590a9064fbSMasahiro Yamada } 8600a9064fbSMasahiro Yamada 8610a9064fbSMasahiro Yamada static void conf_string(struct menu *menu) 8620a9064fbSMasahiro Yamada { 8630a9064fbSMasahiro Yamada const char *prompt = menu_get_prompt(menu); 8640a9064fbSMasahiro Yamada 8650a9064fbSMasahiro Yamada while (1) { 8660a9064fbSMasahiro Yamada int res; 8670a9064fbSMasahiro Yamada const char *heading; 8680a9064fbSMasahiro Yamada 8690a9064fbSMasahiro Yamada switch (sym_get_type(menu->sym)) { 8700a9064fbSMasahiro Yamada case S_INT: 8710a9064fbSMasahiro Yamada heading = _(inputbox_instructions_int); 8720a9064fbSMasahiro Yamada break; 8730a9064fbSMasahiro Yamada case S_HEX: 8740a9064fbSMasahiro Yamada heading = _(inputbox_instructions_hex); 8750a9064fbSMasahiro Yamada break; 8760a9064fbSMasahiro Yamada case S_STRING: 8770a9064fbSMasahiro Yamada heading = _(inputbox_instructions_string); 8780a9064fbSMasahiro Yamada break; 8790a9064fbSMasahiro Yamada default: 8800a9064fbSMasahiro Yamada heading = _("Internal mconf error!"); 8810a9064fbSMasahiro Yamada } 8820a9064fbSMasahiro Yamada dialog_clear(); 8830a9064fbSMasahiro Yamada res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"), 8840a9064fbSMasahiro Yamada heading, 10, 75, 8850a9064fbSMasahiro Yamada sym_get_string_value(menu->sym)); 8860a9064fbSMasahiro Yamada switch (res) { 8870a9064fbSMasahiro Yamada case 0: 8880a9064fbSMasahiro Yamada if (sym_set_string_value(menu->sym, dialog_input_result)) 8890a9064fbSMasahiro Yamada return; 8900a9064fbSMasahiro Yamada show_textbox(NULL, _("You have made an invalid entry."), 5, 43); 8910a9064fbSMasahiro Yamada break; 8920a9064fbSMasahiro Yamada case 1: 8930a9064fbSMasahiro Yamada show_help(menu); 8940a9064fbSMasahiro Yamada break; 8950a9064fbSMasahiro Yamada case KEY_ESC: 8960a9064fbSMasahiro Yamada return; 8970a9064fbSMasahiro Yamada } 8980a9064fbSMasahiro Yamada } 8990a9064fbSMasahiro Yamada } 9000a9064fbSMasahiro Yamada 9010a9064fbSMasahiro Yamada static void conf_load(void) 9020a9064fbSMasahiro Yamada { 9030a9064fbSMasahiro Yamada 9040a9064fbSMasahiro Yamada while (1) { 9050a9064fbSMasahiro Yamada int res; 9060a9064fbSMasahiro Yamada dialog_clear(); 9070a9064fbSMasahiro Yamada res = dialog_inputbox(NULL, load_config_text, 9080a9064fbSMasahiro Yamada 11, 55, filename); 9090a9064fbSMasahiro Yamada switch(res) { 9100a9064fbSMasahiro Yamada case 0: 9110a9064fbSMasahiro Yamada if (!dialog_input_result[0]) 9120a9064fbSMasahiro Yamada return; 9130a9064fbSMasahiro Yamada if (!conf_read(dialog_input_result)) { 9140a9064fbSMasahiro Yamada set_config_filename(dialog_input_result); 9150a9064fbSMasahiro Yamada sym_set_change_count(1); 9160a9064fbSMasahiro Yamada return; 9170a9064fbSMasahiro Yamada } 9180a9064fbSMasahiro Yamada show_textbox(NULL, _("File does not exist!"), 5, 38); 9190a9064fbSMasahiro Yamada break; 9200a9064fbSMasahiro Yamada case 1: 9210a9064fbSMasahiro Yamada show_helptext(_("Load Alternate Configuration"), load_config_help); 9220a9064fbSMasahiro Yamada break; 9230a9064fbSMasahiro Yamada case KEY_ESC: 9240a9064fbSMasahiro Yamada return; 9250a9064fbSMasahiro Yamada } 9260a9064fbSMasahiro Yamada } 9270a9064fbSMasahiro Yamada } 9280a9064fbSMasahiro Yamada 9290a9064fbSMasahiro Yamada static void conf_save(void) 9300a9064fbSMasahiro Yamada { 9310a9064fbSMasahiro Yamada while (1) { 9320a9064fbSMasahiro Yamada int res; 9330a9064fbSMasahiro Yamada dialog_clear(); 9340a9064fbSMasahiro Yamada res = dialog_inputbox(NULL, save_config_text, 9350a9064fbSMasahiro Yamada 11, 55, filename); 9360a9064fbSMasahiro Yamada switch(res) { 9370a9064fbSMasahiro Yamada case 0: 9380a9064fbSMasahiro Yamada if (!dialog_input_result[0]) 9390a9064fbSMasahiro Yamada return; 9400a9064fbSMasahiro Yamada if (!conf_write(dialog_input_result)) { 9410a9064fbSMasahiro Yamada set_config_filename(dialog_input_result); 9420a9064fbSMasahiro Yamada return; 9430a9064fbSMasahiro Yamada } 9440a9064fbSMasahiro Yamada show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60); 9450a9064fbSMasahiro Yamada break; 9460a9064fbSMasahiro Yamada case 1: 9470a9064fbSMasahiro Yamada show_helptext(_("Save Alternate Configuration"), save_config_help); 9480a9064fbSMasahiro Yamada break; 9490a9064fbSMasahiro Yamada case KEY_ESC: 9500a9064fbSMasahiro Yamada return; 9510a9064fbSMasahiro Yamada } 9520a9064fbSMasahiro Yamada } 9530a9064fbSMasahiro Yamada } 9540a9064fbSMasahiro Yamada 9550a9064fbSMasahiro Yamada static int handle_exit(void) 9560a9064fbSMasahiro Yamada { 9570a9064fbSMasahiro Yamada int res; 9580a9064fbSMasahiro Yamada 9590a9064fbSMasahiro Yamada save_and_exit = 1; 9600a9064fbSMasahiro Yamada reset_subtitle(); 9610a9064fbSMasahiro Yamada dialog_clear(); 9620a9064fbSMasahiro Yamada if (conf_get_changed()) 9630a9064fbSMasahiro Yamada res = dialog_yesno(NULL, 9640a9064fbSMasahiro Yamada _("Do you wish to save your new configuration?\n" 9650a9064fbSMasahiro Yamada "(Press <ESC><ESC> to continue kernel configuration.)"), 9660a9064fbSMasahiro Yamada 6, 60); 9670a9064fbSMasahiro Yamada else 9680a9064fbSMasahiro Yamada res = -1; 9690a9064fbSMasahiro Yamada 9700a9064fbSMasahiro Yamada end_dialog(saved_x, saved_y); 9710a9064fbSMasahiro Yamada 9720a9064fbSMasahiro Yamada switch (res) { 9730a9064fbSMasahiro Yamada case 0: 9740a9064fbSMasahiro Yamada if (conf_write(filename)) { 9750a9064fbSMasahiro Yamada fprintf(stderr, _("\n\n" 9760a9064fbSMasahiro Yamada "Error while writing of the configuration.\n" 9770a9064fbSMasahiro Yamada "Your configuration changes were NOT saved." 9780a9064fbSMasahiro Yamada "\n\n")); 9790a9064fbSMasahiro Yamada return 1; 9800a9064fbSMasahiro Yamada } 9810a9064fbSMasahiro Yamada /* fall through */ 9820a9064fbSMasahiro Yamada case -1: 983*9b5f0b1dSMasahiro Yamada if (!silent) 9840a9064fbSMasahiro Yamada printf(_("\n\n" 9850a9064fbSMasahiro Yamada "*** End of the configuration.\n" 9860a9064fbSMasahiro Yamada "*** Execute 'make' to start the build or try 'make help'." 9870a9064fbSMasahiro Yamada "\n\n")); 9880a9064fbSMasahiro Yamada res = 0; 9890a9064fbSMasahiro Yamada break; 9900a9064fbSMasahiro Yamada default: 991*9b5f0b1dSMasahiro Yamada if (!silent) 9920a9064fbSMasahiro Yamada fprintf(stderr, _("\n\n" 9930a9064fbSMasahiro Yamada "Your configuration changes were NOT saved." 9940a9064fbSMasahiro Yamada "\n\n")); 9950a9064fbSMasahiro Yamada if (res != KEY_ESC) 9960a9064fbSMasahiro Yamada res = 0; 9970a9064fbSMasahiro Yamada } 9980a9064fbSMasahiro Yamada 9990a9064fbSMasahiro Yamada return res; 10000a9064fbSMasahiro Yamada } 10010a9064fbSMasahiro Yamada 10020a9064fbSMasahiro Yamada static void sig_handler(int signo) 10030a9064fbSMasahiro Yamada { 10040a9064fbSMasahiro Yamada exit(handle_exit()); 10050a9064fbSMasahiro Yamada } 10060a9064fbSMasahiro Yamada 10070a9064fbSMasahiro Yamada int main(int ac, char **av) 10080a9064fbSMasahiro Yamada { 10090a9064fbSMasahiro Yamada char *mode; 10100a9064fbSMasahiro Yamada int res; 10110a9064fbSMasahiro Yamada 10120a9064fbSMasahiro Yamada setlocale(LC_ALL, ""); 10130a9064fbSMasahiro Yamada bindtextdomain(PACKAGE, LOCALEDIR); 10140a9064fbSMasahiro Yamada textdomain(PACKAGE); 10150a9064fbSMasahiro Yamada 10160a9064fbSMasahiro Yamada signal(SIGINT, sig_handler); 10170a9064fbSMasahiro Yamada 1018*9b5f0b1dSMasahiro Yamada if (ac > 1 && strcmp(av[1], "-s") == 0) { 1019*9b5f0b1dSMasahiro Yamada silent = 1; 1020*9b5f0b1dSMasahiro Yamada /* Silence conf_read() until the real callback is set up */ 1021*9b5f0b1dSMasahiro Yamada conf_set_message_callback(NULL); 1022*9b5f0b1dSMasahiro Yamada av++; 1023*9b5f0b1dSMasahiro Yamada } 10240a9064fbSMasahiro Yamada conf_parse(av[1]); 10250a9064fbSMasahiro Yamada conf_read(NULL); 10260a9064fbSMasahiro Yamada 10270a9064fbSMasahiro Yamada mode = getenv("MENUCONFIG_MODE"); 10280a9064fbSMasahiro Yamada if (mode) { 10290a9064fbSMasahiro Yamada if (!strcasecmp(mode, "single_menu")) 10300a9064fbSMasahiro Yamada single_menu_mode = 1; 10310a9064fbSMasahiro Yamada } 10320a9064fbSMasahiro Yamada 10330a9064fbSMasahiro Yamada if (init_dialog(NULL)) { 10340a9064fbSMasahiro Yamada fprintf(stderr, N_("Your display is too small to run Menuconfig!\n")); 10350a9064fbSMasahiro Yamada fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n")); 10360a9064fbSMasahiro Yamada return 1; 10370a9064fbSMasahiro Yamada } 10380a9064fbSMasahiro Yamada 10390a9064fbSMasahiro Yamada set_config_filename(conf_get_configname()); 10400a9064fbSMasahiro Yamada conf_set_message_callback(conf_message_callback); 10410a9064fbSMasahiro Yamada do { 10420a9064fbSMasahiro Yamada conf(&rootmenu, NULL); 10430a9064fbSMasahiro Yamada res = handle_exit(); 10440a9064fbSMasahiro Yamada } while (res == KEY_ESC); 10450a9064fbSMasahiro Yamada 10460a9064fbSMasahiro Yamada return res; 10470a9064fbSMasahiro Yamada } 1048