summaryrefslogtreecommitdiff
path: root/boot/scene.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-06-01 19:22:58 +0300
committerTom Rini <trini@konsulko.com>2023-07-14 19:54:51 +0300
commit4c87e073a4573159f97eb4ed80ec4088f33c7008 (patch)
tree52fb7976fe76163d61eb860c78bd16e00f87557a /boot/scene.c
parent756c9559e60a0ef8434128205adced937240925d (diff)
downloadu-boot-4c87e073a4573159f97eb4ed80ec4088f33c7008.tar.xz
expo: Draw the current opened menu on top
When a menu is opened, it must be displayed over all other objects in the scene, so that all its items are visible. Handle this by drawing the menu object a second time, after all other objects have been drawn. Draw all of the objects which are dependent on the menu object. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'boot/scene.c')
-rw-r--r--boot/scene.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/boot/scene.c b/boot/scene.c
index fb199ef295..bc213bc08b 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -421,6 +421,30 @@ int scene_arrange(struct scene *scn)
return 0;
}
+int scene_render_deps(struct scene *scn, uint id)
+{
+ struct scene_obj *obj;
+ int ret;
+
+ if (!id)
+ return 0;
+ obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
+ if (!obj)
+ return log_msg_ret("obj", -ENOENT);
+
+ if (!(obj->flags & SCENEOF_HIDE)) {
+ ret = scene_obj_render(obj, false);
+ if (ret && ret != -ENOTSUPP)
+ return log_msg_ret("ren", ret);
+
+ if (obj->type == SCENEOBJT_MENU)
+ scene_menu_render_deps(scn,
+ (struct scene_obj_menu *)obj);
+ }
+
+ return 0;
+}
+
int scene_render(struct scene *scn)
{
struct expo *exp = scn->expo;
@@ -435,6 +459,13 @@ int scene_render(struct scene *scn)
}
}
+ /* render any highlighted object on top of the others */
+ if (scn->highlight_id && !exp->text_mode) {
+ ret = scene_render_deps(scn, scn->highlight_id);
+ if (ret && ret != -ENOTSUPP)
+ return log_msg_ret("dep", ret);
+ }
+
return 0;
}