]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
expo: Adjust how menu items are highlighted
authorSimon Glass <sjg@chromium.org>
Fri, 2 May 2025 14:46:25 +0000 (08:46 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 30 May 2025 08:49:32 +0000 (09:49 +0100)
At present when the user moves to a new menu item, the menu code
handles this immediately. This means it is not possible to use an expo
action to effect the same change.

Update this so that EXPOACT_POINT_ITEM is handled in cedit_do_action().

Expand the test to cover this.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/bootflow_menu.c
boot/cedit.c
boot/scene_menu.c
test/boot/expo.c

index 268c93ae8e346bb9f84347de8a63f326b88698f5..f9ebc526200316590cbf8460ef98233718541289 100644 (file)
@@ -180,6 +180,7 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode,
 {
        struct bootflow *sel_bflow;
        struct udevice *dev;
+       struct scene *scn;
        struct expo *exp;
        uint sel_id;
        bool done;
@@ -209,6 +210,9 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode,
        ret = expo_set_scene_id(exp, MAIN);
        if (ret)
                return log_msg_ret("scn", ret);
+       scn = expo_lookup_scene_id(exp, MAIN);
+       if (!scn)
+               return log_msg_ret("scn", -ENOENT);
 
        if (text_mode)
                expo_set_text_mode(exp, text_mode);
@@ -224,6 +228,12 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode,
                                sel_id = act.select.id;
                                done = true;
                                break;
+                       case EXPOACT_POINT_ITEM:
+                               ret = scene_menu_select_item(scn,
+                                               OBJ_MENU, act.select.id);
+                               if (ret)
+                                       return log_msg_ret("bmp", ret);
+                               break;
                        case EXPOACT_QUIT:
                                return -EPIPE;
                        default:
index eac851b395a525e6db71a621178ff52da7d4f6d1..792ab6d65bd02ae421f63e0904c5d6e2aebe76eb 100644 (file)
@@ -148,10 +148,17 @@ int cedit_prepare(struct expo *exp, struct udevice *vid_dev,
 int cedit_do_action(struct expo *exp, struct scene *scn,
                    struct video_priv *vid_priv, struct expo_action *act)
 {
+       int ret;
+
        switch (act->type) {
        case EXPOACT_NONE:
-       case EXPOACT_POINT_ITEM:
                return -EAGAIN;
+       case EXPOACT_POINT_ITEM:
+               ret = scene_menu_select_item(scn, scn->highlight_id,
+                                            act->select.id);
+               if (ret)
+                       return log_msg_ret("cdp", ret);
+               break;
        case EXPOACT_POINT_OBJ:
                scene_set_highlight_id(scn, act->select.id);
                cedit_arange(exp, vid_priv, scn->id);
index 06d7e9fc913a2e96df0fa27deb7cca01436b3e1d..6a2f5b6b93f6c08c4b76d8067d3c3b7e58c0ec40 100644 (file)
@@ -406,8 +406,6 @@ int scene_menu_send_key(struct scene *scn, struct scene_obj_menu *menu, int key,
                break;
        }
 
-       menu_point_to_item(menu, item->id);
-
        return 0;
 }
 
index 616071ead489698a9617262cd9c479eb0da03929..b32a4596e8515a3cfd0d98a987476572714ecf5e 100644 (file)
@@ -588,6 +588,8 @@ static int expo_render_image(struct unit_test_state *uts)
        expo_set_scene_id(exp, SCENE1);
        ut_assertok(expo_render(exp));
 
+       ut_asserteq(0, scn->highlight_id);
+       ut_assertok(scene_arrange(scn));
        ut_asserteq(0, scn->highlight_id);
 
        /* move down */
@@ -599,6 +601,7 @@ static int expo_render_image(struct unit_test_state *uts)
        ut_asserteq(ITEM2, act.select.id);
        ut_assertok(scene_menu_select_item(scn, OBJ_MENU, act.select.id));
        ut_asserteq(ITEM2, scene_menu_get_cur_item(scn, OBJ_MENU));
+       ut_assertok(scene_arrange(scn));
        ut_assertok(expo_render(exp));
 
        /* make sure only the preview for the second item is shown */
@@ -639,6 +642,7 @@ static int expo_render_image(struct unit_test_state *uts)
 
        ut_asserteq(EXPOACT_POINT_ITEM, act.type);
        ut_asserteq(ITEM1, act.select.id);
+       ut_assertok(scene_menu_select_item(scn, OBJ_MENU, act.select.id));
 
        ut_assertok(expo_render(exp));
        ut_assert_nextline("U-Boot    :    Boot Menu");