From: Simon Glass <simon.glass@canonical.com> Move the ycur field from vidconsole_priv into vidconsole_ctx as part of the per-client context refactoring. This allows each client to maintain its own cursor Y position. Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: Simon Glass <simon.glass@canonical.com> --- drivers/video/console_normal.c | 4 ++-- drivers/video/console_truetype.c | 12 ++++++------ drivers/video/vidconsole-uclass.c | 26 +++++++++++++------------- include/video_console.h | 8 ++++---- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/drivers/video/console_normal.c b/drivers/video/console_normal.c index 0aadd8bc96f..95cde3aa709 100644 --- a/drivers/video/console_normal.c +++ b/drivers/video/console_normal.c @@ -161,7 +161,7 @@ static __maybe_unused int normal_entry_save(struct udevice *dev, return log_msg_ret("sav", -ENOMEM); store.xpos_frac = ctx->xcur_frac; - store.ypos = vc_priv->ycur; + store.ypos = ctx->ycur; store.cli_index = vc_priv->cli_index; memcpy(abuf_data(buf), &store, size); @@ -181,7 +181,7 @@ static __maybe_unused int normal_entry_restore(struct udevice *dev, memcpy(&store, abuf_data(buf), sizeof(store)); ctx->xcur_frac = store.xpos_frac; - vc_priv->ycur = store.ypos; + ctx->ycur = store.ypos; vc_priv->cli_index = store.cli_index; return 0; diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c index 386e9aa8a59..233154cfeea 100644 --- a/drivers/video/console_truetype.c +++ b/drivers/video/console_truetype.c @@ -497,7 +497,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y, pos = &ctx->pos[ctx->pos_ptr]; pos->xpos_frac = vc_ctx->xcur_frac; - pos->ypos = vc_priv->ycur; + pos->ypos = vc_ctx->ycur; pos->width = (width_frac + VID_FRAC_DIV - 1) / VID_FRAC_DIV; pos->cp = cp; ctx->pos_ptr++; @@ -707,14 +707,14 @@ static int console_truetype_backspace(struct udevice *dev) * cursor position, but if we are clearing a character on the previous * line, we clear from the end of the line. */ - if (pos->ypos == vc_priv->ycur) + if (pos->ypos == vc_ctx->ycur) xend = VID_TO_PIXEL(vc_ctx->xcur_frac); else xend = vid_priv->xsize; /* Move the cursor back to where it was when we pushed this record */ vc_ctx->xcur_frac = pos->xpos_frac; - vc_priv->ycur = pos->ypos; + vc_ctx->ycur = pos->ypos; return 0; } @@ -1202,7 +1202,7 @@ static int truetype_entry_save(struct udevice *dev, struct abuf *buf) store.priv = *priv; store.cur.xpos_frac = vc_ctx->xcur_frac; - store.cur.ypos = vc_priv->ycur; + store.cur.ypos = vc_ctx->ycur; memcpy(abuf_data(buf), &store, size); return 0; @@ -1222,7 +1222,7 @@ static int truetype_entry_restore(struct udevice *dev, struct abuf *buf) memcpy(&store, abuf_data(buf), sizeof(store)); vc_ctx->xcur_frac = store.cur.xpos_frac; - vc_priv->ycur = store.cur.ypos; + vc_ctx->ycur = store.cur.ypos; *ctx = store.priv.ctx; return 0; @@ -1255,7 +1255,7 @@ static int truetype_get_cursor_info(struct udevice *dev) x = VID_TO_PIXEL(ctx->pos[index].xpos_frac); else x = VID_TO_PIXEL(vc_ctx->xcur_frac); - y = vc_priv->ycur; + y = vc_ctx->ycur; /* Get font height from current font type */ if (priv->cur_fontdata) diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c index 8bc2384dd7a..29caaf34fc0 100644 --- a/drivers/video/vidconsole-uclass.c +++ b/drivers/video/vidconsole-uclass.c @@ -80,9 +80,9 @@ static int vidconsole_back(struct udevice *dev) if (ctx->xcur_frac < priv->xstart_frac) { ctx->xcur_frac = (ctx->cols - 1) * VID_TO_POS(ctx->x_charsize); - priv->ycur -= ctx->y_charsize; - if (priv->ycur < 0) - priv->ycur = 0; + ctx->ycur -= ctx->y_charsize; + if (ctx->ycur < 0) + ctx->ycur = 0; } assert(priv->cli_index); cli_index_adjust(priv, -1); @@ -101,17 +101,17 @@ static void vidconsole_newline(struct udevice *dev) int i, ret; ctx->xcur_frac = priv->xstart_frac; - priv->ycur += ctx->y_charsize; + ctx->ycur += ctx->y_charsize; /* Check if we need to scroll the terminal */ if (vid_priv->rot % 2 ? - priv->ycur + ctx->x_charsize > vid_priv->xsize : - priv->ycur + ctx->y_charsize > vid_priv->ysize) { + ctx->ycur + ctx->x_charsize > vid_priv->xsize : + ctx->ycur + ctx->y_charsize > vid_priv->ysize) { vidconsole_move_rows(dev, 0, rows, ctx->rows - rows); for (i = 0; i < rows; i++) vidconsole_set_row(dev, ctx->rows - i - 1, vid_priv->colour_bg); - priv->ycur -= rows * ctx->y_charsize; + ctx->ycur -= rows * ctx->y_charsize; } priv->last_ch = 0; @@ -140,7 +140,7 @@ void vidconsole_set_cursor_pos(struct udevice *dev, int x, int y) ctx->xcur_frac = VID_TO_POS(x); priv->xstart_frac = ctx->xcur_frac; - priv->ycur = y; + ctx->ycur = y; /* make sure not to kern against the previous character */ priv->last_ch = 0; @@ -181,7 +181,7 @@ static void get_cursor_position(struct vidconsole_priv *priv, { struct vidconsole_ctx *ctx = vidconsole_ctx_from_priv(priv); - *row = priv->ycur / ctx->y_charsize; + *row = ctx->ycur / ctx->y_charsize; *col = VID_TO_PIXEL(ctx->xcur_frac - priv->xstart_frac) / ctx->x_charsize; } @@ -332,7 +332,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch) console_puts_select_stderr(true, "[vc err: video_sync]"); #endif } - priv->ycur = 0; + ctx->ycur = 0; ctx->xcur_frac = priv->xstart_frac; } else { debug("unsupported clear mode: %d\n", mode); @@ -467,10 +467,10 @@ static int vidconsole_output_glyph(struct udevice *dev, int ch) * colour depth. Check this and return an error to help with * diagnosis. */ - ret = vidconsole_putc_xy(dev, ctx->xcur_frac, priv->ycur, ch); + ret = vidconsole_putc_xy(dev, ctx->xcur_frac, ctx->ycur, ch); if (ret == -EAGAIN) { vidconsole_newline(dev); - ret = vidconsole_putc_xy(dev, ctx->xcur_frac, priv->ycur, ch); + ret = vidconsole_putc_xy(dev, ctx->xcur_frac, ctx->ycur, ch); } if (ret < 0) return ret; @@ -840,7 +840,7 @@ int vidconsole_mark_start(struct udevice *dev) struct vidconsole_ops *ops = vidconsole_get_ops(dev); priv->xmark_frac = ctx->xcur_frac; - priv->ymark = priv->ycur; + priv->ymark = ctx->ycur; priv->cli_index = 0; if (ops->mark_start) { int ret; diff --git a/include/video_console.h b/include/video_console.h index f6971a20e0d..c2656ec452d 100644 --- a/include/video_console.h +++ b/include/video_console.h @@ -84,6 +84,7 @@ struct vidconsole_cursor { * @x_charsize: Character width in pixels * @y_charsize: Character height in pixels * @xcur_frac: Current X position, in fractional units (VID_TO_POS(x)) + * @ycur: Current Y position in pixels (0=top) */ struct vidconsole_ctx { int rows; @@ -91,6 +92,7 @@ struct vidconsole_ctx { int x_charsize; int y_charsize; int xcur_frac; + int ycur; }; /** @@ -123,13 +125,12 @@ struct vidconsole_ansi { * Note that these values relate to the rotated console, so that an 80x25 * console which is rotated 90 degrees will have rows=80 and cols=25 * - * The ctx.xcur_frac and ycur values refer to the unrotated coordinates, that - * is ctx.xcur_frac always advances with each character, even if its limit + * The ctx.xcur_frac and ctx.ycur values refer to the unrotated coordinates, + * that is ctx.xcur_frac always advances with each character, even if its limit * might be vid_priv->ysize instead of vid_priv->xsize if the console is * rotated 90 or 270 degrees. * * @sdev: stdio device, acting as an output sink - * @ycur: Current Y position in pixels (0=top) * @ctx: Per-client context * @tab_width_frac: Tab width in fractional units * @xsize_frac: Width of the display in fractional units @@ -146,7 +147,6 @@ struct vidconsole_ansi { struct vidconsole_priv { struct stdio_dev sdev; struct vidconsole_ctx ctx; - int ycur; int tab_width_frac; int xsize_frac; int xstart_frac; -- 2.43.0