]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
expo: Use flags for objects
authorSimon Glass <sjg@chromium.org>
Thu, 1 Jun 2023 16:22:50 +0000 (10:22 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 14 Jul 2023 16:54:51 +0000 (12:54 -0400)
We currently have just a 'hide' property for each object. In preparation
for adding more properties, convert the struct to use a flags value,
instead of individual booleans. This is more extensible.

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

index 8033d77fb2660e0d95f1a870c499ed72a4dadf58..dd1472d4f9aad92c144edda213d7933d14fff676 100644 (file)
@@ -208,13 +208,26 @@ int scene_obj_set_pos(struct scene *scn, uint id, int x, int y)
 }
 
 int scene_obj_set_hide(struct scene *scn, uint id, bool hide)
+{
+       int ret;
+
+       ret = scene_obj_flag_clrset(scn, id, SCENEOF_HIDE,
+                                   hide ? SCENEOF_HIDE : 0);
+       if (ret)
+               return log_msg_ret("flg", ret);
+
+       return 0;
+}
+
+int scene_obj_flag_clrset(struct scene *scn, uint id, uint clr, uint set)
 {
        struct scene_obj *obj;
 
        obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
        if (!obj)
                return log_msg_ret("find", -ENOENT);
-       obj->hide = hide;
+       obj->flags &= ~clr;
+       obj->flags |= set;
 
        return 0;
 }
@@ -358,7 +371,7 @@ int scene_render(struct scene *scn)
        int ret;
 
        list_for_each_entry(obj, &scn->obj_head, sibling) {
-               if (!obj->hide) {
+               if (!(obj->flags & SCENEOF_HIDE)) {
                        ret = scene_obj_render(obj, exp->text_mode);
                        if (ret && ret != -ENOTSUPP)
                                return log_msg_ret("ren", ret);
index 9f173dd749f005096493343b40339227aec848b6..24a2ba6a6a3df0da2d2d3cf81204a452b2564634 100644 (file)
@@ -54,6 +54,17 @@ void *scene_obj_find(struct scene *scn, uint id, enum scene_obj_t type);
 int scene_obj_add(struct scene *scn, const char *name, uint id,
                  enum scene_obj_t type, uint size, struct scene_obj **objp);
 
+/**
+ * scene_obj_flag_clrset() - Adjust object flags
+ *
+ * @scn: Scene to update
+ * @id: ID of object to update
+ * @clr: Bits to clear in the object's flags
+ * @set: Bits to set in the object's flags
+ * Returns 0 if OK, -ENOENT if the object was not found
+ */
+int scene_obj_flag_clrset(struct scene *scn, uint id, uint clr, uint set);
+
 /**
  * scene_menu_arrange() - Set the position of things in the menu
  *
index 5135954ba1399d8ec5bf78628febd190f715766a..b6777cebcbec51c7684e41888e5b3d9f04b06d52 100644 (file)
@@ -137,6 +137,15 @@ struct scene_dim {
        int h;
 };
 
+/**
+ * enum scene_obj_flags_t - flags for objects
+ *
+ * @SCENEOF_HIDE: object should be hidden
+ */
+enum scene_obj_flags_t {
+       SCENEOF_HIDE    = 1 << 0,
+};
+
 /**
  * struct scene_obj - information about an object in a scene
  *
@@ -145,7 +154,7 @@ struct scene_dim {
  * @id: ID number of the object
  * @type: Type of this object
  * @dim: Dimensions for this object
- * @hide: true if the object should be hidden
+ * @flags: Flags for this object
  * @sibling: Node to link this object to its siblings
  */
 struct scene_obj {
@@ -154,7 +163,7 @@ struct scene_obj {
        uint id;
        enum scene_obj_t type;
        struct scene_dim dim;
-       bool hide;
+       int flags;
        struct list_head sibling;
 };
 
index 10cb7b246f3f1aa08129e11d7cc88bff00a2dcda..5088776f7bd5d4d29339fdb3347a0c42a4bd321b 100644 (file)
@@ -372,7 +372,7 @@ static int expo_object_menu(struct unit_test_state *uts)
 
        ut_asserteq(-4, prev1->obj.dim.x);
        ut_asserteq(menu->obj.dim.y + 32, prev1->obj.dim.y);
-       ut_asserteq(false, prev1->obj.hide);
+       ut_asserteq(false, prev1->obj.flags & SCENEOF_HIDE);
 
        expo_destroy(exp);
 
@@ -488,10 +488,10 @@ static int expo_render_image(struct unit_test_state *uts)
 
        /* make sure only the preview for the second item is shown */
        obj = scene_obj_find(scn, ITEM1_PREVIEW, SCENEOBJT_NONE);
-       ut_asserteq(true, obj->hide);
+       ut_asserteq(true, obj->flags & SCENEOF_HIDE);
 
        obj = scene_obj_find(scn, ITEM2_PREVIEW, SCENEOBJT_NONE);
-       ut_asserteq(false, obj->hide);
+       ut_asserteq(false, obj->flags & SCENEOF_HIDE);
 
        /* select it */
        ut_assertok(expo_send_key(exp, BKEY_SELECT));