[PATCH v2 3/3] bootmenu: add reprint check

Daniel Golle daniel at makrotopia.org
Thu Oct 31 20:13:42 CET 2024


On Tue, Oct 29, 2024 at 05:47:22PM +0800, Weijie Gao wrote:
> Record the last active menu item and check if it equals to the
> current selected item before reprint.
> 
> Signed-off-by: Weijie Gao <weijie.gao at mediatek.com>

Reviewed-by: Daniel Golle <daniel at makrotopia.org>
Tested-by: Daniel Golle <daniel at makrotopia.org>

> ---
>  cmd/bootmenu.c | 16 +++++++++++++++-
>  include/menu.h |  1 +
>  2 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
> index c99605f3398..ffa63a4628d 100644
> --- a/cmd/bootmenu.c
> +++ b/cmd/bootmenu.c
> @@ -103,11 +103,13 @@ static char *bootmenu_choice_entry(void *data)
>  
>  		switch (key) {
>  		case BKEY_UP:
> +			menu->last_active = menu->active;
>  			if (menu->active > 0)
>  				--menu->active;
>  			/* no menu key selected, regenerate menu */
>  			return NULL;
>  		case BKEY_DOWN:
> +			menu->last_active = menu->active;
>  			if (menu->active < menu->count - 1)
>  				++menu->active;
>  			/* no menu key selected, regenerate menu */
> @@ -133,6 +135,17 @@ static char *bootmenu_choice_entry(void *data)
>  	return NULL;
>  }
>  
> +static bool bootmenu_need_reprint(void *data)
> +{
> +	struct bootmenu_data *menu = data;
> +	bool need_reprint;
> +
> +	need_reprint = menu->last_active != menu->active;
> +	menu->last_active = menu->active;
> +
> +	return need_reprint;
> +}
> +
>  static void bootmenu_destroy(struct bootmenu_data *menu)
>  {
>  	struct bootmenu_entry *iter = menu->first;
> @@ -332,6 +345,7 @@ static struct bootmenu_data *bootmenu_create(int delay)
>  
>  	menu->delay = delay;
>  	menu->active = 0;
> +	menu->last_active = -1;
>  	menu->first = NULL;
>  
>  	default_str = env_get("bootmenu_default");
> @@ -506,7 +520,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,
> -			   NULL, bootmenu);
> +			   bootmenu_need_reprint, bootmenu);
>  	if (!menu) {
>  		bootmenu_destroy(bootmenu);
>  		return BOOTMENU_RET_FAIL;
> diff --git a/include/menu.h b/include/menu.h
> index 79643af272b..6cede89b950 100644
> --- a/include/menu.h
> +++ b/include/menu.h
> @@ -40,6 +40,7 @@ int menu_show(int bootdelay);
>  struct bootmenu_data {
>  	int delay;			/* delay for autoboot */
>  	int active;			/* active menu entry */
> +	int last_active;		/* last active menu entry */
>  	int count;			/* total count of menu entries */
>  	struct bootmenu_entry *first;	/* first menu entry */
>  };
> -- 
> 2.45.2
> 


More information about the U-Boot mailing list