[PATCH v2 27/60] expo: Adjust how menu items are highlighted

Simon Glass sjg at chromium.org
Fri May 2 16:46:25 CEST 2025


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 at chromium.org>
---

(no changes since v1)

 boot/bootflow_menu.c | 10 ++++++++++
 boot/cedit.c         |  9 ++++++++-
 boot/scene_menu.c    |  2 --
 test/boot/expo.c     |  4 ++++
 4 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c
index 268c93ae8e3..f9ebc526200 100644
--- a/boot/bootflow_menu.c
+++ b/boot/bootflow_menu.c
@@ -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:
diff --git a/boot/cedit.c b/boot/cedit.c
index eac851b395a..792ab6d65bd 100644
--- a/boot/cedit.c
+++ b/boot/cedit.c
@@ -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);
diff --git a/boot/scene_menu.c b/boot/scene_menu.c
index 06d7e9fc913..6a2f5b6b93f 100644
--- a/boot/scene_menu.c
+++ b/boot/scene_menu.c
@@ -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;
 }
 
diff --git a/test/boot/expo.c b/test/boot/expo.c
index 616071ead48..b32a4596e85 100644
--- a/test/boot/expo.c
+++ b/test/boot/expo.c
@@ -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");
-- 
2.43.0



More information about the U-Boot mailing list