summaryrefslogtreecommitdiff
path: root/extra/config/mconf.c
diff options
context:
space:
mode:
Diffstat (limited to 'extra/config/mconf.c')
-rw-r--r--extra/config/mconf.c65
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);