Decouple the line-feed handling from VCChardev by operating on QemuVT100 directly. The function no longer needs the chardev or console pointers — callers pass &s->vt instead. This continues the effort to make the VT100 terminal emulation self-contained.
Signed-off-by: Marc-André Lureau <[email protected]> --- ui/console-vc.c | 65 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/ui/console-vc.c b/ui/console-vc.c index efb10c2f8f7..4ea9f88f55a 100644 --- a/ui/console-vc.c +++ b/ui/console-vc.c @@ -433,47 +433,46 @@ static void vt100_set_image(QemuVT100 *vt, pixman_image_t *image) vt->cells = cells; } -static void vc_put_lf(VCChardev *vc) +static void vt100_put_lf(QemuVT100 *vt) { - QemuTextConsole *s = vc->console; TextCell *c; int x, y1; - s->vt.y++; - if (s->vt.y >= s->vt.height) { - s->vt.y = s->vt.height - 1; + vt->y++; + if (vt->y >= vt->height) { + vt->y = vt->height - 1; - if (s->vt.y_displayed == s->vt.y_base) { - if (++s->vt.y_displayed == s->vt.total_height) - s->vt.y_displayed = 0; + if (vt->y_displayed == vt->y_base) { + if (++vt->y_displayed == vt->total_height) + vt->y_displayed = 0; } - if (++s->vt.y_base == s->vt.total_height) - s->vt.y_base = 0; - if (s->vt.backscroll_height < s->vt.total_height) - s->vt.backscroll_height++; - y1 = (s->vt.y_base + s->vt.height - 1) % s->vt.total_height; - c = &s->vt.cells[y1 * s->vt.width]; - for(x = 0; x < s->vt.width; x++) { + if (++vt->y_base == vt->total_height) + vt->y_base = 0; + if (vt->backscroll_height < vt->total_height) + vt->backscroll_height++; + y1 = (vt->y_base + vt->height - 1) % vt->total_height; + c = &vt->cells[y1 * vt->width]; + for(x = 0; x < vt->width; x++) { c->ch = ' '; c->t_attrib = TEXT_ATTRIBUTES_DEFAULT; c++; } - if (s->vt.y_displayed == s->vt.y_base) { - s->vt.text_x[0] = 0; - s->vt.text_y[0] = 0; - s->vt.text_x[1] = s->vt.width - 1; - s->vt.text_y[1] = s->vt.height - 1; - - image_bitblt(s->vt.image, 0, FONT_HEIGHT, 0, 0, - s->vt.width * FONT_WIDTH, - (s->vt.height - 1) * FONT_HEIGHT); - image_fill_rect(s->vt.image, 0, (s->vt.height - 1) * FONT_HEIGHT, - s->vt.width * FONT_WIDTH, FONT_HEIGHT, + if (vt->y_displayed == vt->y_base) { + vt->text_x[0] = 0; + vt->text_y[0] = 0; + vt->text_x[1] = vt->width - 1; + vt->text_y[1] = vt->height - 1; + + image_bitblt(vt->image, 0, FONT_HEIGHT, 0, 0, + vt->width * FONT_WIDTH, + (vt->height - 1) * FONT_HEIGHT); + image_fill_rect(vt->image, 0, (vt->height - 1) * FONT_HEIGHT, + vt->width * FONT_WIDTH, FONT_HEIGHT, color_table_rgb[0][TEXT_ATTRIBUTES_DEFAULT.bgcol]); - s->vt.update_x0 = 0; - s->vt.update_y0 = 0; - s->vt.update_x1 = s->vt.width * FONT_WIDTH; - s->vt.update_y1 = s->vt.height * FONT_HEIGHT; + vt->update_x0 = 0; + vt->update_y0 = 0; + vt->update_x1 = vt->width * FONT_WIDTH; + vt->update_y1 = vt->height * FONT_HEIGHT; } } } @@ -664,7 +663,7 @@ static void vc_put_one(VCChardev *vc, int ch) if (s->vt.x >= s->vt.width) { /* line wrap */ s->vt.x = 0; - vc_put_lf(vc); + vt100_put_lf(&s->vt); } y1 = (s->vt.y_base + s->vt.y) % s->vt.total_height; c = &s->vt.cells[y1 * s->vt.width + s->vt.x]; @@ -842,7 +841,7 @@ static void vc_putchar(VCChardev *vc, int ch) s->vt.x = 0; break; case '\n': /* newline */ - vc_put_lf(vc); + vt100_put_lf(&s->vt); break; case '\b': /* backspace */ if (s->vt.x > 0) @@ -851,7 +850,7 @@ static void vc_putchar(VCChardev *vc, int ch) case '\t': /* tabspace */ if (s->vt.x + (8 - (s->vt.x % 8)) > s->vt.width) { s->vt.x = 0; - vc_put_lf(vc); + vt100_put_lf(&s->vt); } else { s->vt.x = s->vt.x + (8 - (s->vt.x % 8)); } -- 2.53.0
