diff options
-rw-r--r-- | boot/pxe_utils.c | 2 | ||||
-rw-r--r-- | cmd/bootmenu.c | 2 | ||||
-rw-r--r-- | cmd/eficonfig.c | 2 | ||||
-rw-r--r-- | common/menu.c | 11 | ||||
-rw-r--r-- | include/menu.h | 1 |
5 files changed, 15 insertions, 3 deletions
diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index d6a4b2cb859..3ae17553c6d 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -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; diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c index 977a04b7d76..c99605f3398 100644 --- a/cmd/bootmenu.c +++ b/cmd/bootmenu.c @@ -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; diff --git a/cmd/eficonfig.c b/cmd/eficonfig.c index 029180250f0..e08b6ba4a5d 100644 --- a/cmd/eficonfig.c +++ b/cmd/eficonfig.c @@ -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; diff --git a/common/menu.c b/common/menu.c index 48ab7f0f398..5a2126aa01a 100644 --- a/common/menu.c +++ b/common/menu.c @@ -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; diff --git a/include/menu.h b/include/menu.h index 6571c39b143..79643af272b 100644 --- a/include/menu.h +++ b/include/menu.h @@ -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); |