From 72c3e74a3e87ada13732f812b123bb33ff174c03 Mon Sep 17 00:00:00 2001 From: Benjamin Poirier Date: Thu, 23 Aug 2012 14:55:08 -0400 Subject: [PATCH] menuconfig: Assign jump keys per-page instead of globally At the moment, keys 1-9 are assigned to the first 9 search results. This patch makes them assigned to the first 9 results per-page instead. We are much less likely to run out of keys that way. Signed-off-by: Benjamin Poirier Signed-off-by: Michal Marek Signed-off-by: Christian Lamparter --- config/expr.h | 9 ++++++++ config/lkc_proto.h | 8 +++---- config/menu.c | 54 ++++++++++++++++++++++++---------------------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/config/expr.h b/config/expr.h index 52f4246..bd2e098 100644 --- a/config/expr.h +++ b/config/expr.h @@ -12,6 +12,7 @@ extern "C" { #include #include +#include #ifndef __cplusplus #include #endif @@ -173,6 +174,14 @@ struct menu { #define MENU_CHANGED 0x0001 #define MENU_ROOT 0x0002 +struct jump_key { + CIRCLEQ_ENTRY(jump_key) entries; + size_t offset; + struct menu *target; + int index; +}; +CIRCLEQ_HEAD(jk_head, jump_key); + #define JUMP_NB 9 extern struct file *file_list; diff --git a/config/lkc_proto.h b/config/lkc_proto.h index 946c2cb..1d1c085 100644 --- a/config/lkc_proto.h +++ b/config/lkc_proto.h @@ -21,10 +21,10 @@ P(menu_get_root_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)); -P(get_symbol_str, int, (struct gstr *r, struct symbol *sym, struct menu - **jumps, int jump_nb)); -P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct menu - **jumps)); +P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct jk_head + *head)); +P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct jk_head + *head)); P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); /* symbol.c */ diff --git a/config/menu.c b/config/menu.c index a524185..a3cade6 100644 --- a/config/menu.c +++ b/config/menu.c @@ -507,12 +507,12 @@ const char *menu_get_help(struct menu *menu) return ""; } -static int get_prompt_str(struct gstr *r, struct property *prop, struct menu - **jumps, int jump_nb) +static void get_prompt_str(struct gstr *r, struct property *prop, + struct jk_head *head) { int i, j; - char header[4]; 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, @@ -530,7 +530,9 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu if (location == NULL && accessible) location = menu; } - if (jumps && jump_nb < JUMP_NB && location) { + 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 @@ -538,19 +540,26 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu * last "Location" line even when it would belong on * the former. */ - jumps[jump_nb] = prop->menu; + jump->target = prop->menu; } else - jumps[jump_nb] = location; - snprintf(header, 4, "(%d)", jump_nb + 1); - } else - location = NULL; + 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 = 1; --i >= 0; j += 2) { + for (j = 4; --i >= 0; j += 2) { menu = submenu[i]; - str_printf(r, "%s%*c-> %s", menu == location ? header - : " ", 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 : _(""), @@ -559,20 +568,15 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu str_append(r, "\n"); } } - - return location ? 1 : 0; } /* - * jumps is optional and may be NULL - * returns the number of jumps inserted + * head is optional and may be NULL */ -int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps, - int jump_nb) +void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) { bool hit; struct property *prop; - int i = 0; if (sym && sym->name) { str_printf(r, "Symbol: %s [=%s]\n", sym->name, @@ -588,7 +592,7 @@ int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps, } } for_all_prompts(sym, prop) - i += get_prompt_str(r, prop, jumps, jump_nb + i); + get_prompt_str(r, prop, head); hit = false; for_all_properties(sym, prop, P_SELECT) { if (!hit) { @@ -606,18 +610,16 @@ int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps, str_append(r, "\n"); } str_append(r, "\n\n"); - - return i; } -struct gstr get_relations_str(struct symbol **sym_arr, struct menu **jumps) +struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head) { struct symbol *sym; struct gstr res = str_new(); - int i, jump_nb = 0; + int i; for (i = 0; sym_arr && (sym = sym_arr[i]); i++) - jump_nb += get_symbol_str(&res, sym, jumps, jump_nb); + get_symbol_str(&res, sym, head); if (!i) str_append(&res, _("No matches found.\n")); return res; @@ -636,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, NULL, 0); + get_symbol_str(help, sym, NULL); } -- 2.31.1