diff options
Diffstat (limited to 'extra/config/mconf.c')
-rw-r--r-- | extra/config/mconf.c | 65 |
1 files changed, 58 insertions, 7 deletions
diff --git a/extra/config/mconf.c b/extra/config/mconf.c index c738a3f35..2ebc18819 100644 --- a/extra/config/mconf.c +++ b/extra/config/mconf.c @@ -1,6 +1,9 @@ /* * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> * Released under the terms of the GNU GPL v2.0. + * + * Introduced single menu mode (show all sub-menus in one large tree). + * 2002-11-06 Petr Baudis <pasky@ucw.cz> */ #include <sys/ioctl.h> @@ -12,6 +15,7 @@ #include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <termios.h> #include <unistd.h> #define LKC_DIRECT_LINK @@ -80,10 +84,12 @@ static char buf[4096], *bufptr = buf; static char input_buf[4096]; static char *args[1024], **argptr = args; static int indent = 0; +static struct termios ios_org; static int rows, cols; static struct menu *current_menu; static int child_count; static int do_resize; +static int single_menu_mode; static void conf(struct menu *menu); static void conf_choice(struct menu *menu); @@ -274,10 +280,20 @@ static void build_conf(struct menu *menu) case P_MENU: child_count++; cprint("m%p", menu); - if (menu->parent != &rootmenu) - cprint1(" %*c", indent + 1, ' '); - cprint1("%s --->", prompt); + + if (single_menu_mode) { + cprint1("%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else { + if (menu->parent != &rootmenu) + cprint1(" %*c", indent + 1, ' '); + cprint1("%s --->", prompt); + } + cprint_done(); + if (single_menu_mode && menu->data) + goto conf_childs; return; default: if (prompt) { @@ -392,6 +408,7 @@ static void conf(struct menu *menu) char active_entry[40]; int stat, type, i; + unlink("lxdialog.scrltmp"); active_entry[0] = 0; while (1) { cprint_init(); @@ -442,7 +459,10 @@ static void conf(struct menu *menu) case 0: switch (type) { case 'm': - conf(submenu); + if (single_menu_mode) + submenu->data = (void *) !submenu->data; + else + conf(submenu); break; case 't': if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) @@ -484,6 +504,8 @@ static void conf(struct menu *menu) case 6: if (type == 't') sym_toggle_tristate_value(sym); + else if (type == 'm') + conf(submenu); break; } } @@ -518,11 +540,19 @@ static void show_helptext(const char *title, const char *text) static void show_help(struct menu *menu) { const char *help; + char *helptext; + struct symbol *sym = menu->sym; - help = menu->sym->help; + help = sym->help; if (!help) help = nohelp_text; - show_helptext(menu_get_prompt(menu), help); + if (sym->name) { + helptext = malloc(strlen(sym->name) + strlen(help) + 16); + sprintf(helptext, "%s:\n\n%s", sym->name, help); + show_helptext(menu_get_prompt(menu), helptext); + free(helptext); + } else + show_helptext(menu_get_prompt(menu), help); } static void show_readme(void) @@ -679,14 +709,35 @@ static void conf_save(void) } } +static void conf_cleanup(void) +{ + tcsetattr(1, TCSAFLUSH, &ios_org); + unlink(".help.tmp"); + unlink("lxdialog.scrltmp"); +} + int main(int ac, char **av) { + struct symbol *sym; + char *mode; int stat; + conf_parse(av[1]); conf_read(NULL); - sprintf(menu_backtitle, "uClibc v%s Configuration", getenv("VERSION")); + sym = sym_lookup("VERSION", 0); + sym_calc_value(sym); + sprintf(menu_backtitle, "uClibc v%s Configuration", + sym_get_string_value(sym)); + mode = getenv("MENUCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + + tcgetattr(1, &ios_org); + atexit(conf_cleanup); init_wsize(); conf(&rootmenu); |