[PATCH v2 57/60] expo: Update bootflow_menu_poll() to return a sequence ID
Simon Glass
sjg at chromium.org
Fri May 2 16:46:55 CEST 2025
Rather than returning a bootflow, return the index of the bootflow. This
will allow callers to do their own translation to bootflows or some
other data structure.
Also return a special code when the user tries to move the pointer, so
that the caller can cancel the boot-menu timeout, if this is in use.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
(no changes since v1)
boot/bootflow_menu.c | 32 +++++++++++++-------------------
cmd/bootflow.c | 16 ++++++++++------
include/bootflow.h | 8 ++++----
3 files changed, 27 insertions(+), 29 deletions(-)
diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c
index fb90e51e920..6bca17142ad 100644
--- a/boot/bootflow_menu.c
+++ b/boot/bootflow_menu.c
@@ -301,34 +301,28 @@ int bootflow_menu_start(struct bootstd_priv *std, bool text_mode,
return 0;
}
-int bootflow_menu_poll(struct expo *exp, struct bootflow **bflowp)
+int bootflow_menu_poll(struct expo *exp, int *seqp)
{
struct bootflow *sel_bflow;
struct expo_action act;
- int ret;
+ struct scene *scn;
+ int item, ret;
sel_bflow = NULL;
- *bflowp = NULL;
+
+ scn = expo_lookup_scene_id(exp, exp->scene_id);
+
+ item = scene_menu_get_cur_item(scn, OBJ_MENU);
+ *seqp = item > 0 ? item - ITEM : -1;
ret = expo_poll(exp, &act);
if (ret)
return log_msg_ret("bmp", ret);
switch (act.type) {
- case EXPOACT_SELECT: {
- struct bootflow *bflow;
- int i;
-
- for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36;
- ret = bootflow_next_glob(&bflow), i++) {
- if (i == act.select.id - ITEM) {
- *bflowp = bflow;
- // printf("found %p\n", bflow);
- return 0;
- }
- }
+ case EXPOACT_SELECT:
+ *seqp = act.select.id - ITEM;
break;
- }
case EXPOACT_POINT_ITEM: {
struct scene *scn = expo_lookup_scene_id(exp, MAIN);
@@ -337,13 +331,13 @@ int bootflow_menu_poll(struct expo *exp, struct bootflow **bflowp)
ret = scene_menu_select_item(scn, OBJ_MENU, act.select.id);
if (ret)
return log_msg_ret("bmp", ret);
- break;
+ return -ERESTART;
}
case EXPOACT_QUIT:
return -EPIPE;
default:
- break;
+ return -EAGAIN;
}
- return -EAGAIN;
+ return 0;
}
diff --git a/cmd/bootflow.c b/cmd/bootflow.c
index dda5742db73..6ffb1bd33e1 100644
--- a/cmd/bootflow.c
+++ b/cmd/bootflow.c
@@ -109,18 +109,21 @@ __maybe_unused static int bootflow_handle_menu(struct bootstd_priv *std,
{
struct expo *exp;
struct bootflow *bflow;
- int ret;
+ int ret, seq;
ret = bootflow_menu_start(std, text_mode, &exp);
if (ret)
return log_msg_ret("bhs", ret);
+ ret = -ERESTART;
do {
- ret = expo_render(exp);
- if (ret)
- return log_msg_ret("bhr", ret);
- ret = bootflow_menu_poll(exp, &bflow);
- } while (ret == -EAGAIN);
+ if (ret == -ERESTART) {
+ ret = expo_render(exp);
+ if (ret)
+ return log_msg_ret("bhr", ret);
+ }
+ ret = bootflow_menu_poll(exp, &seq);
+ } while (ret == -EAGAIN || ret == -ERESTART);
if (ret == -EPIPE) {
printf("Nothing chosen\n");
@@ -128,6 +131,7 @@ __maybe_unused static int bootflow_handle_menu(struct bootstd_priv *std,
} else if (ret) {
printf("Menu failed (err=%d)\n", ret);
} else {
+ bflow = alist_getw(&std->bootflows, seq, struct bootflow);
printf("Selected: %s\n", bflow->os_name ? bflow->os_name :
bflow->name);
std->cur_bootflow = bflow;
diff --git a/include/bootflow.h b/include/bootflow.h
index aa46cec4979..8362cbe2e69 100644
--- a/include/bootflow.h
+++ b/include/bootflow.h
@@ -671,10 +671,10 @@ int bootflow_menu_start(struct bootstd_priv *std, bool text_mode,
* bootflow_menu_poll() - Poll a menu for user action
*
* @exp: Expo to poll
- * @bflowp: Returns chosen bootflow (set to NULL if nothing is chosen)
- * Return 0 if a bootflow was chosen, -EAGAIN if nothing is chosen yet, -EPIPE
- * if the user quit
+ * @seqp: Returns the bootflow chosen or currently pointed to (numbered from 0)
+ * Return: 0 if a bootflow was chosen, -EAGAIN if nothing is chosen yet, -EPIPE
+ * if the user quit, -ERESTART if the expo needs refreshing
*/
-int bootflow_menu_poll(struct expo *exp, struct bootflow **bflowp);
+int bootflow_menu_poll(struct expo *exp, int *seqp);
#endif
--
2.43.0
More information about the U-Boot
mailing list