From: Simon Glass <simon.glass@canonical.com>
The tab width should be per-context so that different clients can
maintain their own tab settings. Move the tab_width_frac field from
vidconsole_priv into vidconsole_ctx.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
drivers/video/console_truetype.c | 5 +++--
drivers/video/vidconsole-uclass.c | 8 ++++----
include/video_console.h | 4 ++--
3 files changed, 9 insertions(+), 8 deletions(-)
@@ -923,6 +923,7 @@ static void set_bitmap_font(struct udevice *dev,
struct video_fontdata *fontdata)
{
struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(vc_priv);
struct console_tt_priv *priv = dev_get_priv(dev);
priv->cur_fontdata = fontdata;
@@ -930,7 +931,7 @@ static void set_bitmap_font(struct udevice *dev,
vidconsole_set_bitmap_font(dev, fontdata);
- vc_priv->tab_width_frac = VID_TO_POS(fontdata->width) * 8 / 2;
+ ctx->tab_width_frac = VID_TO_POS(fontdata->width) * 8 / 2;
}
static void select_metrics(struct udevice *dev, struct console_tt_metrics *met)
@@ -947,7 +948,7 @@ static void select_metrics(struct udevice *dev, struct console_tt_metrics *met)
com->xstart_frac = VID_TO_POS(2);
com->cols = vid_priv->xsize / met->font_size;
com->rows = vid_priv->ysize / met->font_size;
- vc_priv->tab_width_frac = VID_TO_POS(met->font_size) * 8 / 2;
+ com->tab_width_frac = VID_TO_POS(met->font_size) * 8 / 2;
}
static int get_metrics(struct udevice *dev, const char *name, uint size,
@@ -514,8 +514,8 @@ int vidconsole_put_char(struct udevice *dev, char ch)
vidconsole_entry_start(dev);
break;
case '\t': /* Tab (8 chars alignment) */
- ctx->xcur_frac = ((ctx->xcur_frac / priv->tab_width_frac)
- + 1) * priv->tab_width_frac;
+ ctx->xcur_frac = ((ctx->xcur_frac / ctx->tab_width_frac)
+ + 1) * ctx->tab_width_frac;
if (ctx->xcur_frac >= priv->xsize_frac)
vidconsole_newline(dev);
@@ -894,8 +894,8 @@ static int vidconsole_post_probe(struct udevice *dev)
struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(priv);
struct stdio_dev *sdev = &priv->sdev;
- if (!priv->tab_width_frac)
- priv->tab_width_frac = VID_TO_POS(ctx->x_charsize) * 8;
+ if (!ctx->tab_width_frac)
+ ctx->tab_width_frac = VID_TO_POS(ctx->x_charsize) * 8;
if (dev_seq(dev)) {
snprintf(sdev->name, sizeof(sdev->name), "vidconsole%d",
@@ -114,6 +114,7 @@ struct vidconsole_ansi {
* @utf8_buf: Buffer to accumulate UTF-8 byte sequence
* @curs: Cursor state and management
* @xstart_frac: Left margin for the text console in fractional units
+ * @tab_width_frac: Tab width in fractional units
*/
struct vidconsole_ctx {
int rows;
@@ -130,6 +131,7 @@ struct vidconsole_ctx {
char utf8_buf[5];
struct vidconsole_cursor curs;
int xstart_frac;
+ int tab_width_frac;
};
/**
@@ -148,14 +150,12 @@ struct vidconsole_ctx {
*
* @sdev: stdio device, acting as an output sink
* @ctx: Per-client context
- * @tab_width_frac: Tab width in fractional units
* @xsize_frac: Width of the display in fractional units
* @quiet: Suppress all output from stdio
*/
struct vidconsole_priv {
struct stdio_dev sdev;
struct vidconsole_ctx ctx;
- int tab_width_frac;
int xsize_frac;
bool quiet;
};