bootmenu: add reprint check

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@mediatek.com>
Reviewed-by: Daniel Golle <daniel@makrotopia.org>
Tested-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
Weijie Gao 2024-10-29 17:47:22 +08:00 committed by Tom Rini
parent ccdd7948e2
commit 599652cff1
2 changed files with 16 additions and 1 deletions

View file

@ -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;

View file

@ -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 */
};