]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
menu: add support to check if menu needs to be reprinted
authorWeijie Gao <weijie.gao@mediatek.com>
Tue, 29 Oct 2024 09:47:16 +0000 (17:47 +0800)
committerTom Rini <trini@konsulko.com>
Mon, 4 Nov 2024 22:41:38 +0000 (16:41 -0600)
This patch adds a new callback named need_reprint for menu.
The need_reprint will be called before printing the menu. If the
callback exists and returns FALSE, menu printing will be canceled.

This is very useful if the menu was not changed. It can save time
for serial-based menu to handle more input data.

Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
Reviewed-by: Daniel Golle <daniel@makrotopia.org>
Tested-by: Daniel Golle <daniel@makrotopia.org>
boot/pxe_utils.c
cmd/bootmenu.c
cmd/eficonfig.c
common/menu.c
include/menu.h

index d6a4b2cb8594aba13d7136ee84204e7bb10bab97..3ae17553c6d51408b916adc3029135e250db2096 100644 (file)
@@ -1474,7 +1474,7 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg)
         * Create a menu and add items for all the labels.
         */
        m = menu_create(cfg->title, DIV_ROUND_UP(cfg->timeout, 10),
-                       cfg->prompt, NULL, label_print, NULL, NULL);
+                       cfg->prompt, NULL, label_print, NULL, NULL, NULL);
        if (!m)
                return NULL;
 
index 977a04b7d7697f56cf49a4b03f91f2449d956346..c99605f33989aad5ec5016cb0ec3b0694d512308 100644 (file)
@@ -506,7 +506,7 @@ static enum bootmenu_ret bootmenu_show(int delay)
 
        menu = menu_create(NULL, bootmenu->delay, 1, menu_display_statusline,
                           bootmenu_print_entry, bootmenu_choice_entry,
-                          bootmenu);
+                          NULL, bootmenu);
        if (!menu) {
                bootmenu_destroy(bootmenu);
                return BOOTMENU_RET_FAIL;
index 029180250f0523872c8c8c7e07a01c72678fe10b..e08b6ba4a5db4889bb2060c2029f8c1cb56be727 100644 (file)
@@ -443,7 +443,7 @@ efi_status_t eficonfig_process_common(struct efimenu *efi_menu,
                efi_menu->menu_desc = menu_desc;
 
        menu = menu_create(NULL, 0, 1, display_statusline, item_data_print,
-                          item_choice, efi_menu);
+                          item_choice, NULL, efi_menu);
        if (!menu)
                return EFI_INVALID_PARAMETER;
 
index 48ab7f0f398c6a10fd3a01a08aca02f013dc4c44..5a2126aa01a10244397fab9137e43497b1e027be 100644 (file)
@@ -43,6 +43,7 @@ struct menu {
        void (*display_statusline)(struct menu *);
        void (*item_data_print)(void *);
        char *(*item_choice)(void *);
+       bool (*need_reprint)(void *);
        void *item_choice_data;
        struct list_head items;
        int item_cnt;
@@ -117,6 +118,11 @@ static inline void *menu_item_destroy(struct menu *m,
  */
 static inline void menu_display(struct menu *m)
 {
+       if (m->need_reprint) {
+               if (!m->need_reprint(m->item_choice_data))
+                       return;
+       }
+
        if (m->title) {
                puts(m->title);
                putc('\n');
@@ -362,6 +368,9 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
  * item. Returns a key string corresponding to the chosen item or NULL if
  * no item has been selected.
  *
+ * need_reprint - If not NULL, will be called before printing the menu.
+ * Returning FALSE means the menu does not need reprint.
+ *
  * item_choice_data - Will be passed as the argument to the item_choice function
  *
  * Returns a pointer to the menu if successful, or NULL if there is
@@ -371,6 +380,7 @@ struct menu *menu_create(char *title, int timeout, int prompt,
                                void (*display_statusline)(struct menu *),
                                void (*item_data_print)(void *),
                                char *(*item_choice)(void *),
+                               bool (*need_reprint)(void *),
                                void *item_choice_data)
 {
        struct menu *m;
@@ -386,6 +396,7 @@ struct menu *menu_create(char *title, int timeout, int prompt,
        m->display_statusline = display_statusline;
        m->item_data_print = item_data_print;
        m->item_choice = item_choice;
+       m->need_reprint = need_reprint;
        m->item_choice_data = item_choice_data;
        m->item_cnt = 0;
 
index 6571c39b1430f4a16ac78439163ab2bd55bc1b56..79643af272bb9c704b6d139245a4796931a90f47 100644 (file)
@@ -13,6 +13,7 @@ struct menu *menu_create(char *title, int timeout, int prompt,
                                void (*display_statusline)(struct menu *),
                                void (*item_data_print)(void *),
                                char *(*item_choice)(void *),
+                               bool (*need_reprint)(void *),
                                void *item_choice_data);
 int menu_default_set(struct menu *m, char *item_key);
 int menu_get_choice(struct menu *m, void **choice);