[PATCH 06/19] expo: Separate out reading the theme from applying it
Simon Glass
sjg at chromium.org
Mon May 5 17:42:44 CEST 2025
Rename the existing expo_apply_theme() to expo_setup_theme() and adjust
the former so that it applies a theme which has already been read into
the struct. This will make it easier for tests to check theme
adjustments, since they won't have to put them in a node.
Add the white-on-black property into the theme struct while we are.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
boot/bootflow_menu.c | 2 +-
boot/expo.c | 33 +++++++++++++++++++++++----------
cmd/cedit.c | 2 +-
include/expo.h | 18 ++++++++++++++++--
test/boot/bootflow.c | 2 +-
test/boot/expo.c | 2 +-
6 files changed, 43 insertions(+), 16 deletions(-)
diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c
index 934165d2855..a0437177364 100644
--- a/boot/bootflow_menu.c
+++ b/boot/bootflow_menu.c
@@ -261,7 +261,7 @@ int bootflow_menu_start(struct bootstd_priv *std, bool text_mode,
return log_msg_ret("bma", ret);
if (ofnode_valid(std->theme)) {
- ret = expo_apply_theme(exp, std->theme);
+ ret = expo_setup_theme(exp, std->theme);
if (ret)
return log_msg_ret("thm", ret);
}
diff --git a/boot/expo.c b/boot/expo.c
index 64d3febacdb..a218ea0e4e9 100644
--- a/boot/expo.c
+++ b/boot/expo.c
@@ -281,11 +281,28 @@ int expo_action_get(struct expo *exp, struct expo_action *act)
return act->type == EXPOACT_NONE ? -EAGAIN : 0;
}
-int expo_apply_theme(struct expo *exp, ofnode node)
+int expo_apply_theme(struct expo *exp)
{
+ struct expo_theme *theme = &exp->theme;
struct scene *scn;
+
+ if (exp->display)
+ video_set_white_on_black(exp->display, theme->white_on_black);
+
+ list_for_each_entry(scn, &exp->scene_head, sibling) {
+ int ret;
+
+ ret = scene_apply_theme(scn, theme);
+ if (ret)
+ return log_msg_ret("asn", ret);
+ }
+
+ return 0;
+}
+
+int expo_setup_theme(struct expo *exp, ofnode node)
+{
struct expo_theme *theme = &exp->theme;
- bool white_on_black;
int ret;
log_debug("Applying theme %s\n", ofnode_get_name(node));
@@ -296,15 +313,11 @@ int expo_apply_theme(struct expo *exp, ofnode node)
ofnode_read_u32(node, "menuitem-gap-y", &theme->menuitem_gap_y);
ofnode_read_u32(node, "menu-title-margin-x",
&theme->menu_title_margin_x);
- white_on_black = ofnode_read_bool(node, "white-on-black");
- if (exp->display)
- video_set_white_on_black(exp->display, white_on_black);
+ theme->white_on_black = ofnode_read_bool(node, "white-on-black");
- list_for_each_entry(scn, &exp->scene_head, sibling) {
- ret = scene_apply_theme(scn, theme);
- if (ret)
- return log_msg_ret("app", ret);
- }
+ ret = expo_apply_theme(exp);
+ if (ret)
+ return log_msg_ret("asn", ret);
return 0;
}
diff --git a/cmd/cedit.c b/cmd/cedit.c
index 2e15b063462..9c492d45171 100644
--- a/cmd/cedit.c
+++ b/cmd/cedit.c
@@ -274,7 +274,7 @@ static int do_cedit_run(struct cmd_tbl *cmdtp, int flag, int argc,
node = ofnode_path("/bootstd/cedit-theme");
if (ofnode_valid(node)) {
- ret = expo_apply_theme(cur_exp, node);
+ ret = expo_setup_theme(cur_exp, node);
if (ret)
return CMD_RET_FAILURE;
} else {
diff --git a/include/expo.h b/include/expo.h
index 75ff1df3cfc..0b25a9d8b41 100644
--- a/include/expo.h
+++ b/include/expo.h
@@ -83,12 +83,15 @@ struct expo_action {
* @menuitem_gap_y: Gap between menu items in pixels
* @menu_title_margin_x: Gap between right side of menu title and left size of
* menu label
+ * @white_on_black: True to use white-on-black for the expo, false for
+ * black-on-white
*/
struct expo_theme {
u32 font_size;
u32 menu_inset;
u32 menuitem_gap_y;
u32 menu_title_margin_x;
+ bool white_on_black;
};
/**
@@ -994,12 +997,23 @@ int expo_send_key(struct expo *exp, int key);
int expo_action_get(struct expo *exp, struct expo_action *act);
/**
- * expo_apply_theme() - Apply a theme to an expo
+ * expo_setup_theme() - Read a theme from a node and apply it to an expo
*
* @exp: Expo to update
* @node: Node containing the theme
+ * Returns: 0 if OK, -ve on error
+ */
+int expo_setup_theme(struct expo *exp, ofnode node);
+
+/**
+ * expo_apply_theme() - Apply an expo's theme
+ *
+ * The theme to be applied must be set up exp->theme
+ *
+ * @exp: Expo to update
+ * Returns: 0 if OK, -ve on error
*/
-int expo_apply_theme(struct expo *exp, ofnode node);
+int expo_apply_theme(struct expo *exp);
/**
* expo_build() - Build an expo from an FDT description
diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
index 670e73c265b..0dd8fa71261 100644
--- a/test/boot/bootflow.c
+++ b/test/boot/bootflow.c
@@ -884,7 +884,7 @@ static int bootflow_menu_theme(struct unit_test_state *uts)
ut_assertok(bootflow_menu_add_all(exp));
node = ofnode_path("/bootstd/theme");
ut_assert(ofnode_valid(node));
- ut_assertok(expo_apply_theme(exp, node));
+ ut_assertok(expo_setup_theme(exp, node));
scn = expo_lookup_scene_id(exp, MAIN);
ut_assertnonnull(scn);
diff --git a/test/boot/expo.c b/test/boot/expo.c
index 64b6c154b15..824ef023c1c 100644
--- a/test/boot/expo.c
+++ b/test/boot/expo.c
@@ -302,7 +302,7 @@ static int expo_object_attr(struct unit_test_state *uts)
node = ofnode_path("/bootstd/theme");
ut_assert(ofnode_valid(node));
- ut_assertok(expo_apply_theme(exp, node));
+ ut_assertok(expo_setup_theme(exp, node));
ut_asserteq(30, txt->gen.font_size);
expo_destroy(exp);
--
2.43.0
More information about the U-Boot
mailing list