menuconfig: Assign jump keys per-page instead of globally
authorBenjamin Poirier <bpoirier@suse.de>
Thu, 23 Aug 2012 18:55:08 +0000 (14:55 -0400)
committerChristian Lamparter <chunkeey@googlemail.com>
Sat, 15 Dec 2012 21:54:20 +0000 (22:54 +0100)
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 <bpoirier@suse.de>
Signed-off-by: Michal Marek <mmarek@suse.cz>
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
config/expr.h
config/lkc_proto.h
config/menu.c

index 52f4246bd34da608b2b90a7de56270af0b27aab3..bd2e098955532a26a3935e44ad58283598cbf673 100644 (file)
@@ -12,6 +12,7 @@ extern "C" {
 
 #include <assert.h>
 #include <stdio.h>
+#include <sys/queue.h>
 #ifndef __cplusplus
 #include <stdbool.h>
 #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;
index 946c2cb367f9fe1669ecec7767e778e763d7996c..1d1c08537f1e59b2cab76bd88437489fcbea393b 100644 (file)
@@ -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 */
index a5241859326a90cd1828734121c465bd01704b17..a3cade659f89cb5f67828b797ae49b9311bf1d98 100644 (file)
@@ -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 : _("<choice>"),
@@ -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);
 }