From: Daniel Golle <daniel@makrotopia.org>
To: Weijie Gao <weijie.gao@mediatek.com>
Cc: u-boot@lists.denx.de,
GSS_MTK_Uboot_upstream <GSS_MTK_Uboot_upstream@mediatek.com>,
Marek Vasut <marek.vasut+renesas@mailbox.org>,
Tom Rini <trini@konsulko.com>, John Crispin <john@phrozen.org>,
Simon Glass <sjg@chromium.org>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
Ilias Apalodimas <ilias.apalodimas@linaro.org>,
Martyn Welch <martyn.welch@collabora.com>,
Michael Trimarchi <michael@amarulasolutions.com>,
Svyatoslav Ryhel <clamor95@gmail.com>,
Tim Harvey <tharvey@gateworks.com>
Subject: Re: [PATCH v2 2/3] menu: add support to check if menu needs to be reprinted
Date: Thu, 31 Oct 2024 19:13:00 +0000 [thread overview]
Message-ID: <ZyPWvHDdVm92NKoE@pidgin.makrotopia.org> (raw)
In-Reply-To: <7024b1fd05a36d8ce0d9a81697fef2333b85872a.1730194901.git.weijie.gao@mediatek.com>
On Tue, Oct 29, 2024 at 05:47:16PM +0800, Weijie Gao wrote:
> 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 | 2 +-
> cmd/bootmenu.c | 2 +-
> cmd/eficonfig.c | 2 +-
> common/menu.c | 11 +++++++++++
> 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 bea09e4ecc7..498653b778d 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);
> --
> 2.45.2
>
next prev parent reply other threads:[~2024-10-31 19:13 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-29 9:47 [PATCH v2 1/3] menu: fix the logic checking whether ESC key is pressed Weijie Gao
2024-10-29 9:47 ` [PATCH v2 2/3] menu: add support to check if menu needs to be reprinted Weijie Gao
2024-10-31 19:13 ` Daniel Golle [this message]
2024-10-29 9:47 ` [PATCH v2 3/3] bootmenu: add reprint check Weijie Gao
2024-10-31 19:13 ` Daniel Golle
2024-10-31 18:04 ` [PATCH v2 1/3] menu: fix the logic checking whether ESC key is pressed Simon Glass
2024-10-31 19:16 ` Daniel Golle
2024-11-01 7:20 ` Weijie Gao
2024-11-02 22:23 ` Daniel Golle
2024-11-05 1:07 ` Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZyPWvHDdVm92NKoE@pidgin.makrotopia.org \
--to=daniel@makrotopia.org \
--cc=GSS_MTK_Uboot_upstream@mediatek.com \
--cc=clamor95@gmail.com \
--cc=ilias.apalodimas@linaro.org \
--cc=john@phrozen.org \
--cc=marek.vasut+renesas@mailbox.org \
--cc=martyn.welch@collabora.com \
--cc=michael@amarulasolutions.com \
--cc=sjg@chromium.org \
--cc=tharvey@gateworks.com \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=weijie.gao@mediatek.com \
--cc=xypron.glpk@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox