diff options
-rw-r--r-- | scripts/kconfig/expr.h | 2 | ||||
-rw-r--r-- | scripts/kconfig/lkc_proto.h | 6 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 64 | ||||
-rw-r--r-- | scripts/kconfig/menu.c | 55 | ||||
-rw-r--r-- | scripts/kconfig/nconf.c | 2 |
5 files changed, 94 insertions, 35 deletions
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index d4ecce8bc3a6..52f4246bd34d 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h | |||
@@ -173,6 +173,8 @@ struct menu { | |||
173 | #define MENU_CHANGED 0x0001 | 173 | #define MENU_CHANGED 0x0001 |
174 | #define MENU_ROOT 0x0002 | 174 | #define MENU_ROOT 0x0002 |
175 | 175 | ||
176 | #define JUMP_NB 9 | ||
177 | |||
176 | extern struct file *file_list; | 178 | extern struct file *file_list; |
177 | extern struct file *current_file; | 179 | extern struct file *current_file; |
178 | struct file *lookup_file(const char *name); | 180 | struct file *lookup_file(const char *name); |
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 47fe9c340f9a..946c2cb367f9 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h | |||
@@ -21,8 +21,10 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu)); | |||
21 | P(menu_get_parent_menu,struct menu *,(struct menu *menu)); | 21 | P(menu_get_parent_menu,struct menu *,(struct menu *menu)); |
22 | P(menu_has_help,bool,(struct menu *menu)); | 22 | P(menu_has_help,bool,(struct menu *menu)); |
23 | P(menu_get_help,const char *,(struct menu *menu)); | 23 | P(menu_get_help,const char *,(struct menu *menu)); |
24 | P(get_symbol_str, void, (struct gstr *r, struct symbol *sym)); | 24 | P(get_symbol_str, int, (struct gstr *r, struct symbol *sym, struct menu |
25 | P(get_relations_str, struct gstr, (struct symbol **sym_arr)); | 25 | **jumps, int jump_nb)); |
26 | P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct menu | ||
27 | **jumps)); | ||
26 | P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); | 28 | P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); |
27 | 29 | ||
28 | /* symbol.c */ | 30 | /* symbol.c */ |
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index b3a37c2b16ae..6f409745b373 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c | |||
@@ -236,16 +236,19 @@ search_help[] = N_( | |||
236 | "Result:\n" | 236 | "Result:\n" |
237 | "-----------------------------------------------------------------\n" | 237 | "-----------------------------------------------------------------\n" |
238 | "Symbol: FOO [=m]\n" | 238 | "Symbol: FOO [=m]\n" |
239 | "Type : tristate\n" | ||
239 | "Prompt: Foo bus is used to drive the bar HW\n" | 240 | "Prompt: Foo bus is used to drive the bar HW\n" |
240 | "Defined at drivers/pci/Kconfig:47\n" | 241 | " Defined at drivers/pci/Kconfig:47\n" |
241 | "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" | 242 | " Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" |
242 | "Location:\n" | 243 | " Location:\n" |
243 | " -> Bus options (PCI, PCMCIA, EISA, ISA)\n" | 244 | " -> Bus options (PCI, PCMCIA, EISA, ISA)\n" |
244 | " -> PCI support (PCI [=y])\n" | 245 | " -> PCI support (PCI [=y])\n" |
245 | " -> PCI access mode (<choice> [=y])\n" | 246 | "(1) -> PCI access mode (<choice> [=y])\n" |
246 | "Selects: LIBCRC32\n" | 247 | " Selects: LIBCRC32\n" |
247 | "Selected by: BAR\n" | 248 | " Selected by: BAR\n" |
248 | "-----------------------------------------------------------------\n" | 249 | "-----------------------------------------------------------------\n" |
250 | "o The line 'Type:' shows the type of the configuration option for\n" | ||
251 | " this symbol (boolean, tristate, string, ...)\n" | ||
249 | "o The line 'Prompt:' shows the text used in the menu structure for\n" | 252 | "o The line 'Prompt:' shows the text used in the menu structure for\n" |
250 | " this symbol\n" | 253 | " this symbol\n" |
251 | "o The 'Defined at' line tell at what file / line number the symbol\n" | 254 | "o The 'Defined at' line tell at what file / line number the symbol\n" |
@@ -254,8 +257,12 @@ search_help[] = N_( | |||
254 | " this symbol to be visible in the menu (selectable)\n" | 257 | " this symbol to be visible in the menu (selectable)\n" |
255 | "o The 'Location:' lines tell where in the menu structure this symbol\n" | 258 | "o The 'Location:' lines tell where in the menu structure this symbol\n" |
256 | " is located\n" | 259 | " is located\n" |
257 | " A location followed by a [=y] indicate that this is a selectable\n" | 260 | " A location followed by a [=y] indicates that this is a\n" |
258 | " menu item - and current value is displayed inside brackets.\n" | 261 | " selectable menu item - and the current value is displayed inside\n" |
262 | " brackets.\n" | ||
263 | " Press the key in the (#) prefix to jump directly to that\n" | ||
264 | " location. You will be returned to the current search results\n" | ||
265 | " after exiting this new menu.\n" | ||
259 | "o The 'Selects:' line tell what symbol will be automatically\n" | 266 | "o The 'Selects:' line tell what symbol will be automatically\n" |
260 | " selected if this symbol is selected (y or m)\n" | 267 | " selected if this symbol is selected (y or m)\n" |
261 | "o The 'Selected by' line tell what symbol has selected this symbol\n" | 268 | "o The 'Selected by' line tell what symbol has selected this symbol\n" |
@@ -274,7 +281,7 @@ static int child_count; | |||
274 | static int single_menu_mode; | 281 | static int single_menu_mode; |
275 | static int show_all_options; | 282 | static int show_all_options; |
276 | 283 | ||
277 | static void conf(struct menu *menu); | 284 | static void conf(struct menu *menu, struct menu *active_menu); |
278 | static void conf_choice(struct menu *menu); | 285 | static void conf_choice(struct menu *menu); |
279 | static void conf_string(struct menu *menu); | 286 | static void conf_string(struct menu *menu); |
280 | static void conf_load(void); | 287 | static void conf_load(void); |
@@ -308,7 +315,9 @@ static void search_conf(void) | |||
308 | struct symbol **sym_arr; | 315 | struct symbol **sym_arr; |
309 | struct gstr res; | 316 | struct gstr res; |
310 | char *dialog_input; | 317 | char *dialog_input; |
311 | int dres; | 318 | int dres, vscroll = 0, hscroll = 0; |
319 | bool again; | ||
320 | |||
312 | again: | 321 | again: |
313 | dialog_clear(); | 322 | dialog_clear(); |
314 | dres = dialog_inputbox(_("Search Configuration Parameter"), | 323 | dres = dialog_inputbox(_("Search Configuration Parameter"), |
@@ -331,10 +340,24 @@ again: | |||
331 | dialog_input += strlen(CONFIG_); | 340 | dialog_input += strlen(CONFIG_); |
332 | 341 | ||
333 | sym_arr = sym_re_search(dialog_input); | 342 | sym_arr = sym_re_search(dialog_input); |
334 | res = get_relations_str(sym_arr); | 343 | do { |
344 | struct menu *jumps[JUMP_NB] = {0}; | ||
345 | int keys[JUMP_NB + 1] = {0}, i; | ||
346 | |||
347 | res = get_relations_str(sym_arr, jumps); | ||
348 | for (i = 0; i < JUMP_NB && jumps[i]; i++) | ||
349 | keys[i] = '1' + i; | ||
350 | dres = show_textbox_ext(_("Search Results"), str_get(&res), 0, | ||
351 | 0, keys, &vscroll, &hscroll); | ||
352 | again = false; | ||
353 | for (i = 0; i < JUMP_NB && jumps[i]; i++) | ||
354 | if (dres == keys[i]) { | ||
355 | conf(jumps[i]->parent, jumps[i]); | ||
356 | again = true; | ||
357 | } | ||
358 | str_free(&res); | ||
359 | } while (again); | ||
335 | free(sym_arr); | 360 | free(sym_arr); |
336 | show_textbox(_("Search Results"), str_get(&res), 0, 0); | ||
337 | str_free(&res); | ||
338 | } | 361 | } |
339 | 362 | ||
340 | static void build_conf(struct menu *menu) | 363 | static void build_conf(struct menu *menu) |
@@ -515,12 +538,11 @@ conf_childs: | |||
515 | indent -= doint; | 538 | indent -= doint; |
516 | } | 539 | } |
517 | 540 | ||
518 | static void conf(struct menu *menu) | 541 | static void conf(struct menu *menu, struct menu *active_menu) |
519 | { | 542 | { |
520 | struct menu *submenu; | 543 | struct menu *submenu; |
521 | const char *prompt = menu_get_prompt(menu); | 544 | const char *prompt = menu_get_prompt(menu); |
522 | struct symbol *sym; | 545 | struct symbol *sym; |
523 | struct menu *active_menu = NULL; | ||
524 | int res; | 546 | int res; |
525 | int s_scroll = 0; | 547 | int s_scroll = 0; |
526 | 548 | ||
@@ -563,13 +585,13 @@ static void conf(struct menu *menu) | |||
563 | if (single_menu_mode) | 585 | if (single_menu_mode) |
564 | submenu->data = (void *) (long) !submenu->data; | 586 | submenu->data = (void *) (long) !submenu->data; |
565 | else | 587 | else |
566 | conf(submenu); | 588 | conf(submenu, NULL); |
567 | break; | 589 | break; |
568 | case 't': | 590 | case 't': |
569 | if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) | 591 | if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) |
570 | conf_choice(submenu); | 592 | conf_choice(submenu); |
571 | else if (submenu->prompt->type == P_MENU) | 593 | else if (submenu->prompt->type == P_MENU) |
572 | conf(submenu); | 594 | conf(submenu, NULL); |
573 | break; | 595 | break; |
574 | case 's': | 596 | case 's': |
575 | conf_string(submenu); | 597 | conf_string(submenu); |
@@ -608,7 +630,7 @@ static void conf(struct menu *menu) | |||
608 | if (item_is_tag('t')) | 630 | if (item_is_tag('t')) |
609 | sym_toggle_tristate_value(sym); | 631 | sym_toggle_tristate_value(sym); |
610 | else if (item_is_tag('m')) | 632 | else if (item_is_tag('m')) |
611 | conf(submenu); | 633 | conf(submenu, NULL); |
612 | break; | 634 | break; |
613 | case 7: | 635 | case 7: |
614 | search_conf(); | 636 | search_conf(); |
@@ -877,7 +899,7 @@ int main(int ac, char **av) | |||
877 | 899 | ||
878 | set_config_filename(conf_get_configname()); | 900 | set_config_filename(conf_get_configname()); |
879 | do { | 901 | do { |
880 | conf(&rootmenu); | 902 | conf(&rootmenu, NULL); |
881 | res = handle_exit(); | 903 | res = handle_exit(); |
882 | } while (res == KEY_ESC); | 904 | } while (res == KEY_ESC); |
883 | 905 | ||
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 8c2a97e60faf..a5241859326a 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c | |||
@@ -507,10 +507,12 @@ const char *menu_get_help(struct menu *menu) | |||
507 | return ""; | 507 | return ""; |
508 | } | 508 | } |
509 | 509 | ||
510 | static void get_prompt_str(struct gstr *r, struct property *prop) | 510 | static int get_prompt_str(struct gstr *r, struct property *prop, struct menu |
511 | **jumps, int jump_nb) | ||
511 | { | 512 | { |
512 | int i, j; | 513 | int i, j; |
513 | struct menu *submenu[8], *menu; | 514 | char header[4]; |
515 | struct menu *submenu[8], *menu, *location = NULL; | ||
514 | 516 | ||
515 | str_printf(r, _("Prompt: %s\n"), _(prop->text)); | 517 | str_printf(r, _("Prompt: %s\n"), _(prop->text)); |
516 | str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name, | 518 | str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name, |
@@ -521,13 +523,34 @@ static void get_prompt_str(struct gstr *r, struct property *prop) | |||
521 | str_append(r, "\n"); | 523 | str_append(r, "\n"); |
522 | } | 524 | } |
523 | menu = prop->menu->parent; | 525 | menu = prop->menu->parent; |
524 | for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) | 526 | for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { |
527 | bool accessible = menu_is_visible(menu); | ||
528 | |||
525 | submenu[i++] = menu; | 529 | submenu[i++] = menu; |
530 | if (location == NULL && accessible) | ||
531 | location = menu; | ||
532 | } | ||
533 | if (jumps && jump_nb < JUMP_NB && location) { | ||
534 | if (menu_is_visible(prop->menu)) { | ||
535 | /* | ||
536 | * There is not enough room to put the hint at the | ||
537 | * beginning of the "Prompt" line. Put the hint on the | ||
538 | * last "Location" line even when it would belong on | ||
539 | * the former. | ||
540 | */ | ||
541 | jumps[jump_nb] = prop->menu; | ||
542 | } else | ||
543 | jumps[jump_nb] = location; | ||
544 | snprintf(header, 4, "(%d)", jump_nb + 1); | ||
545 | } else | ||
546 | location = NULL; | ||
547 | |||
526 | if (i > 0) { | 548 | if (i > 0) { |
527 | str_printf(r, _(" Location:\n")); | 549 | str_printf(r, _(" Location:\n")); |
528 | for (j = 4; --i >= 0; j += 2) { | 550 | for (j = 1; --i >= 0; j += 2) { |
529 | menu = submenu[i]; | 551 | menu = submenu[i]; |
530 | str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu))); | 552 | str_printf(r, "%s%*c-> %s", menu == location ? header |
553 | : " ", j, ' ', _(menu_get_prompt(menu))); | ||
531 | if (menu->sym) { | 554 | if (menu->sym) { |
532 | str_printf(r, " (%s [=%s])", menu->sym->name ? | 555 | str_printf(r, " (%s [=%s])", menu->sym->name ? |
533 | menu->sym->name : _("<choice>"), | 556 | menu->sym->name : _("<choice>"), |
@@ -536,12 +559,20 @@ static void get_prompt_str(struct gstr *r, struct property *prop) | |||
536 | str_append(r, "\n"); | 559 | str_append(r, "\n"); |
537 | } | 560 | } |
538 | } | 561 | } |
562 | |||
563 | return location ? 1 : 0; | ||
539 | } | 564 | } |
540 | 565 | ||
541 | void get_symbol_str(struct gstr *r, struct symbol *sym) | 566 | /* |
567 | * jumps is optional and may be NULL | ||
568 | * returns the number of jumps inserted | ||
569 | */ | ||
570 | int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps, | ||
571 | int jump_nb) | ||
542 | { | 572 | { |
543 | bool hit; | 573 | bool hit; |
544 | struct property *prop; | 574 | struct property *prop; |
575 | int i = 0; | ||
545 | 576 | ||
546 | if (sym && sym->name) { | 577 | if (sym && sym->name) { |
547 | str_printf(r, "Symbol: %s [=%s]\n", sym->name, | 578 | str_printf(r, "Symbol: %s [=%s]\n", sym->name, |
@@ -557,7 +588,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym) | |||
557 | } | 588 | } |
558 | } | 589 | } |
559 | for_all_prompts(sym, prop) | 590 | for_all_prompts(sym, prop) |
560 | get_prompt_str(r, prop); | 591 | i += get_prompt_str(r, prop, jumps, jump_nb + i); |
561 | hit = false; | 592 | hit = false; |
562 | for_all_properties(sym, prop, P_SELECT) { | 593 | for_all_properties(sym, prop, P_SELECT) { |
563 | if (!hit) { | 594 | if (!hit) { |
@@ -575,16 +606,18 @@ void get_symbol_str(struct gstr *r, struct symbol *sym) | |||
575 | str_append(r, "\n"); | 606 | str_append(r, "\n"); |
576 | } | 607 | } |
577 | str_append(r, "\n\n"); | 608 | str_append(r, "\n\n"); |
609 | |||
610 | return i; | ||
578 | } | 611 | } |
579 | 612 | ||
580 | struct gstr get_relations_str(struct symbol **sym_arr) | 613 | struct gstr get_relations_str(struct symbol **sym_arr, struct menu **jumps) |
581 | { | 614 | { |
582 | struct symbol *sym; | 615 | struct symbol *sym; |
583 | struct gstr res = str_new(); | 616 | struct gstr res = str_new(); |
584 | int i; | 617 | int i, jump_nb = 0; |
585 | 618 | ||
586 | for (i = 0; sym_arr && (sym = sym_arr[i]); i++) | 619 | for (i = 0; sym_arr && (sym = sym_arr[i]); i++) |
587 | get_symbol_str(&res, sym); | 620 | jump_nb += get_symbol_str(&res, sym, jumps, jump_nb); |
588 | if (!i) | 621 | if (!i) |
589 | str_append(&res, _("No matches found.\n")); | 622 | str_append(&res, _("No matches found.\n")); |
590 | return res; | 623 | return res; |
@@ -603,5 +636,5 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help) | |||
603 | } | 636 | } |
604 | str_printf(help, "%s\n", _(help_text)); | 637 | str_printf(help, "%s\n", _(help_text)); |
605 | if (sym) | 638 | if (sym) |
606 | get_symbol_str(help, sym); | 639 | get_symbol_str(help, sym, NULL, 0); |
607 | } | 640 | } |
diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index 1704a8562a5d..87d4b15da951 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c | |||
@@ -721,7 +721,7 @@ again: | |||
721 | dialog_input += strlen(CONFIG_); | 721 | dialog_input += strlen(CONFIG_); |
722 | 722 | ||
723 | sym_arr = sym_re_search(dialog_input); | 723 | sym_arr = sym_re_search(dialog_input); |
724 | res = get_relations_str(sym_arr); | 724 | res = get_relations_str(sym_arr, NULL); |
725 | free(sym_arr); | 725 | free(sym_arr); |
726 | show_scroll_win(main_window, | 726 | show_scroll_win(main_window, |
727 | _("Search Results"), str_get(&res)); | 727 | _("Search Results"), str_get(&res)); |