kconfig: attach help text to menus

Roman Zippel wrote:
> A simple example would be
> help texts, right now they are per symbol, but they should really be per
> menu, so archs can provide different help texts for something.

This patch does this and at the same time introduce a few API
funtions used to access the help text.

The relevant api functions are introduced in the various frontends.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
This commit is contained in:
Sam Ravnborg 2007-07-21 00:00:36 +02:00
parent 4a645d5ea6
commit 03d2912273
10 changed files with 49 additions and 43 deletions

View File

@ -37,6 +37,14 @@ static struct menu *rootEntry;
static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n"); static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
static const char *get_help(struct menu *menu)
{
if (menu_has_help(menu))
return menu_get_help(menu);
else
return nohelp_text;
}
static void strip(char *str) static void strip(char *str)
{ {
char *p = str; char *p = str;
@ -171,7 +179,7 @@ static void conf_askvalue(struct symbol *sym, const char *def)
int conf_string(struct menu *menu) int conf_string(struct menu *menu)
{ {
struct symbol *sym = menu->sym; struct symbol *sym = menu->sym;
const char *def, *help; const char *def;
while (1) { while (1) {
printf("%*s%s ", indent - 1, "", menu->prompt->text); printf("%*s%s ", indent - 1, "", menu->prompt->text);
@ -186,10 +194,7 @@ int conf_string(struct menu *menu)
case '?': case '?':
/* print help */ /* print help */
if (line[1] == '\n') { if (line[1] == '\n') {
help = nohelp_text; printf("\n%s\n", get_help(menu));
if (menu->sym->help)
help = menu->sym->help;
printf("\n%s\n", menu->sym->help);
def = NULL; def = NULL;
break; break;
} }
@ -207,7 +212,6 @@ static int conf_sym(struct menu *menu)
struct symbol *sym = menu->sym; struct symbol *sym = menu->sym;
int type; int type;
tristate oldval, newval; tristate oldval, newval;
const char *help;
while (1) { while (1) {
printf("%*s%s ", indent - 1, "", menu->prompt->text); printf("%*s%s ", indent - 1, "", menu->prompt->text);
@ -233,7 +237,7 @@ static int conf_sym(struct menu *menu)
printf("/m"); printf("/m");
if (oldval != yes && sym_tristate_within_range(sym, yes)) if (oldval != yes && sym_tristate_within_range(sym, yes))
printf("/y"); printf("/y");
if (sym->help) if (menu_has_help(menu))
printf("/?"); printf("/?");
printf("] "); printf("] ");
conf_askvalue(sym, sym_get_string_value(sym)); conf_askvalue(sym, sym_get_string_value(sym));
@ -269,10 +273,7 @@ static int conf_sym(struct menu *menu)
if (sym_set_tristate_value(sym, newval)) if (sym_set_tristate_value(sym, newval))
return 0; return 0;
help: help:
help = nohelp_text; printf("\n%s\n", get_help(menu));
if (sym->help)
help = sym->help;
printf("\n%s\n", help);
} }
} }
@ -342,7 +343,7 @@ static int conf_choice(struct menu *menu)
goto conf_childs; goto conf_childs;
} }
printf("[1-%d", cnt); printf("[1-%d", cnt);
if (sym->help) if (menu_has_help(menu))
printf("?"); printf("?");
printf("]: "); printf("]: ");
switch (input_mode) { switch (input_mode) {
@ -359,8 +360,7 @@ static int conf_choice(struct menu *menu)
fgets(line, 128, stdin); fgets(line, 128, stdin);
strip(line); strip(line);
if (line[0] == '?') { if (line[0] == '?') {
printf("\n%s\n", menu->sym->help ? printf("\n%s\n", get_help(menu));
menu->sym->help : nohelp_text);
continue; continue;
} }
if (!line[0]) if (!line[0])
@ -391,8 +391,7 @@ static int conf_choice(struct menu *menu)
if (!child) if (!child)
continue; continue;
if (line[strlen(line) - 1] == '?') { if (line[strlen(line) - 1] == '?') {
printf("\n%s\n", child->sym->help ? printf("\n%s\n", get_help(child));
child->sym->help : nohelp_text);
continue; continue;
} }
sym_set_choice_value(sym, child->sym); sym_set_choice_value(sym, child->sym);

View File

@ -71,7 +71,6 @@ enum {
struct symbol { struct symbol {
struct symbol *next; struct symbol *next;
char *name; char *name;
char *help;
enum symbol_type type; enum symbol_type type;
struct symbol_value curr; struct symbol_value curr;
struct symbol_value def[4]; struct symbol_value def[4];
@ -139,7 +138,7 @@ struct menu {
struct property *prompt; struct property *prompt;
struct expr *dep; struct expr *dep;
unsigned int flags; unsigned int flags;
//char *help; char *help;
struct file *file; struct file *file;
int lineno; int lineno;
void *data; void *data;

View File

@ -38,9 +38,6 @@ static gboolean show_all = FALSE;
static gboolean show_debug = FALSE; static gboolean show_debug = FALSE;
static gboolean resizeable = FALSE; static gboolean resizeable = FALSE;
static char nohelp_text[] =
N_("Sorry, no help available for this option yet.\n");
GtkWidget *main_wnd = NULL; GtkWidget *main_wnd = NULL;
GtkWidget *tree1_w = NULL; // left frame GtkWidget *tree1_w = NULL; // left frame
GtkWidget *tree2_w = NULL; // right frame GtkWidget *tree2_w = NULL; // right frame
@ -462,12 +459,9 @@ static void text_insert_help(struct menu *menu)
GtkTextIter start, end; GtkTextIter start, end;
const char *prompt = menu_get_prompt(menu); const char *prompt = menu_get_prompt(menu);
gchar *name; gchar *name;
const char *help = _(nohelp_text); const char *help;
if (!menu->sym) help = _(menu_get_help(menu));
help = "";
else if (menu->sym->help)
help = _(menu->sym->help);
if (menu->sym && menu->sym->name) if (menu->sym && menu->sym->name)
name = g_strdup_printf(_(menu->sym->name)); name = g_strdup_printf(_(menu->sym->name));

View File

@ -170,8 +170,8 @@ void menu_build_message_list(struct menu *menu)
menu->file == NULL ? "Root Menu" : menu->file->name, menu->file == NULL ? "Root Menu" : menu->file->name,
menu->lineno); menu->lineno);
if (menu->sym != NULL && menu->sym->help != NULL) if (menu->sym != NULL && menu_has_help(menu))
message__add(menu->sym->help, menu->sym->name, message__add(menu_get_help(menu), menu->sym->name,
menu->file == NULL ? "Root Menu" : menu->file->name, menu->file == NULL ? "Root Menu" : menu->file->name,
menu->lineno); menu->lineno);

View File

@ -15,6 +15,8 @@ P(menu_is_visible,bool,(struct menu *menu));
P(menu_get_prompt,const char *,(struct menu *menu)); P(menu_get_prompt,const char *,(struct menu *menu));
P(menu_get_root_menu,struct menu *,(struct menu *menu)); P(menu_get_root_menu,struct menu *,(struct menu *menu));
P(menu_get_parent_menu,struct menu *,(struct menu *menu)); P(menu_get_parent_menu,struct menu *,(struct menu *menu));
P(menu_has_help,bool,(struct menu *menu));
P(menu_get_help,const char *,(struct menu *menu));
/* symbol.c */ /* symbol.c */
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);

View File

@ -725,11 +725,11 @@ static void show_help(struct menu *menu)
struct gstr help = str_new(); struct gstr help = str_new();
struct symbol *sym = menu->sym; struct symbol *sym = menu->sym;
if (sym->help) if (menu_has_help(menu))
{ {
if (sym->name) { if (sym->name) {
str_printf(&help, "CONFIG_%s:\n\n", sym->name); str_printf(&help, "CONFIG_%s:\n\n", sym->name);
str_append(&help, _(sym->help)); str_append(&help, _(menu_get_help(menu)));
str_append(&help, "\n"); str_append(&help, "\n");
} }
} else { } else {

View File

@ -417,3 +417,15 @@ struct menu *menu_get_parent_menu(struct menu *menu)
return menu; return menu;
} }
bool menu_has_help(struct menu *menu)
{
return menu->help != NULL;
}
const char *menu_get_help(struct menu *menu)
{
if (menu->help)
return menu->help;
else
return "";
}

View File

@ -1041,7 +1041,7 @@ void ConfigInfoView::menuInfo(void)
if (showDebug()) if (showDebug())
debug = debug_info(sym); debug = debug_info(sym);
help = print_filter(_(sym->help)); help = print_filter(_(menu_get_help(menu)));
} else if (menu->prompt) { } else if (menu->prompt) {
head += "<big><b>"; head += "<big><b>";
head += print_filter(_(menu->prompt->text)); head += print_filter(_(menu->prompt->text));

View File

@ -1722,7 +1722,7 @@ yyreduce:
case 83: case 83:
{ {
current_entry->sym->help = (yyvsp[0].string); current_entry->help = (yyvsp[0].string);
;} ;}
break; break;
@ -2280,11 +2280,11 @@ void print_symbol(FILE *out, struct menu *menu)
break; break;
} }
} }
if (sym->help) { if (menu->help) {
int len = strlen(sym->help); int len = strlen(menu->help);
while (sym->help[--len] == '\n') while (menu->help[--len] == '\n')
sym->help[len] = 0; menu->help[len] = 0;
fprintf(out, " help\n%s\n", sym->help); fprintf(out, " help\n%s\n", menu->help);
} }
fputc('\n', out); fputc('\n', out);
} }

View File

@ -402,7 +402,7 @@ help_start: T_HELP T_EOL
help: help_start T_HELPTEXT help: help_start T_HELPTEXT
{ {
current_entry->sym->help = $2; current_entry->help = $2;
}; };
/* depends option */ /* depends option */
@ -649,11 +649,11 @@ void print_symbol(FILE *out, struct menu *menu)
break; break;
} }
} }
if (sym->help) { if (menu->help) {
int len = strlen(sym->help); int len = strlen(menu->help);
while (sym->help[--len] == '\n') while (menu->help[--len] == '\n')
sym->help[len] = 0; menu->help[len] = 0;
fprintf(out, " help\n%s\n", sym->help); fprintf(out, " help\n%s\n", menu->help);
} }
fputc('\n', out); fputc('\n', out);
} }