
From: Simon Glass <sjg@chromium.org> The bootflow menu creates an image at position -4, expecting that it will be relative to the right side of the display. With the recently added alignment feature, this is not supported. Update the implementation to calculation the correct position instead. Update the tests to match. Signed-off-by: Simon Glass <sjg@chromium.org> --- boot/scene_menu.c | 16 +++++++++++++++- test/boot/expo.c | 22 +++++++++++----------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/boot/scene_menu.c b/boot/scene_menu.c index 55dde6d2ec2..0ed73cd12cc 100644 --- a/boot/scene_menu.c +++ b/boot/scene_menu.c @@ -227,6 +227,8 @@ int scene_menu_arrange(struct scene *scn, struct expo_arrange_info *arr, const bool stack = exp->popup; const struct expo_theme *theme = &exp->theme; struct scene_menitem *item; + int xsize = 0, ysize = 0; + struct udevice *dev; uint sel_id; int startx, x, y; int ret; @@ -238,6 +240,14 @@ int scene_menu_arrange(struct scene *scn, struct expo_arrange_info *arr, memset(dims, '\0', sizeof(dims)); scene_menu_calc_dims(scn, menu, dims); + dev = scn->expo->display; + if (dev) { + struct video_priv *priv = dev_get_uclass_priv(dev); + + xsize = priv->xsize; + ysize = priv->ysize; + } + startx = menu->obj.req_bbox.x0; y = menu->obj.req_bbox.y0; if (menu->title_id) { @@ -324,13 +334,17 @@ int scene_menu_arrange(struct scene *scn, struct expo_arrange_info *arr, } if (item->preview_id) { + const struct scene_obj *obj; bool hide; /* * put all previews on top of each other, on the right * size of the display */ - ret = scene_obj_set_pos(scn, item->preview_id, -4, y); + obj = scene_obj_find(scn, item->preview_id, + SCENEOBJT_NONE); + ret = scene_obj_set_pos(scn, item->preview_id, + xsize - obj->dims.x - 4, y); if (ret < 0) return log_msg_ret("prev", ret); diff --git a/test/boot/expo.c b/test/boot/expo.c index 9ee2c312f86..0c7230aee7c 100644 --- a/test/boot/expo.c +++ b/test/boot/expo.c @@ -436,7 +436,7 @@ static int expo_object_menu(struct unit_test_state *uts) ut_asserteq(menu->obj.bbox.x0 + 179, desc1->obj.bbox.x0); ut_asserteq(menu->obj.bbox.y0 + 32, desc1->obj.bbox.y0); - ut_asserteq(-4, prev1->obj.bbox.x0); + ut_asserteq(-84, prev1->obj.bbox.x0); ut_asserteq(menu->obj.bbox.y0 + 32, prev1->obj.bbox.y0); ut_asserteq(true, prev1->obj.flags & SCENEOF_HIDE); @@ -690,11 +690,11 @@ static int expo_render_image(struct unit_test_state *uts) ut_assertok(scene_arrange(scn)); ut_asserteq(0, scn->highlight_id); ut_assertok(expo_render(exp)); - ut_asserteq(20366, video_compress_fb(uts, dev, false)); + ut_asserteq(20373, video_compress_fb(uts, dev, false)); ut_assertok(scene_arrange(scn)); ut_assertok(expo_render(exp)); - ut_asserteq(20366, video_compress_fb(uts, dev, false)); + ut_asserteq(20373, video_compress_fb(uts, dev, false)); scene_set_highlight_id(scn, OBJ_MENU); ut_asserteq(OBJ_MENU, scn->highlight_id); @@ -706,7 +706,7 @@ static int expo_render_image(struct unit_test_state *uts) ut_assert(!(obj->flags & SCENEOF_HIDE)); ut_assertok(expo_render(exp)); - ut_asserteq(20366, video_compress_fb(uts, dev, false)); + ut_asserteq(20373, video_compress_fb(uts, dev, false)); /* move down */ ut_assertok(expo_send_key(exp, BKEY_DOWN)); @@ -719,27 +719,27 @@ static int expo_render_image(struct unit_test_state *uts) ut_asserteq(ITEM2, scene_menu_get_cur_item(scn, OBJ_MENU)); ut_assertok(scene_arrange(scn)); ut_assertok(expo_render(exp)); - ut_asserteq(19636, video_compress_fb(uts, dev, false)); + ut_asserteq(19649, video_compress_fb(uts, dev, false)); ut_assertok(video_check_copy_fb(uts, dev)); - /* hide the text editor since the following tets don't need it */ + /* hide the text editor since the following tests don't need it */ scene_obj_set_hide(scn, OBJ_TEXTED, true); /* do some alignment checks */ ut_assertok(scene_obj_set_halign(scn, OBJ_TEXT3, SCENEOA_CENTRE)); ut_assertok(expo_render(exp)); - ut_asserteq(16308, video_compress_fb(uts, dev, false)); + ut_asserteq(16323, video_compress_fb(uts, dev, false)); ut_assertok(scene_obj_set_halign(scn, OBJ_TEXT3, SCENEOA_RIGHT)); ut_assertok(expo_render(exp)); - ut_asserteq(16242, video_compress_fb(uts, dev, false)); + ut_asserteq(16240, video_compress_fb(uts, dev, false)); ut_assertok(scene_obj_set_halign(scn, OBJ_TEXT3, SCENEOA_LEFT)); ut_assertok(scene_obj_set_valign(scn, OBJ_TEXT3, SCENEOA_CENTRE)); ut_assertok(expo_render(exp)); - ut_asserteq(18742, video_compress_fb(uts, dev, false)); + ut_asserteq(18714, video_compress_fb(uts, dev, false)); ut_assertok(scene_obj_set_valign(scn, OBJ_TEXT3, SCENEOA_BOTTOM)); ut_assertok(expo_render(exp)); - ut_asserteq(18663, video_compress_fb(uts, dev, false)); + ut_asserteq(18670, video_compress_fb(uts, dev, false)); /* make sure only the preview for the second item is shown */ obj = scene_obj_find(scn, ITEM1_PREVIEW, SCENEOBJT_NONE); @@ -765,7 +765,7 @@ static int expo_render_image(struct unit_test_state *uts) exp->show_highlight = true; ut_assertok(scene_arrange(scn)); ut_assertok(expo_render(exp)); - ut_asserteq(18842, video_compress_fb(uts, dev, false)); + ut_asserteq(18830, video_compress_fb(uts, dev, false)); /* now try in text mode */ expo_set_text_mode(exp, true); -- 2.43.0