]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bootmenu: add reprint check
authorWeijie Gao <weijie.gao@mediatek.com>
Tue, 29 Oct 2024 09:47:22 +0000 (17:47 +0800)
committerTom Rini <trini@konsulko.com>
Mon, 4 Nov 2024 22:41:38 +0000 (16:41 -0600)
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>
cmd/bootmenu.c
include/menu.h

index c99605f33989aad5ec5016cb0ec3b0694d512308..ffa63a4628da102c5579bc93bea8870a57d639bf 100644 (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;
index 79643af272bb9c704b6d139245a4796931a90f47..6cede89b950ae4e135f193c8a5e0630a2251e5b9 100644 (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 */
 };