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(-) diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c index 36a2c33eb70..9c7c116809b 100644 --- a/drivers/video/console_truetype.c +++ b/drivers/video/console_truetype.c @@ -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, diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c index bc2b3943fc8..414a33f7bf7 100644 --- a/drivers/video/vidconsole-uclass.c +++ b/drivers/video/vidconsole-uclass.c @@ -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", diff --git a/include/video_console.h b/include/video_console.h index cedc94a83cf..ebba1ac7572 100644 --- a/include/video_console.h +++ b/include/video_console.h @@ -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; }; -- 2.43.0