mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
bootstd: Support setting a theme for the menu
Allow a theme to be set. For now this is very simple, just a default font size to use for all elements. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
d985f1dbdd
commit
e64c29521c
5 changed files with 139 additions and 3 deletions
|
@ -129,6 +129,43 @@ int bootflow_menu_new(struct expo **expp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bootflow_menu_apply_theme(struct expo *exp, ofnode node)
|
||||||
|
{
|
||||||
|
struct menu_priv *priv = exp->priv;
|
||||||
|
struct scene *scn;
|
||||||
|
u32 font_size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
log_debug("Applying theme %s\n", ofnode_get_name(node));
|
||||||
|
scn = expo_lookup_scene_id(exp, MAIN);
|
||||||
|
if (!scn)
|
||||||
|
return log_msg_ret("scn", -ENOENT);
|
||||||
|
|
||||||
|
/* Avoid error-checking optional items */
|
||||||
|
if (!ofnode_read_u32(node, "font-size", &font_size)) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
log_debug("font size %d\n", font_size);
|
||||||
|
scene_txt_set_font(scn, OBJ_PROMPT, NULL, font_size);
|
||||||
|
scene_txt_set_font(scn, OBJ_POINTER, NULL, font_size);
|
||||||
|
for (i = 0; i < priv->num_bootflows; i++) {
|
||||||
|
ret = scene_txt_set_font(scn, ITEM_DESC + i, NULL,
|
||||||
|
font_size);
|
||||||
|
if (ret)
|
||||||
|
return log_msg_ret("des", ret);
|
||||||
|
scene_txt_set_font(scn, ITEM_KEY + i, NULL, font_size);
|
||||||
|
scene_txt_set_font(scn, ITEM_LABEL + i, NULL,
|
||||||
|
font_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = scene_arrange(scn);
|
||||||
|
if (ret)
|
||||||
|
return log_msg_ret("arr", ret);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int bootflow_menu_run(struct bootstd_priv *std, bool text_mode,
|
int bootflow_menu_run(struct bootstd_priv *std, bool text_mode,
|
||||||
struct bootflow **bflowp)
|
struct bootflow **bflowp)
|
||||||
{
|
{
|
||||||
|
@ -149,6 +186,12 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode,
|
||||||
if (ret)
|
if (ret)
|
||||||
return log_msg_ret("exp", ret);
|
return log_msg_ret("exp", ret);
|
||||||
|
|
||||||
|
if (ofnode_valid(std->theme)) {
|
||||||
|
ret = bootflow_menu_apply_theme(exp, std->theme);
|
||||||
|
if (ret)
|
||||||
|
return log_msg_ret("thm", ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* For now we only support a video console */
|
/* For now we only support a video console */
|
||||||
ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
|
ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -33,6 +33,8 @@ static int bootstd_of_to_plat(struct udevice *dev)
|
||||||
&priv->prefixes);
|
&priv->prefixes);
|
||||||
dev_read_string_list(dev, "bootdev-order",
|
dev_read_string_list(dev, "bootdev-order",
|
||||||
&priv->bootdev_order);
|
&priv->bootdev_order);
|
||||||
|
|
||||||
|
priv->theme = ofnode_find_subnode(dev_ofnode(dev), "theme");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#ifndef __bootflow_h
|
#ifndef __bootflow_h
|
||||||
#define __bootflow_h
|
#define __bootflow_h
|
||||||
|
|
||||||
|
#include <dm/ofnode_decl.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
|
||||||
struct bootstd_priv;
|
struct bootstd_priv;
|
||||||
|
@ -347,6 +348,15 @@ int bootflow_iter_uses_system(const struct bootflow_iter *iter);
|
||||||
*/
|
*/
|
||||||
int bootflow_menu_new(struct expo **expp);
|
int bootflow_menu_new(struct expo **expp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bootflow_menu_apply_theme() - Apply a theme to a bootmenu
|
||||||
|
*
|
||||||
|
* @exp: Expo to update
|
||||||
|
* @node: Node containing the theme information
|
||||||
|
* Returns 0 on success, -ve on error
|
||||||
|
*/
|
||||||
|
int bootflow_menu_apply_theme(struct expo *exp, ofnode node);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bootflow_menu_run() - Create and run a menu of available bootflows
|
* bootflow_menu_run() - Create and run a menu of available bootflows
|
||||||
*
|
*
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#ifndef __bootstd_h
|
#ifndef __bootstd_h
|
||||||
#define __bootstd_h
|
#define __bootstd_h
|
||||||
|
|
||||||
|
#include <dm/ofnode_decl.h>
|
||||||
|
|
||||||
struct udevice;
|
struct udevice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,6 +29,7 @@ struct udevice;
|
||||||
* @bootmeth_count: Number of bootmeth devices in @bootmeth_order
|
* @bootmeth_count: Number of bootmeth devices in @bootmeth_order
|
||||||
* @bootmeth_order: List of bootmeth devices to use, in order, NULL-terminated
|
* @bootmeth_order: List of bootmeth devices to use, in order, NULL-terminated
|
||||||
* @vbe_bootmeth: Currently selected VBE bootmeth, NULL if none
|
* @vbe_bootmeth: Currently selected VBE bootmeth, NULL if none
|
||||||
|
* @theme: Node containing the theme information
|
||||||
*/
|
*/
|
||||||
struct bootstd_priv {
|
struct bootstd_priv {
|
||||||
const char **prefixes;
|
const char **prefixes;
|
||||||
|
@ -37,6 +40,7 @@ struct bootstd_priv {
|
||||||
int bootmeth_count;
|
int bootmeth_count;
|
||||||
struct udevice **bootmeth_order;
|
struct udevice **bootmeth_order;
|
||||||
struct udevice *vbe_bootmeth;
|
struct udevice *vbe_bootmeth;
|
||||||
|
ofnode theme;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <bootstd.h>
|
#include <bootstd.h>
|
||||||
#include <cli.h>
|
#include <cli.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
|
#include <expo.h>
|
||||||
#ifdef CONFIG_SANDBOX
|
#ifdef CONFIG_SANDBOX
|
||||||
#include <asm/test.h>
|
#include <asm/test.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -21,6 +22,8 @@
|
||||||
#include <test/suites.h>
|
#include <test/suites.h>
|
||||||
#include <test/ut.h>
|
#include <test/ut.h>
|
||||||
#include "bootstd_common.h"
|
#include "bootstd_common.h"
|
||||||
|
#include "../../boot/bootflow_internal.h"
|
||||||
|
#include "../../boot/scene_internal.h"
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
@ -469,14 +472,18 @@ static int bootflow_cmd_boot(struct unit_test_state *uts)
|
||||||
}
|
}
|
||||||
BOOTSTD_TEST(bootflow_cmd_boot, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
|
BOOTSTD_TEST(bootflow_cmd_boot, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
|
||||||
|
|
||||||
/* Check 'bootflow menu' to select a bootflow */
|
/**
|
||||||
static int bootflow_cmd_menu(struct unit_test_state *uts)
|
* prep_mmc4_bootdev() - Set up the mmc4 bootdev so we can access a fake Armbian
|
||||||
|
*
|
||||||
|
* @uts: Unit test state
|
||||||
|
* Returns 0 on success, -ve on failure
|
||||||
|
*/
|
||||||
|
static int prep_mmc4_bootdev(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
static const char *order[] = {"mmc2", "mmc1", "mmc4", NULL};
|
static const char *order[] = {"mmc2", "mmc1", "mmc4", NULL};
|
||||||
struct udevice *dev, *bootstd;
|
struct udevice *dev, *bootstd;
|
||||||
struct bootstd_priv *std;
|
struct bootstd_priv *std;
|
||||||
const char **old_order;
|
const char **old_order;
|
||||||
char prev[3];
|
|
||||||
ofnode node;
|
ofnode node;
|
||||||
|
|
||||||
/* Enable the mmc4 node since we need a second bootflow */
|
/* Enable the mmc4 node since we need a second bootflow */
|
||||||
|
@ -500,6 +507,16 @@ static int bootflow_cmd_menu(struct unit_test_state *uts)
|
||||||
/* Restore the order used by the device tree */
|
/* Restore the order used by the device tree */
|
||||||
std->bootdev_order = old_order;
|
std->bootdev_order = old_order;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check 'bootflow menu' to select a bootflow */
|
||||||
|
static int bootflow_cmd_menu(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
char prev[3];
|
||||||
|
|
||||||
|
ut_assertok(prep_mmc4_bootdev(uts));
|
||||||
|
|
||||||
/* Add keypresses to move to and select the second one in the list */
|
/* Add keypresses to move to and select the second one in the list */
|
||||||
prev[0] = CTL_CH('n');
|
prev[0] = CTL_CH('n');
|
||||||
prev[1] = '\r';
|
prev[1] = '\r';
|
||||||
|
@ -513,3 +530,63 @@ static int bootflow_cmd_menu(struct unit_test_state *uts)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
BOOTSTD_TEST(bootflow_cmd_menu, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
|
BOOTSTD_TEST(bootflow_cmd_menu, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check_font() - Check that the font size for an item matches expectations
|
||||||
|
*
|
||||||
|
* @uts: Unit test state
|
||||||
|
* @scn: Scene containing the text object
|
||||||
|
* @id: ID of the text object
|
||||||
|
* Returns 0 on success, -ve on failure
|
||||||
|
*/
|
||||||
|
static int check_font(struct unit_test_state *uts, struct scene *scn, uint id,
|
||||||
|
int font_size)
|
||||||
|
{
|
||||||
|
struct scene_obj_txt *txt;
|
||||||
|
|
||||||
|
txt = scene_obj_find(scn, id, SCENEOBJT_TEXT);
|
||||||
|
ut_assertnonnull(txt);
|
||||||
|
|
||||||
|
ut_asserteq(font_size, txt->font_size);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check themes work with a bootflow menu */
|
||||||
|
static int bootflow_menu_theme(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
const int font_size = 30;
|
||||||
|
struct scene *scn;
|
||||||
|
struct expo *exp;
|
||||||
|
ofnode node;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ut_assertok(prep_mmc4_bootdev(uts));
|
||||||
|
|
||||||
|
ut_assertok(bootflow_menu_new(&exp));
|
||||||
|
node = ofnode_path("/bootstd/theme");
|
||||||
|
ut_assert(ofnode_valid(node));
|
||||||
|
ut_assertok(bootflow_menu_apply_theme(exp, node));
|
||||||
|
|
||||||
|
scn = expo_lookup_scene_id(exp, MAIN);
|
||||||
|
ut_assertnonnull(scn);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check that the txt objects have the correct font size from the
|
||||||
|
* device tree node: bootstd/theme
|
||||||
|
*
|
||||||
|
* Check both menu items, since there are two bootflows
|
||||||
|
*/
|
||||||
|
ut_assertok(check_font(uts, scn, OBJ_PROMPT, font_size));
|
||||||
|
ut_assertok(check_font(uts, scn, OBJ_POINTER, font_size));
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
ut_assertok(check_font(uts, scn, ITEM_DESC + i, font_size));
|
||||||
|
ut_assertok(check_font(uts, scn, ITEM_KEY + i, font_size));
|
||||||
|
ut_assertok(check_font(uts, scn, ITEM_LABEL + i, font_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
expo_destroy(exp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
BOOTSTD_TEST(bootflow_menu_theme, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
|
||||||
|
|
Loading…
Reference in a new issue