expo: Avoid automatically arranging the scene
authorSimon Glass <sjg@chromium.org>
Thu, 1 Jun 2023 16:22:35 +0000 (10:22 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 14 Jul 2023 16:54:51 +0000 (12:54 -0400)
This should ideally be done once after all scene changes have been made.
Require an explicit call when everything is ready.

Always arrange after a key it sent, just for convenience.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/bootflow_menu.c
boot/expo.c
boot/scene.c
boot/scene_menu.c
test/boot/expo.c

index 7f06dac..de0f445 100644 (file)
@@ -124,6 +124,10 @@ int bootflow_menu_new(struct expo **expp)
                priv->num_bootflows++;
        }
 
+       ret = scene_arrange(scn);
+       if (ret)
+               return log_msg_ret("arr", ret);
+
        *expp = exp;
 
        return 0;
index cd1b1a3..bfdda95 100644 (file)
@@ -116,8 +116,16 @@ struct scene *expo_lookup_scene_id(struct expo *exp, uint scene_id)
 
 int expo_set_scene_id(struct expo *exp, uint scene_id)
 {
-       if (!expo_lookup_scene_id(exp, scene_id))
+       struct scene *scn;
+       int ret;
+
+       scn = expo_lookup_scene_id(exp, scene_id);
+       if (!scn)
                return log_msg_ret("id", -ENOENT);
+       ret = scene_arrange(scn);
+       if (ret)
+               return log_msg_ret("arr", ret);
+
        exp->scene_id = scene_id;
 
        return 0;
@@ -165,6 +173,11 @@ int expo_send_key(struct expo *exp, int key)
                ret = scene_send_key(scn, key, &exp->action);
                if (ret)
                        return log_msg_ret("key", ret);
+
+               /* arrange it to get any changes */
+               ret = scene_arrange(scn);
+               if (ret)
+                       return log_msg_ret("arr", ret);
        }
 
        return scn ? 0 : -ECHILD;
index 7e9ba04..1383be2 100644 (file)
@@ -211,8 +211,6 @@ int scene_obj_set_pos(struct scene *scn, uint id, int x, int y)
                return log_msg_ret("find", -ENOENT);
        obj->x = x;
        obj->y = y;
-       if (obj->type == SCENEOBJT_MENU)
-               scene_menu_arrange(scn, (struct scene_obj_menu *)obj);
 
        return 0;
 }
@@ -391,11 +389,6 @@ int scene_send_key(struct scene *scn, int key, struct expo_action *event)
                        ret = scene_menu_send_key(scn, menu, key, event);
                        if (ret)
                                return log_msg_ret("key", ret);
-
-                       /* only allow one menu */
-                       ret = scene_menu_arrange(scn, menu);
-                       if (ret)
-                               return log_msg_ret("arr", ret);
                        break;
                }
        }
index 18998e8..9ee911f 100644 (file)
@@ -158,10 +158,6 @@ int scene_menu(struct scene *scn, const char *name, uint id,
                *menup = menu;
        INIT_LIST_HEAD(&menu->item_head);
 
-       ret = scene_menu_arrange(scn, menu);
-       if (ret)
-               return log_msg_ret("pos", ret);
-
        return menu->obj.id;
 }
 
@@ -258,7 +254,6 @@ int scene_menuitem(struct scene *scn, uint menu_id, const char *name, uint id,
 {
        struct scene_obj_menu *menu;
        struct scene_menitem *item;
-       int ret;
 
        menu = scene_obj_find(scn, menu_id, SCENEOBJT_MENU);
        if (!menu)
@@ -285,10 +280,6 @@ int scene_menuitem(struct scene *scn, uint menu_id, const char *name, uint id,
        item->flags = flags;
        list_add_tail(&item->sibling, &menu->item_head);
 
-       ret = scene_menu_arrange(scn, menu);
-       if (ret)
-               return log_msg_ret("pos", ret);
-
        if (itemp)
                *itemp = item;
 
index 3c0bc78..56a22ba 100644 (file)
@@ -348,7 +348,9 @@ static int expo_object_menu(struct unit_test_state *uts)
        ut_asserteq(desc_id, item->desc_id);
        ut_asserteq(preview_id, item->preview_id);
 
-       /* adding an item should cause the first item to become current */
+       ut_assertok(scene_arrange(scn));
+
+       /* arranging the scene should cause the first item to become current */
        ut_asserteq(id, menu->cur_item_id);
 
        /* the title should be at the top */