util/kconfig: Uprev to Linux 6.4's kconfig
TEST=`util/abuild/abuild -C` output (config.h and config.build) remains the same Change-Id: Idbcd88165271b58ba3697c66df447af0b8b57b1b Signed-off-by: Patrick Georgi <patrick@coreboot.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/79181 Reviewed-by: Martin L Roth <gaumless@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
54cec70650
commit
34b149b508
|
@ -18,22 +18,6 @@
|
||||||
#endif
|
#endif
|
||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* Colors in ncurses 1.9.9e do not work properly since foreground and
|
|
||||||
* background colors are OR'd rather than separately masked. This version
|
|
||||||
* of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
|
|
||||||
* with standard curses. The simplest fix (to make this work with standard
|
|
||||||
* curses) uses the wbkgdset() function, not used in the original hack.
|
|
||||||
* Turn it off if we're building with 1.9.9e, since it just confuses things.
|
|
||||||
*/
|
|
||||||
#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
|
|
||||||
#define OLD_NCURSES 1
|
|
||||||
#undef wbkgdset
|
|
||||||
#define wbkgdset(w,p) /*nothing */
|
|
||||||
#else
|
|
||||||
#define OLD_NCURSES 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TR(params) _tracef params
|
#define TR(params) _tracef params
|
||||||
|
|
||||||
#define KEY_ESC 27
|
#define KEY_ESC 27
|
||||||
|
@ -225,14 +209,3 @@ int dialog_checklist(const char *title, const char *prompt, int height,
|
||||||
int width, int list_height);
|
int width, int list_height);
|
||||||
int dialog_inputbox(const char *title, const char *prompt, int height,
|
int dialog_inputbox(const char *title, const char *prompt, int height,
|
||||||
int width, const char *init);
|
int width, const char *init);
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the base for fictitious keys, which activate
|
|
||||||
* the buttons.
|
|
||||||
*
|
|
||||||
* Mouse-generated keys are the following:
|
|
||||||
* -- the first 32 are used as numbers, in addition to '0'-'9'
|
|
||||||
* -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
|
|
||||||
* -- uppercase chars are used to invoke the button (M_EVENT + 'O')
|
|
||||||
*/
|
|
||||||
#define M_EVENT (KEY_MAX+1)
|
|
||||||
|
|
|
@ -63,15 +63,7 @@ static void do_print_item(WINDOW * win, const char *item, int line_y,
|
||||||
/* Clear 'residue' of last item */
|
/* Clear 'residue' of last item */
|
||||||
wattrset(win, dlg.menubox.atr);
|
wattrset(win, dlg.menubox.atr);
|
||||||
wmove(win, line_y, 0);
|
wmove(win, line_y, 0);
|
||||||
#if OLD_NCURSES
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < menu_width; i++)
|
|
||||||
waddch(win, ' ');
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
wclrtoeol(win);
|
wclrtoeol(win);
|
||||||
#endif
|
|
||||||
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
|
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
|
||||||
mvwaddstr(win, line_y, item_x, menu_item);
|
mvwaddstr(win, line_y, item_x, menu_item);
|
||||||
if (hotkey) {
|
if (hotkey) {
|
||||||
|
|
|
@ -8,18 +8,136 @@
|
||||||
|
|
||||||
#include "dialog.h"
|
#include "dialog.h"
|
||||||
|
|
||||||
static void back_lines(int n);
|
|
||||||
static void print_page(WINDOW *win, int height, int width, update_text_fn
|
|
||||||
update_text, void *data);
|
|
||||||
static void print_line(WINDOW *win, int row, int width);
|
|
||||||
static char *get_line(void);
|
|
||||||
static void print_position(WINDOW * win);
|
|
||||||
|
|
||||||
static int hscroll;
|
static int hscroll;
|
||||||
static int begin_reached, end_reached, page_length;
|
static int begin_reached, end_reached, page_length;
|
||||||
static char *buf;
|
static char *buf;
|
||||||
static char *page;
|
static char *page;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Go back 'n' lines in text. Called by dialog_textbox().
|
||||||
|
* 'page' will be updated to point to the desired line in 'buf'.
|
||||||
|
*/
|
||||||
|
static void back_lines(int n)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
begin_reached = 0;
|
||||||
|
/* Go back 'n' lines */
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
if (*page == '\0') {
|
||||||
|
if (end_reached) {
|
||||||
|
end_reached = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (page == buf) {
|
||||||
|
begin_reached = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
page--;
|
||||||
|
do {
|
||||||
|
if (page == buf) {
|
||||||
|
begin_reached = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
page--;
|
||||||
|
} while (*page != '\n');
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return current line of text. Called by dialog_textbox() and print_line().
|
||||||
|
* 'page' should point to start of current line before calling, and will be
|
||||||
|
* updated to point to start of next line.
|
||||||
|
*/
|
||||||
|
static char *get_line(void)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
static char line[MAX_LEN + 1];
|
||||||
|
|
||||||
|
end_reached = 0;
|
||||||
|
while (*page != '\n') {
|
||||||
|
if (*page == '\0') {
|
||||||
|
end_reached = 1;
|
||||||
|
break;
|
||||||
|
} else if (i < MAX_LEN)
|
||||||
|
line[i++] = *(page++);
|
||||||
|
else {
|
||||||
|
/* Truncate lines longer than MAX_LEN characters */
|
||||||
|
if (i == MAX_LEN)
|
||||||
|
line[i++] = '\0';
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i <= MAX_LEN)
|
||||||
|
line[i] = '\0';
|
||||||
|
if (!end_reached)
|
||||||
|
page++; /* move past '\n' */
|
||||||
|
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a new line of text.
|
||||||
|
*/
|
||||||
|
static void print_line(WINDOW *win, int row, int width)
|
||||||
|
{
|
||||||
|
char *line;
|
||||||
|
|
||||||
|
line = get_line();
|
||||||
|
line += MIN(strlen(line), hscroll); /* Scroll horizontally */
|
||||||
|
wmove(win, row, 0); /* move cursor to correct line */
|
||||||
|
waddch(win, ' ');
|
||||||
|
waddnstr(win, line, MIN(strlen(line), width - 2));
|
||||||
|
|
||||||
|
/* Clear 'residue' of previous line */
|
||||||
|
wclrtoeol(win);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a new page of text.
|
||||||
|
*/
|
||||||
|
static void print_page(WINDOW *win, int height, int width, update_text_fn
|
||||||
|
update_text, void *data)
|
||||||
|
{
|
||||||
|
int i, passed_end = 0;
|
||||||
|
|
||||||
|
if (update_text) {
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
for (i = 0; i < height; i++)
|
||||||
|
get_line();
|
||||||
|
end = page;
|
||||||
|
back_lines(height);
|
||||||
|
update_text(buf, page - buf, end - buf, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
page_length = 0;
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
print_line(win, i, width);
|
||||||
|
if (!passed_end)
|
||||||
|
page_length++;
|
||||||
|
if (end_reached && !passed_end)
|
||||||
|
passed_end = 1;
|
||||||
|
}
|
||||||
|
wnoutrefresh(win);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print current position
|
||||||
|
*/
|
||||||
|
static void print_position(WINDOW *win)
|
||||||
|
{
|
||||||
|
int percent;
|
||||||
|
|
||||||
|
wattrset(win, dlg.position_indicator.atr);
|
||||||
|
wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
|
||||||
|
percent = (page - buf) * 100 / strlen(buf);
|
||||||
|
wmove(win, getmaxy(win) - 3, getmaxx(win) - 9);
|
||||||
|
wprintw(win, "(%3d%%)", percent);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* refresh window content
|
* refresh window content
|
||||||
*/
|
*/
|
||||||
|
@ -33,7 +151,6 @@ static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
|
||||||
wrefresh(dialog);
|
wrefresh(dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display text from a file in a dialog box.
|
* Display text from a file in a dialog box.
|
||||||
*
|
*
|
||||||
|
@ -259,137 +376,3 @@ do_resize:
|
||||||
*_hscroll = hscroll;
|
*_hscroll = hscroll;
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Go back 'n' lines in text. Called by dialog_textbox().
|
|
||||||
* 'page' will be updated to point to the desired line in 'buf'.
|
|
||||||
*/
|
|
||||||
static void back_lines(int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
begin_reached = 0;
|
|
||||||
/* Go back 'n' lines */
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
if (*page == '\0') {
|
|
||||||
if (end_reached) {
|
|
||||||
end_reached = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (page == buf) {
|
|
||||||
begin_reached = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
page--;
|
|
||||||
do {
|
|
||||||
if (page == buf) {
|
|
||||||
begin_reached = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
page--;
|
|
||||||
} while (*page != '\n');
|
|
||||||
page++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print a new page of text.
|
|
||||||
*/
|
|
||||||
static void print_page(WINDOW *win, int height, int width, update_text_fn
|
|
||||||
update_text, void *data)
|
|
||||||
{
|
|
||||||
int i, passed_end = 0;
|
|
||||||
|
|
||||||
if (update_text) {
|
|
||||||
char *end;
|
|
||||||
|
|
||||||
for (i = 0; i < height; i++)
|
|
||||||
get_line();
|
|
||||||
end = page;
|
|
||||||
back_lines(height);
|
|
||||||
update_text(buf, page - buf, end - buf, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
page_length = 0;
|
|
||||||
for (i = 0; i < height; i++) {
|
|
||||||
print_line(win, i, width);
|
|
||||||
if (!passed_end)
|
|
||||||
page_length++;
|
|
||||||
if (end_reached && !passed_end)
|
|
||||||
passed_end = 1;
|
|
||||||
}
|
|
||||||
wnoutrefresh(win);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print a new line of text.
|
|
||||||
*/
|
|
||||||
static void print_line(WINDOW * win, int row, int width)
|
|
||||||
{
|
|
||||||
char *line;
|
|
||||||
|
|
||||||
line = get_line();
|
|
||||||
line += MIN(strlen(line), hscroll); /* Scroll horizontally */
|
|
||||||
wmove(win, row, 0); /* move cursor to correct line */
|
|
||||||
waddch(win, ' ');
|
|
||||||
waddnstr(win, line, MIN(strlen(line), width - 2));
|
|
||||||
|
|
||||||
/* Clear 'residue' of previous line */
|
|
||||||
#if OLD_NCURSES
|
|
||||||
{
|
|
||||||
int x = getcurx(win);
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < width - x; i++)
|
|
||||||
waddch(win, ' ');
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
wclrtoeol(win);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return current line of text. Called by dialog_textbox() and print_line().
|
|
||||||
* 'page' should point to start of current line before calling, and will be
|
|
||||||
* updated to point to start of next line.
|
|
||||||
*/
|
|
||||||
static char *get_line(void)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
static char line[MAX_LEN + 1];
|
|
||||||
|
|
||||||
end_reached = 0;
|
|
||||||
while (*page != '\n') {
|
|
||||||
if (*page == '\0') {
|
|
||||||
end_reached = 1;
|
|
||||||
break;
|
|
||||||
} else if (i < MAX_LEN)
|
|
||||||
line[i++] = *(page++);
|
|
||||||
else {
|
|
||||||
/* Truncate lines longer than MAX_LEN characters */
|
|
||||||
if (i == MAX_LEN)
|
|
||||||
line[i++] = '\0';
|
|
||||||
page++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i <= MAX_LEN)
|
|
||||||
line[i] = '\0';
|
|
||||||
if (!end_reached)
|
|
||||||
page++; /* move past '\n' */
|
|
||||||
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print current position
|
|
||||||
*/
|
|
||||||
static void print_position(WINDOW * win)
|
|
||||||
{
|
|
||||||
int percent;
|
|
||||||
|
|
||||||
wattrset(win, dlg.position_indicator.atr);
|
|
||||||
wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
|
|
||||||
percent = (page - buf) * 100 / strlen(buf);
|
|
||||||
wmove(win, getmaxy(win) - 3, getmaxx(win) - 9);
|
|
||||||
wprintw(win, "(%3d%%)", percent);
|
|
||||||
}
|
|
||||||
|
|
|
@ -292,16 +292,6 @@ static int save_and_exit;
|
||||||
static int silent;
|
static int silent;
|
||||||
|
|
||||||
static void conf(struct menu *menu, struct menu *active_menu);
|
static void conf(struct menu *menu, struct menu *active_menu);
|
||||||
static void conf_choice(struct menu *menu);
|
|
||||||
static void conf_string(struct menu *menu);
|
|
||||||
static void conf_load(void);
|
|
||||||
static void conf_save(void);
|
|
||||||
static int show_textbox_ext(const char *title, char *text, int r, int c,
|
|
||||||
int *keys, int *vscroll, int *hscroll,
|
|
||||||
update_text_fn update_text, void *data);
|
|
||||||
static void show_textbox(const char *title, const char *text, int r, int c);
|
|
||||||
static void show_helptext(const char *title, const char *text);
|
|
||||||
static void show_help(struct menu *menu);
|
|
||||||
|
|
||||||
static char filename[PATH_MAX+1];
|
static char filename[PATH_MAX+1];
|
||||||
static void set_config_filename(const char *config_filename)
|
static void set_config_filename(const char *config_filename)
|
||||||
|
@ -360,6 +350,37 @@ static void reset_subtitle(void)
|
||||||
set_dialog_subtitles(subtitles);
|
set_dialog_subtitles(subtitles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int show_textbox_ext(const char *title, char *text, int r, int c, int
|
||||||
|
*keys, int *vscroll, int *hscroll, update_text_fn
|
||||||
|
update_text, void *data)
|
||||||
|
{
|
||||||
|
dialog_clear();
|
||||||
|
return dialog_textbox(title, text, r, c, keys, vscroll, hscroll,
|
||||||
|
update_text, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_textbox(const char *title, const char *text, int r, int c)
|
||||||
|
{
|
||||||
|
show_textbox_ext(title, (char *) text, r, c, (int []) {0}, NULL, NULL,
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_helptext(const char *title, const char *text)
|
||||||
|
{
|
||||||
|
show_textbox(title, text, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_help(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct gstr help = str_new();
|
||||||
|
|
||||||
|
help.max_width = getmaxx(stdscr) - 10;
|
||||||
|
menu_get_ext_help(menu, &help);
|
||||||
|
|
||||||
|
show_helptext(menu_get_prompt(menu), str_get(&help));
|
||||||
|
str_free(&help);
|
||||||
|
}
|
||||||
|
|
||||||
struct search_data {
|
struct search_data {
|
||||||
struct list_head *head;
|
struct list_head *head;
|
||||||
struct menu **targets;
|
struct menu **targets;
|
||||||
|
@ -645,158 +666,6 @@ conf_childs:
|
||||||
indent -= doint;
|
indent -= doint;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conf(struct menu *menu, struct menu *active_menu)
|
|
||||||
{
|
|
||||||
struct menu *submenu;
|
|
||||||
const char *prompt = menu_get_prompt(menu);
|
|
||||||
struct subtitle_part stpart;
|
|
||||||
struct symbol *sym;
|
|
||||||
int res;
|
|
||||||
int s_scroll = 0;
|
|
||||||
|
|
||||||
if (menu != &rootmenu)
|
|
||||||
stpart.text = menu_get_prompt(menu);
|
|
||||||
else
|
|
||||||
stpart.text = NULL;
|
|
||||||
list_add_tail(&stpart.entries, &trail);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
item_reset();
|
|
||||||
current_menu = menu;
|
|
||||||
build_conf(menu);
|
|
||||||
if (!child_count)
|
|
||||||
break;
|
|
||||||
set_subtitle();
|
|
||||||
dialog_clear();
|
|
||||||
res = dialog_menu(prompt ? prompt : "Main Menu",
|
|
||||||
menu_instructions,
|
|
||||||
active_menu, &s_scroll);
|
|
||||||
if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
|
|
||||||
break;
|
|
||||||
if (item_count() != 0) {
|
|
||||||
if (!item_activate_selected())
|
|
||||||
continue;
|
|
||||||
if (!item_tag())
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
submenu = item_data();
|
|
||||||
active_menu = item_data();
|
|
||||||
if (submenu)
|
|
||||||
sym = submenu->sym;
|
|
||||||
else
|
|
||||||
sym = NULL;
|
|
||||||
|
|
||||||
switch (res) {
|
|
||||||
case 0:
|
|
||||||
switch (item_tag()) {
|
|
||||||
case 'm':
|
|
||||||
if (single_menu_mode)
|
|
||||||
submenu->data = (void *) (long) !submenu->data;
|
|
||||||
else
|
|
||||||
conf(submenu, NULL);
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
|
|
||||||
conf_choice(submenu);
|
|
||||||
else if (submenu->prompt->type == P_MENU)
|
|
||||||
conf(submenu, NULL);
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
conf_string(submenu);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if (sym)
|
|
||||||
show_help(submenu);
|
|
||||||
else {
|
|
||||||
reset_subtitle();
|
|
||||||
show_helptext("README", mconf_readme);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
reset_subtitle();
|
|
||||||
conf_save();
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
reset_subtitle();
|
|
||||||
conf_load();
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
if (item_is_tag('t')) {
|
|
||||||
if (sym_set_tristate_value(sym, yes))
|
|
||||||
break;
|
|
||||||
if (sym_set_tristate_value(sym, mod))
|
|
||||||
show_textbox(NULL, setmod_text, 6, 74);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
if (item_is_tag('t'))
|
|
||||||
sym_set_tristate_value(sym, no);
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
if (item_is_tag('t'))
|
|
||||||
sym_set_tristate_value(sym, mod);
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
if (item_is_tag('t'))
|
|
||||||
sym_toggle_tristate_value(sym);
|
|
||||||
else if (item_is_tag('m'))
|
|
||||||
conf(submenu, NULL);
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
search_conf();
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
show_all_options = !show_all_options;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list_del(trail.prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int show_textbox_ext(const char *title, char *text, int r, int c, int
|
|
||||||
*keys, int *vscroll, int *hscroll, update_text_fn
|
|
||||||
update_text, void *data)
|
|
||||||
{
|
|
||||||
dialog_clear();
|
|
||||||
return dialog_textbox(title, text, r, c, keys, vscroll, hscroll,
|
|
||||||
update_text, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void show_textbox(const char *title, const char *text, int r, int c)
|
|
||||||
{
|
|
||||||
show_textbox_ext(title, (char *) text, r, c, (int []) {0}, NULL, NULL,
|
|
||||||
NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void show_helptext(const char *title, const char *text)
|
|
||||||
{
|
|
||||||
show_textbox(title, text, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void conf_message_callback(const char *s)
|
|
||||||
{
|
|
||||||
if (save_and_exit) {
|
|
||||||
if (!silent)
|
|
||||||
printf("%s", s);
|
|
||||||
} else {
|
|
||||||
show_textbox(NULL, s, 6, 60);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void show_help(struct menu *menu)
|
|
||||||
{
|
|
||||||
struct gstr help = str_new();
|
|
||||||
|
|
||||||
help.max_width = getmaxx(stdscr) - 10;
|
|
||||||
menu_get_ext_help(menu, &help);
|
|
||||||
|
|
||||||
show_helptext(menu_get_prompt(menu), str_get(&help));
|
|
||||||
str_free(&help);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void conf_choice(struct menu *menu)
|
static void conf_choice(struct menu *menu)
|
||||||
{
|
{
|
||||||
const char *prompt = menu_get_prompt(menu);
|
const char *prompt = menu_get_prompt(menu);
|
||||||
|
@ -952,6 +821,127 @@ static void conf_save(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void conf(struct menu *menu, struct menu *active_menu)
|
||||||
|
{
|
||||||
|
struct menu *submenu;
|
||||||
|
const char *prompt = menu_get_prompt(menu);
|
||||||
|
struct subtitle_part stpart;
|
||||||
|
struct symbol *sym;
|
||||||
|
int res;
|
||||||
|
int s_scroll = 0;
|
||||||
|
|
||||||
|
if (menu != &rootmenu)
|
||||||
|
stpart.text = menu_get_prompt(menu);
|
||||||
|
else
|
||||||
|
stpart.text = NULL;
|
||||||
|
list_add_tail(&stpart.entries, &trail);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
item_reset();
|
||||||
|
current_menu = menu;
|
||||||
|
build_conf(menu);
|
||||||
|
if (!child_count)
|
||||||
|
break;
|
||||||
|
set_subtitle();
|
||||||
|
dialog_clear();
|
||||||
|
res = dialog_menu(prompt ? prompt : "Main Menu",
|
||||||
|
menu_instructions,
|
||||||
|
active_menu, &s_scroll);
|
||||||
|
if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
|
||||||
|
break;
|
||||||
|
if (item_count() != 0) {
|
||||||
|
if (!item_activate_selected())
|
||||||
|
continue;
|
||||||
|
if (!item_tag())
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
submenu = item_data();
|
||||||
|
active_menu = item_data();
|
||||||
|
if (submenu)
|
||||||
|
sym = submenu->sym;
|
||||||
|
else
|
||||||
|
sym = NULL;
|
||||||
|
|
||||||
|
switch (res) {
|
||||||
|
case 0:
|
||||||
|
switch (item_tag()) {
|
||||||
|
case 'm':
|
||||||
|
if (single_menu_mode)
|
||||||
|
submenu->data = (void *) (long) !submenu->data;
|
||||||
|
else
|
||||||
|
conf(submenu, NULL);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
|
||||||
|
conf_choice(submenu);
|
||||||
|
else if (submenu->prompt->type == P_MENU)
|
||||||
|
conf(submenu, NULL);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
conf_string(submenu);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (sym)
|
||||||
|
show_help(submenu);
|
||||||
|
else {
|
||||||
|
reset_subtitle();
|
||||||
|
show_helptext("README", mconf_readme);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
reset_subtitle();
|
||||||
|
conf_save();
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
reset_subtitle();
|
||||||
|
conf_load();
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (item_is_tag('t')) {
|
||||||
|
if (sym_set_tristate_value(sym, yes))
|
||||||
|
break;
|
||||||
|
if (sym_set_tristate_value(sym, mod))
|
||||||
|
show_textbox(NULL, setmod_text, 6, 74);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if (item_is_tag('t'))
|
||||||
|
sym_set_tristate_value(sym, no);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
if (item_is_tag('t'))
|
||||||
|
sym_set_tristate_value(sym, mod);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
if (item_is_tag('t'))
|
||||||
|
sym_toggle_tristate_value(sym);
|
||||||
|
else if (item_is_tag('m'))
|
||||||
|
conf(submenu, NULL);
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
search_conf();
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
show_all_options = !show_all_options;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list_del(trail.prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_message_callback(const char *s)
|
||||||
|
{
|
||||||
|
if (save_and_exit) {
|
||||||
|
if (!silent)
|
||||||
|
printf("%s", s);
|
||||||
|
} else {
|
||||||
|
show_textbox(NULL, s, 6, 60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int handle_exit(void)
|
static int handle_exit(void)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
|
|
@ -102,7 +102,7 @@ Index: kconfig/mconf.c
|
||||||
static const char mconf_readme[] =
|
static const char mconf_readme[] =
|
||||||
"Overview\n"
|
"Overview\n"
|
||||||
"--------\n"
|
"--------\n"
|
||||||
@@ -953,6 +955,7 @@ static void conf_save(void)
|
@@ -943,6 +945,7 @@ static void conf_message_callback(const
|
||||||
static int handle_exit(void)
|
static int handle_exit(void)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
@ -110,7 +110,7 @@ Index: kconfig/mconf.c
|
||||||
|
|
||||||
save_and_exit = 1;
|
save_and_exit = 1;
|
||||||
reset_subtitle();
|
reset_subtitle();
|
||||||
@@ -967,6 +970,13 @@ static int handle_exit(void)
|
@@ -957,6 +960,13 @@ static int handle_exit(void)
|
||||||
|
|
||||||
end_dialog(saved_x, saved_y);
|
end_dialog(saved_x, saved_y);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue