summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <[email protected]>2025-05-02 08:46:25 -0600
committerSimon Glass <[email protected]>2025-05-30 09:49:32 +0100
commitd01b8e226686d3d8408c190bf0c843eabd858ef7 (patch)
tree45196405e04f959018c47e4d666b11a804fb0afb
parent9f44b544e1d8b23dec51567c657e81488a289d6d (diff)
expo: Adjust how menu items are highlighted
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 <[email protected]>
-rw-r--r--boot/bootflow_menu.c10
-rw-r--r--boot/cedit.c9
-rw-r--r--boot/scene_menu.c2
-rw-r--r--test/boot/expo.c4
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
@@ -589,6 +589,8 @@ static int expo_render_image(struct unit_test_state *uts)
ut_assertok(expo_render(exp));
ut_asserteq(0, scn->highlight_id);
+ ut_assertok(scene_arrange(scn));
+ ut_asserteq(0, scn->highlight_id);
/* move down */
ut_assertok(expo_send_key(exp, BKEY_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");