aboutsummaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
authorSimon Glass2023-06-01 10:22:53 -0600
committerTom Rini2023-07-14 12:54:51 -0400
commit2e59389704cd1e46101f7ffda2dac3f44f2fa332 (patch)
tree2ec4afe667eb58b3eca7be70ec4522af44ca068c /boot
parent699b0acb522fd808b67b745b541bacf18c275d15 (diff)
expo: Support simple themes
It is a pain to manually set the fonts of all objects to be consistent. Some spacing settings are also better set globally than by manually positioning each object. Add a 'theme' to the expo, to hold this information. For now it includes only the font size. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'boot')
-rw-r--r--boot/expo.c20
-rw-r--r--boot/scene.c28
-rw-r--r--boot/scene_internal.h9
3 files changed, 57 insertions, 0 deletions
diff --git a/boot/expo.c b/boot/expo.c
index 67cae3c7e28..d5e935966bf 100644
--- a/boot/expo.c
+++ b/boot/expo.c
@@ -231,3 +231,23 @@ 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)
+{
+ struct scene *scn;
+ struct expo_theme *theme = &exp->theme;
+ int ret;
+
+ log_debug("Applying theme %s\n", ofnode_get_name(node));
+
+ memset(theme, '\0', sizeof(struct expo_theme));
+ ofnode_read_u32(node, "font-size", &theme->font_size);
+
+ list_for_each_entry(scn, &exp->scene_head, sibling) {
+ ret = scene_apply_theme(scn, theme);
+ if (ret)
+ return log_msg_ret("app", ret);
+ }
+
+ return 0;
+}
diff --git a/boot/scene.c b/boot/scene.c
index 6d5e3c1f03d..4dbe12a2b74 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -466,3 +466,31 @@ int scene_calc_dims(struct scene *scn, bool do_menus)
return 0;
}
+
+int scene_apply_theme(struct scene *scn, struct expo_theme *theme)
+{
+ struct scene_obj *obj;
+ int ret;
+
+ /* Avoid error-checking optional items */
+ scene_txt_set_font(scn, scn->title_id, NULL, theme->font_size);
+
+ list_for_each_entry(obj, &scn->obj_head, sibling) {
+ switch (obj->type) {
+ case SCENEOBJT_NONE:
+ case SCENEOBJT_IMAGE:
+ case SCENEOBJT_MENU:
+ break;
+ case SCENEOBJT_TEXT:
+ scene_txt_set_font(scn, obj->id, NULL,
+ theme->font_size);
+ break;
+ }
+ }
+
+ ret = scene_arrange(scn);
+ if (ret)
+ return log_msg_ret("arr", ret);
+
+ return 0;
+}
diff --git a/boot/scene_internal.h b/boot/scene_internal.h
index 00085a2f55d..3387a90761a 100644
--- a/boot/scene_internal.h
+++ b/boot/scene_internal.h
@@ -90,6 +90,15 @@ int scene_calc_dims(struct scene *scn, bool do_menus);
int scene_menu_arrange(struct scene *scn, struct scene_obj_menu *menu);
/**
+ * scene_apply_theme() - Apply a theme to a scene
+ *
+ * @scn: Scene to update
+ * @theme: Theme to apply
+ * Returns: 0 if OK, -ve on error
+ */
+int scene_apply_theme(struct scene *scn, struct expo_theme *theme);
+
+/**
* scene_menu_send_key() - Send a key to a menu for processing
*
* @scn: Scene to use