diff options
Diffstat (limited to 'scripts/kconfig/menu.c')
| -rw-r--r-- | scripts/kconfig/menu.c | 53 | 
1 files changed, 44 insertions, 9 deletions
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 8c2a97e60fa..a3cade659f8 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -507,10 +507,12 @@ const char *menu_get_help(struct menu *menu)  		return "";  } -static void get_prompt_str(struct gstr *r, struct property *prop) +static void get_prompt_str(struct gstr *r, struct property *prop, +			   struct jk_head *head)  {  	int i, j; -	struct menu *submenu[8], *menu; +	struct menu *submenu[8], *menu, *location = NULL; +	struct jump_key *jump;  	str_printf(r, _("Prompt: %s\n"), _(prop->text));  	str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name, @@ -521,13 +523,43 @@ static void get_prompt_str(struct gstr *r, struct property *prop)  		str_append(r, "\n");  	}  	menu = prop->menu->parent; -	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) +	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { +		bool accessible = menu_is_visible(menu); +  		submenu[i++] = menu; +		if (location == NULL && accessible) +			location = menu; +	} +	if (head && location) { +		jump = malloc(sizeof(struct jump_key)); + +		if (menu_is_visible(prop->menu)) { +			/* +			 * There is not enough room to put the hint at the +			 * beginning of the "Prompt" line. Put the hint on the +			 * last "Location" line even when it would belong on +			 * the former. +			 */ +			jump->target = prop->menu; +		} else +			jump->target = location; + +		if (CIRCLEQ_EMPTY(head)) +			jump->index = 0; +		else +			jump->index = CIRCLEQ_LAST(head)->index + 1; + +		CIRCLEQ_INSERT_TAIL(head, jump, entries); +	} +  	if (i > 0) {  		str_printf(r, _("  Location:\n"));  		for (j = 4; --i >= 0; j += 2) {  			menu = submenu[i]; -			str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu))); +			if (head && location && menu == location) +				jump->offset = r->len - 1; +			str_printf(r, "%*c-> %s", j, ' ', +				   _(menu_get_prompt(menu)));  			if (menu->sym) {  				str_printf(r, " (%s [=%s])", menu->sym->name ?  					menu->sym->name : _("<choice>"), @@ -538,7 +570,10 @@ static void get_prompt_str(struct gstr *r, struct property *prop)  	}  } -void get_symbol_str(struct gstr *r, struct symbol *sym) +/* + * head is optional and may be NULL + */ +void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head)  {  	bool hit;  	struct property *prop; @@ -557,7 +592,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym)  		}  	}  	for_all_prompts(sym, prop) -		get_prompt_str(r, prop); +		get_prompt_str(r, prop, head);  	hit = false;  	for_all_properties(sym, prop, P_SELECT) {  		if (!hit) { @@ -577,14 +612,14 @@ void get_symbol_str(struct gstr *r, struct symbol *sym)  	str_append(r, "\n\n");  } -struct gstr get_relations_str(struct symbol **sym_arr) +struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head)  {  	struct symbol *sym;  	struct gstr res = str_new();  	int i;  	for (i = 0; sym_arr && (sym = sym_arr[i]); i++) -		get_symbol_str(&res, sym); +		get_symbol_str(&res, sym, head);  	if (!i)  		str_append(&res, _("No matches found.\n"));  	return res; @@ -603,5 +638,5 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help)  	}  	str_printf(help, "%s\n", _(help_text));  	if (sym) -		get_symbol_str(help, sym); +		get_symbol_str(help, sym, NULL);  }  |