From: Simon Glass <simon.glass@canonical.com>
The display width should be per-context so that different clients can
maintain their own display settings. Move the xsize_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_core.c | 2 +-
drivers/video/console_rotate.c | 6 +++---
drivers/video/console_truetype.c | 2 +-
drivers/video/vidconsole-uclass.c | 10 +++++-----
include/video_console.h | 4 ++--
5 files changed, 12 insertions(+), 12 deletions(-)
@@ -350,7 +350,7 @@ int console_fixed_putc_xy(struct udevice *dev, uint x_frac, uint y, int cp,
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > ctx->xsize_frac)
return -EAGAIN;
linenum = y;
x = VID_TO_PIXEL(x_frac);
@@ -87,7 +87,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, int cp)
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > ctx->xsize_frac)
return -EAGAIN;
linenum = VID_TO_PIXEL(x_frac) + 1;
x = y + 1;
@@ -176,7 +176,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, int cp)
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > ctx->xsize_frac)
return -EAGAIN;
linenum = vid_priv->ysize - y - 1;
x = vid_priv->xsize - VID_TO_PIXEL(x_frac) - 1;
@@ -267,7 +267,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, int cp)
uchar *pfont = fontdata->video_fontdata +
ch * fontdata->char_pixel_bytes;
- if (x_frac + VID_TO_POS(ctx->x_charsize) > vc_priv->xsize_frac)
+ if (x_frac + VID_TO_POS(ctx->x_charsize) > ctx->xsize_frac)
return -EAGAIN;
x = y;
linenum = vid_priv->ysize - VID_TO_PIXEL(x_frac) - 1;
@@ -477,7 +477,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
x_shift = xpos - (double)tt_floor(xpos);
xpos += advance * met->scale;
width_frac = (int)VID_TO_POS((kern + advance) * met->scale);
- if (x + width_frac >= vc_priv->xsize_frac)
+ if (x + width_frac >= vc_ctx->xsize_frac)
return -EAGAIN;
/* Write the current cursor position into history */
@@ -476,7 +476,7 @@ static int vidconsole_output_glyph(struct udevice *dev, int ch)
return ret;
ctx->xcur_frac += ret;
ctx->last_ch = ch;
- if (ctx->xcur_frac >= priv->xsize_frac)
+ if (ctx->xcur_frac >= ctx->xsize_frac)
vidconsole_newline(dev);
cli_index_adjust(priv, 1);
@@ -517,7 +517,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
ctx->xcur_frac = ((ctx->xcur_frac / ctx->tab_width_frac)
+ 1) * ctx->tab_width_frac;
- if (ctx->xcur_frac >= priv->xsize_frac)
+ if (ctx->xcur_frac >= ctx->xsize_frac)
vidconsole_newline(dev);
break;
case '\b':
@@ -878,11 +878,11 @@ void vidconsole_pop_colour(struct udevice *dev, struct vidconsole_colour *old)
/* Set up the number of rows and colours (rotated drivers override this) */
static int vidconsole_pre_probe(struct udevice *dev)
{
- struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+ struct vidconsole_ctx *ctx = vidconsole_ctx(dev);
struct udevice *vid = dev->parent;
struct video_priv *vid_priv = dev_get_uclass_priv(vid);
- priv->xsize_frac = VID_TO_POS(vid_priv->xsize);
+ ctx->xsize_frac = VID_TO_POS(vid_priv->xsize);
return 0;
}
@@ -978,7 +978,7 @@ void vidconsole_set_bitmap_font(struct udevice *dev,
if (vid_priv->rot % 2) {
ctx->cols = vid_priv->ysize / fontdata->width;
ctx->rows = vid_priv->xsize / fontdata->height;
- vc_priv->xsize_frac = VID_TO_POS(vid_priv->ysize);
+ ctx->xsize_frac = VID_TO_POS(vid_priv->ysize);
} else {
ctx->cols = vid_priv->xsize / fontdata->width;
ctx->rows = vid_priv->ysize / fontdata->height;
@@ -115,6 +115,7 @@ struct vidconsole_ansi {
* @curs: Cursor state and management
* @xstart_frac: Left margin for the text console in fractional units
* @tab_width_frac: Tab width in fractional units
+ * @xsize_frac: Width of the display in fractional units
*/
struct vidconsole_ctx {
int rows;
@@ -132,6 +133,7 @@ struct vidconsole_ctx {
struct vidconsole_cursor curs;
int xstart_frac;
int tab_width_frac;
+ int xsize_frac;
};
/**
@@ -150,13 +152,11 @@ struct vidconsole_ctx {
*
* @sdev: stdio device, acting as an output sink
* @ctx: Per-client context
- * @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 xsize_frac;
bool quiet;
};