[PATCH 15/60] ui/console-vc: introduce QemuVT100

Marc-André Lureau posted 60 patches 2 weeks, 6 days ago
Maintainers: "Marc-André Lureau" <marcandre.lureau@redhat.com>, John Snow <jsnow@redhat.com>, Peter Maydell <peter.maydell@linaro.org>, Mauro Carvalho Chehab <mchehab+huawei@kernel.org>, Pierrick Bouvier <pierrick.bouvier@linaro.org>, Jan Kiszka <jan.kiszka@web.de>, Phil Dennis-Jordan <phil@philjordan.eu>, Richard Henderson <richard.henderson@linaro.org>, Helge Deller <deller@gmx.de>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Gerd Hoffmann <kraxel@redhat.com>, Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>, Samuel Tardieu <sam@rfc1149.net>, Igor Mitsyanko <i.mitsyanko@gmail.com>, "Hervé Poussineau" <hpoussin@reactos.org>, Aleksandar Rikalo <arikalo@gmail.com>, Laurent Vivier <laurent@vivier.eu>, Thomas Huth <th.huth+qemu@posteo.eu>, BALATON Zoltan <balaton@eik.bme.hu>, "Michael S. Tsirkin" <mst@redhat.com>, Stefano Garzarella <sgarzare@redhat.com>, "Alex Bennée" <alex.bennee@linaro.org>, Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>, Dmitry Osipenko <dmitry.osipenko@collabora.com>, Dmitry Fleytman <dmitry.fleytman@gmail.com>, Stefano Stabellini <sstabellini@kernel.org>, Anthony PERARD <anthony@xenproject.org>, "Edgar E. Iglesias" <edgar.iglesias@gmail.com>, Alistair Francis <alistair@alistair23.me>, Alex Williamson <alex@shazbot.org>, "Cédric Le Goater" <clg@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, Fabiano Rosas <farosas@suse.de>
[PATCH 15/60] ui/console-vc: introduce QemuVT100
Posted by Marc-André Lureau 2 weeks, 6 days ago
Start moving VT100 emulation specific code in a different structure.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 ui/console-vc.c | 381 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 192 insertions(+), 189 deletions(-)

diff --git a/ui/console-vc.c b/ui/console-vc.c
index e83a0b04e3f..41436a38eb5 100644
--- a/ui/console-vc.c
+++ b/ui/console-vc.c
@@ -48,9 +48,7 @@ enum TTYState {
     TTY_STATE_OSC,
 };
 
-typedef struct QemuTextConsole {
-    QemuConsole parent;
-
+typedef struct QemuVT100 {
     int width;
     int height;
     int total_height;
@@ -66,7 +64,12 @@ typedef struct QemuTextConsole {
     int update_y0;
     int update_x1;
     int update_y1;
+} QemuVT100;
+
+typedef struct QemuTextConsole {
+    QemuConsole parent;
 
+    QemuVT100 vt;
     Chardev *chr;
     /* fifo for key pressed */
     Fifo8 out_fifo;
@@ -186,34 +189,34 @@ static void invalidate_xy(QemuTextConsole *s, int x, int y)
     if (!qemu_console_is_visible(QEMU_CONSOLE(s))) {
         return;
     }
-    if (s->update_x0 > x * FONT_WIDTH)
-        s->update_x0 = x * FONT_WIDTH;
-    if (s->update_y0 > y * FONT_HEIGHT)
-        s->update_y0 = y * FONT_HEIGHT;
-    if (s->update_x1 < (x + 1) * FONT_WIDTH)
-        s->update_x1 = (x + 1) * FONT_WIDTH;
-    if (s->update_y1 < (y + 1) * FONT_HEIGHT)
-        s->update_y1 = (y + 1) * FONT_HEIGHT;
+    if (s->vt.update_x0 > x * FONT_WIDTH)
+        s->vt.update_x0 = x * FONT_WIDTH;
+    if (s->vt.update_y0 > y * FONT_HEIGHT)
+        s->vt.update_y0 = y * FONT_HEIGHT;
+    if (s->vt.update_x1 < (x + 1) * FONT_WIDTH)
+        s->vt.update_x1 = (x + 1) * FONT_WIDTH;
+    if (s->vt.update_y1 < (y + 1) * FONT_HEIGHT)
+        s->vt.update_y1 = (y + 1) * FONT_HEIGHT;
 }
 
 static void console_show_cursor(QemuTextConsole *s, int show)
 {
     TextCell *c;
     int y, y1;
-    int x = s->x;
+    int x = s->vt.x;
 
-    s->cursor_invalidate = 1;
+    s->vt.cursor_invalidate = 1;
 
-    if (x >= s->width) {
-        x = s->width - 1;
+    if (x >= s->vt.width) {
+        x = s->vt.width - 1;
     }
-    y1 = (s->y_base + s->y) % s->total_height;
-    y = y1 - s->y_displayed;
+    y1 = (s->vt.y_base + s->vt.y) % s->vt.total_height;
+    y = y1 - s->vt.y_displayed;
     if (y < 0) {
-        y += s->total_height;
+        y += s->vt.total_height;
     }
-    if (y < s->height) {
-        c = &s->cells[y1 * s->width + x];
+    if (y < s->vt.height) {
+        c = &s->vt.cells[y1 * s->vt.width + x];
         if (show && cursor_visible_phase) {
             TextAttributes t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             t_attrib.invers = !(t_attrib.invers); /* invert fg and bg */
@@ -232,23 +235,23 @@ static void console_refresh(QemuTextConsole *s)
     int x, y, y1;
 
     assert(surface);
-    s->text_x[0] = 0;
-    s->text_y[0] = 0;
-    s->text_x[1] = s->width - 1;
-    s->text_y[1] = s->height - 1;
-    s->cursor_invalidate = 1;
+    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;
+    s->vt.cursor_invalidate = 1;
 
     qemu_console_fill_rect(QEMU_CONSOLE(s), 0, 0, surface_width(surface), surface_height(surface),
                            color_table_rgb[0][QEMU_COLOR_BLACK]);
-    y1 = s->y_displayed;
-    for (y = 0; y < s->height; y++) {
-        c = s->cells + y1 * s->width;
-        for (x = 0; x < s->width; x++) {
+    y1 = s->vt.y_displayed;
+    for (y = 0; y < s->vt.height; y++) {
+        c = s->vt.cells + y1 * s->vt.width;
+        for (x = 0; x < s->vt.width; x++) {
             vga_putcharxy(QEMU_CONSOLE(s), x, y, c->ch,
                           &(c->t_attrib));
             c++;
         }
-        if (++y1 == s->total_height) {
+        if (++y1 == s->vt.total_height) {
             y1 = 0;
         }
     }
@@ -263,24 +266,24 @@ static void console_scroll(QemuTextConsole *s, int ydelta)
 
     if (ydelta > 0) {
         for(i = 0; i < ydelta; i++) {
-            if (s->y_displayed == s->y_base)
+            if (s->vt.y_displayed == s->vt.y_base)
                 break;
-            if (++s->y_displayed == s->total_height)
-                s->y_displayed = 0;
+            if (++s->vt.y_displayed == s->vt.total_height)
+                s->vt.y_displayed = 0;
         }
     } else {
         ydelta = -ydelta;
-        i = s->backscroll_height;
-        if (i > s->total_height - s->height)
-            i = s->total_height - s->height;
-        y1 = s->y_base - i;
+        i = s->vt.backscroll_height;
+        if (i > s->vt.total_height - s->vt.height)
+            i = s->vt.total_height - s->vt.height;
+        y1 = s->vt.y_base - i;
         if (y1 < 0)
-            y1 += s->total_height;
+            y1 += s->vt.total_height;
         for(i = 0; i < ydelta; i++) {
-            if (s->y_displayed == y1)
+            if (s->vt.y_displayed == y1)
                 break;
-            if (--s->y_displayed < 0)
-                s->y_displayed = s->total_height - 1;
+            if (--s->vt.y_displayed < 0)
+                s->vt.y_displayed = s->vt.total_height - 1;
         }
     }
     console_refresh(s);
@@ -338,13 +341,13 @@ void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym)
             *q++ = '\033';
             *q++ = '[';
             *q++ = keysym & 0xff;
-        } else if (s->echo && (keysym == '\r' || keysym == '\n')) {
+        } else if (s->vt.echo && (keysym == '\r' || keysym == '\n')) {
             qemu_chr_write(s->chr, (uint8_t *)"\r", 1, true);
             *q++ = '\n';
         } else {
             *q++ = keysym;
         }
-        if (s->echo) {
+        if (s->vt.echo) {
             qemu_chr_write(s->chr, buf, q - buf, true);
         }
         num_free = fifo8_num_free(&s->out_fifo);
@@ -359,27 +362,27 @@ static void text_console_update(void *opaque, console_ch_t *chardata)
     QemuTextConsole *s = QEMU_TEXT_CONSOLE(opaque);
     int i, j, src;
 
-    if (s->text_x[0] <= s->text_x[1]) {
-        src = (s->y_base + s->text_y[0]) * s->width;
-        chardata += s->text_y[0] * s->width;
-        for (i = s->text_y[0]; i <= s->text_y[1]; i ++)
-            for (j = 0; j < s->width; j++, src++) {
+    if (s->vt.text_x[0] <= s->vt.text_x[1]) {
+        src = (s->vt.y_base + s->vt.text_y[0]) * s->vt.width;
+        chardata += s->vt.text_y[0] * s->vt.width;
+        for (i = s->vt.text_y[0]; i <= s->vt.text_y[1]; i ++)
+            for (j = 0; j < s->vt.width; j++, src++) {
                 console_write_ch(chardata ++,
-                                 ATTR2CHTYPE(s->cells[src].ch,
-                                             s->cells[src].t_attrib.fgcol,
-                                             s->cells[src].t_attrib.bgcol,
-                                             s->cells[src].t_attrib.bold));
+                                 ATTR2CHTYPE(s->vt.cells[src].ch,
+                                             s->vt.cells[src].t_attrib.fgcol,
+                                             s->vt.cells[src].t_attrib.bgcol,
+                                             s->vt.cells[src].t_attrib.bold));
             }
-        dpy_text_update(QEMU_CONSOLE(s), s->text_x[0], s->text_y[0],
-                        s->text_x[1] - s->text_x[0], i - s->text_y[0]);
-        s->text_x[0] = s->width;
-        s->text_y[0] = s->height;
-        s->text_x[1] = 0;
-        s->text_y[1] = 0;
+        dpy_text_update(QEMU_CONSOLE(s), s->vt.text_x[0], s->vt.text_y[0],
+                        s->vt.text_x[1] - s->vt.text_x[0], i - s->vt.text_y[0]);
+        s->vt.text_x[0] = s->vt.width;
+        s->vt.text_y[0] = s->vt.height;
+        s->vt.text_x[1] = 0;
+        s->vt.text_y[1] = 0;
     }
-    if (s->cursor_invalidate) {
-        dpy_text_cursor(QEMU_CONSOLE(s), s->x, s->y);
-        s->cursor_invalidate = 0;
+    if (s->vt.cursor_invalidate) {
+        dpy_text_cursor(QEMU_CONSOLE(s), s->vt.x, s->vt.y);
+        s->vt.cursor_invalidate = 0;
     }
 }
 
@@ -393,33 +396,33 @@ static void text_console_resize(QemuTextConsole *t)
 
     w = surface_width(s->surface) / FONT_WIDTH;
     h = surface_height(s->surface) / FONT_HEIGHT;
-    if (w == t->width && h == t->height) {
+    if (w == t->vt.width && h == t->vt.height) {
         return;
     }
 
-    last_width = t->width;
-    t->width = w;
-    t->height = h;
+    last_width = t->vt.width;
+    t->vt.width = w;
+    t->vt.height = h;
 
-    w1 = MIN(t->width, last_width);
+    w1 = MIN(t->vt.width, last_width);
 
-    cells = g_new(TextCell, t->width * t->total_height + 1);
-    for (y = 0; y < t->total_height; y++) {
-        c = &cells[y * t->width];
+    cells = g_new(TextCell, t->vt.width * t->vt.total_height + 1);
+    for (y = 0; y < t->vt.total_height; y++) {
+        c = &cells[y * t->vt.width];
         if (w1 > 0) {
-            c1 = &t->cells[y * last_width];
+            c1 = &t->vt.cells[y * last_width];
             for (x = 0; x < w1; x++) {
                 *c++ = *c1++;
             }
         }
-        for (x = w1; x < t->width; x++) {
+        for (x = w1; x < t->vt.width; x++) {
             c->ch = ' ';
             c->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             c++;
         }
     }
-    g_free(t->cells);
-    t->cells = cells;
+    g_free(t->vt.cells);
+    t->vt.cells = cells;
 }
 
 static void vc_put_lf(VCChardev *vc)
@@ -428,41 +431,41 @@ static void vc_put_lf(VCChardev *vc)
     TextCell *c;
     int x, y1;
 
-    s->y++;
-    if (s->y >= s->height) {
-        s->y = s->height - 1;
+    s->vt.y++;
+    if (s->vt.y >= s->vt.height) {
+        s->vt.y = s->vt.height - 1;
 
-        if (s->y_displayed == s->y_base) {
-            if (++s->y_displayed == s->total_height)
-                s->y_displayed = 0;
+        if (s->vt.y_displayed == s->vt.y_base) {
+            if (++s->vt.y_displayed == s->vt.total_height)
+                s->vt.y_displayed = 0;
         }
-        if (++s->y_base == s->total_height)
-            s->y_base = 0;
-        if (s->backscroll_height < s->total_height)
-            s->backscroll_height++;
-        y1 = (s->y_base + s->height - 1) % s->total_height;
-        c = &s->cells[y1 * s->width];
-        for(x = 0; x < s->width; x++) {
+        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++) {
             c->ch = ' ';
             c->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
             c++;
         }
-        if (s->y_displayed == s->y_base) {
-            s->text_x[0] = 0;
-            s->text_y[0] = 0;
-            s->text_x[1] = s->width - 1;
-            s->text_y[1] = s->height - 1;
+        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;
 
             qemu_console_bitblt(QEMU_CONSOLE(s), 0, FONT_HEIGHT, 0, 0,
-                                s->width * FONT_WIDTH,
-                                (s->height - 1) * FONT_HEIGHT);
-            qemu_console_fill_rect(QEMU_CONSOLE(s), 0, (s->height - 1) * FONT_HEIGHT,
-                                   s->width * FONT_WIDTH, FONT_HEIGHT,
+                                s->vt.width * FONT_WIDTH,
+                                (s->vt.height - 1) * FONT_HEIGHT);
+            qemu_console_fill_rect(QEMU_CONSOLE(s), 0, (s->vt.height - 1) * FONT_HEIGHT,
+                                   s->vt.width * FONT_WIDTH, FONT_HEIGHT,
                                    color_table_rgb[0][TEXT_ATTRIBUTES_DEFAULT.bgcol]);
-            s->update_x0 = 0;
-            s->update_y0 = 0;
-            s->update_x1 = s->width * FONT_WIDTH;
-            s->update_y1 = s->height * FONT_HEIGHT;
+            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;
         }
     }
 }
@@ -570,21 +573,21 @@ static void vc_update_xy(VCChardev *vc, int x, int y)
     TextCell *c;
     int y1, y2;
 
-    s->text_x[0] = MIN(s->text_x[0], x);
-    s->text_x[1] = MAX(s->text_x[1], x);
-    s->text_y[0] = MIN(s->text_y[0], y);
-    s->text_y[1] = MAX(s->text_y[1], y);
+    s->vt.text_x[0] = MIN(s->vt.text_x[0], x);
+    s->vt.text_x[1] = MAX(s->vt.text_x[1], x);
+    s->vt.text_y[0] = MIN(s->vt.text_y[0], y);
+    s->vt.text_y[1] = MAX(s->vt.text_y[1], y);
 
-    y1 = (s->y_base + y) % s->total_height;
-    y2 = y1 - s->y_displayed;
+    y1 = (s->vt.y_base + y) % s->vt.total_height;
+    y2 = y1 - s->vt.y_displayed;
     if (y2 < 0) {
-        y2 += s->total_height;
+        y2 += s->vt.total_height;
     }
-    if (y2 < s->height) {
-        if (x >= s->width) {
-            x = s->width - 1;
+    if (y2 < s->vt.height) {
+        if (x >= s->vt.width) {
+            x = s->vt.width - 1;
         }
-        c = &s->cells[y1 * s->width + x];
+        c = &s->vt.cells[y1 * s->vt.width + x];
         vga_putcharxy(QEMU_CONSOLE(s), x, y2, c->ch,
                       &(c->t_attrib));
         invalidate_xy(s, x, y2);
@@ -594,11 +597,11 @@ static void vc_update_xy(VCChardev *vc, int x, int y)
 static void vc_clear_xy(VCChardev *vc, int x, int y)
 {
     QemuTextConsole *s = vc->console;
-    int y1 = (s->y_base + y) % s->total_height;
-    if (x >= s->width) {
-        x = s->width - 1;
+    int y1 = (s->vt.y_base + y) % s->vt.total_height;
+    if (x >= s->vt.width) {
+        x = s->vt.width - 1;
     }
-    TextCell *c = &s->cells[y1 * s->width + x];
+    TextCell *c = &s->vt.cells[y1 * s->vt.width + x];
     c->ch = ' ';
     c->t_attrib = TEXT_ATTRIBUTES_DEFAULT;
     vc_update_xy(vc, x, y);
@@ -650,17 +653,17 @@ static void vc_put_one(VCChardev *vc, int ch)
     QemuTextConsole *s = vc->console;
     TextCell *c;
     int y1;
-    if (s->x >= s->width) {
+    if (s->vt.x >= s->vt.width) {
         /* line wrap */
-        s->x = 0;
+        s->vt.x = 0;
         vc_put_lf(vc);
     }
-    y1 = (s->y_base + s->y) % s->total_height;
-    c = &s->cells[y1 * s->width + s->x];
+    y1 = (s->vt.y_base + s->vt.y) % s->vt.total_height;
+    c = &s->vt.cells[y1 * s->vt.width + s->vt.x];
     c->ch = ch;
     c->t_attrib = vc->t_attrib;
-    vc_update_xy(vc, s->x, s->y);
-    s->x++;
+    vc_update_xy(vc, s->vt.x, s->vt.y);
+    s->vt.x++;
 }
 
 static void vc_respond_str(VCChardev *vc, const char *buf)
@@ -681,15 +684,15 @@ static void vc_set_cursor(VCChardev *vc, int x, int y)
     if (y < 0) {
         y = 0;
     }
-    if (y >= s->height) {
-        y = s->height - 1;
+    if (y >= s->vt.height) {
+        y = s->vt.height - 1;
     }
-    if (x >= s->width) {
-        x = s->width - 1;
+    if (x >= s->vt.width) {
+        x = s->vt.width - 1;
     }
 
-    s->x = x;
-    s->y = y;
+    s->vt.x = x;
+    s->vt.y = y;
 }
 
 /**
@@ -708,28 +711,28 @@ static void vc_csi_P(struct VCChardev *vc, unsigned int nr)
     if (!nr) {
         nr = 1;
     }
-    if (nr > s->width - s->x) {
-        nr = s->width - s->x;
+    if (nr > s->vt.width - s->vt.x) {
+        nr = s->vt.width - s->vt.x;
         if (!nr) {
             return;
         }
     }
 
-    x1 = s->x;
-    x2 = s->x + nr;
-    len = s->width - x2;
+    x1 = s->vt.x;
+    x2 = s->vt.x + nr;
+    len = s->vt.width - x2;
     if (len) {
-        y = (s->y_base + s->y) % s->total_height;
-        c1 = &s->cells[y * s->width + x1];
-        c2 = &s->cells[y * s->width + x2];
+        y = (s->vt.y_base + s->vt.y) % s->vt.total_height;
+        c1 = &s->vt.cells[y * s->vt.width + x1];
+        c2 = &s->vt.cells[y * s->vt.width + x2];
         memmove(c1, c2, len * sizeof(*c1));
         for (end = x1 + len; x1 < end; x1++) {
-            vc_update_xy(vc, x1, s->y);
+            vc_update_xy(vc, x1, s->vt.y);
         }
     }
     /* Clear the rest */
-    for (; x1 < s->width; x1++) {
-        vc_clear_xy(vc, x1, s->y);
+    for (; x1 < s->vt.width; x1++) {
+        vc_clear_xy(vc, x1, s->vt.y);
     }
 }
 
@@ -749,28 +752,28 @@ static void vc_csi_at(struct VCChardev *vc, unsigned int nr)
     if (!nr) {
         nr = 1;
     }
-    if (nr > s->width - s->x) {
-        nr = s->width - s->x;
+    if (nr > s->vt.width - s->vt.x) {
+        nr = s->vt.width - s->vt.x;
         if (!nr) {
             return;
         }
     }
 
-    x1 = s->x + nr;
-    x2 = s->x;
-    len = s->width - x1;
+    x1 = s->vt.x + nr;
+    x2 = s->vt.x;
+    len = s->vt.width - x1;
     if (len) {
-        y = (s->y_base + s->y) % s->total_height;
-        c1 = &s->cells[y * s->width + x1];
-        c2 = &s->cells[y * s->width + x2];
+        y = (s->vt.y_base + s->vt.y) % s->vt.total_height;
+        c1 = &s->vt.cells[y * s->vt.width + x1];
+        c2 = &s->vt.cells[y * s->vt.width + x2];
         memmove(c1, c2, len * sizeof(*c1));
         for (end = x1 + len; x1 < end; x1++) {
-            vc_update_xy(vc, x1, s->y);
+            vc_update_xy(vc, x1, s->vt.y);
         }
     }
     /* Insert blanks */
-    for (x1 = s->x; x1 < s->x + nr; x1++) {
-        vc_clear_xy(vc, x1, s->y);
+    for (x1 = s->vt.x; x1 < s->vt.x + nr; x1++) {
+        vc_clear_xy(vc, x1, s->vt.y);
     }
 }
 
@@ -781,8 +784,8 @@ static void vc_save_cursor(VCChardev *vc)
 {
     QemuTextConsole *s = vc->console;
 
-    vc->x_saved = s->x;
-    vc->y_saved = s->y;
+    vc->x_saved = s->vt.x;
+    vc->y_saved = s->vt.y;
     vc->t_attrib_saved = vc->t_attrib;
 }
 
@@ -794,8 +797,8 @@ static void vc_restore_cursor(VCChardev *vc)
 {
     QemuTextConsole *s = vc->console;
 
-    s->x = vc->x_saved;
-    s->y = vc->y_saved;
+    s->vt.x = vc->x_saved;
+    s->vt.y = vc->y_saved;
     vc->t_attrib = vc->t_attrib_saved;
 }
 
@@ -828,21 +831,21 @@ static void vc_putchar(VCChardev *vc, int ch)
         vc->utf8_state = UTF8_ACCEPT;
         switch(ch) {
         case '\r':  /* carriage return */
-            s->x = 0;
+            s->vt.x = 0;
             break;
         case '\n':  /* newline */
             vc_put_lf(vc);
             break;
         case '\b':  /* backspace */
-            if (s->x > 0)
-                s->x--;
+            if (s->vt.x > 0)
+                s->vt.x--;
             break;
         case '\t':  /* tabspace */
-            if (s->x + (8 - (s->x % 8)) > s->width) {
-                s->x = 0;
+            if (s->vt.x + (8 - (s->vt.x % 8)) > s->vt.width) {
+                s->vt.x = 0;
                 vc_put_lf(vc);
             } else {
-                s->x = s->x + (8 - (s->x % 8));
+                s->vt.x = s->vt.x + (8 - (s->vt.x % 8));
             }
             break;
         case '\a':  /* alert aka. bell */
@@ -910,32 +913,32 @@ static void vc_putchar(VCChardev *vc, int ch)
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x, s->y - vc->esc_params[0]);
+                vc_set_cursor(vc, s->vt.x, s->vt.y - vc->esc_params[0]);
                 break;
             case 'B':
                 /* move cursor down */
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x, s->y + vc->esc_params[0]);
+                vc_set_cursor(vc, s->vt.x, s->vt.y + vc->esc_params[0]);
                 break;
             case 'C':
                 /* move cursor right */
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x + vc->esc_params[0], s->y);
+                vc_set_cursor(vc, s->vt.x + vc->esc_params[0], s->vt.y);
                 break;
             case 'D':
                 /* move cursor left */
                 if (vc->esc_params[0] == 0) {
                     vc->esc_params[0] = 1;
                 }
-                vc_set_cursor(vc, s->x - vc->esc_params[0], s->y);
+                vc_set_cursor(vc, s->vt.x - vc->esc_params[0], s->vt.y);
                 break;
             case 'G':
                 /* move cursor to column */
-                vc_set_cursor(vc, vc->esc_params[0] - 1, s->y);
+                vc_set_cursor(vc, vc->esc_params[0] - 1, s->vt.y);
                 break;
             case 'f':
             case 'H':
@@ -946,9 +949,9 @@ static void vc_putchar(VCChardev *vc, int ch)
                 switch (vc->esc_params[0]) {
                 case 0:
                     /* clear to end of screen */
-                    for (y = s->y; y < s->height; y++) {
-                        for (x = 0; x < s->width; x++) {
-                            if (y == s->y && x < s->x) {
+                    for (y = s->vt.y; y < s->vt.height; y++) {
+                        for (x = 0; x < s->vt.width; x++) {
+                            if (y == s->vt.y && x < s->vt.x) {
                                 continue;
                             }
                             vc_clear_xy(vc, x, y);
@@ -957,9 +960,9 @@ static void vc_putchar(VCChardev *vc, int ch)
                     break;
                 case 1:
                     /* clear from beginning of screen */
-                    for (y = 0; y <= s->y; y++) {
-                        for (x = 0; x < s->width; x++) {
-                            if (y == s->y && x > s->x) {
+                    for (y = 0; y <= s->vt.y; y++) {
+                        for (x = 0; x < s->vt.width; x++) {
+                            if (y == s->vt.y && x > s->vt.x) {
                                 break;
                             }
                             vc_clear_xy(vc, x, y);
@@ -968,8 +971,8 @@ static void vc_putchar(VCChardev *vc, int ch)
                     break;
                 case 2:
                     /* clear entire screen */
-                    for (y = 0; y < s->height; y++) {
-                        for (x = 0; x < s->width; x++) {
+                    for (y = 0; y < s->vt.height; y++) {
+                        for (x = 0; x < s->vt.width; x++) {
                             vc_clear_xy(vc, x, y);
                         }
                     }
@@ -980,20 +983,20 @@ static void vc_putchar(VCChardev *vc, int ch)
                 switch (vc->esc_params[0]) {
                 case 0:
                     /* clear to eol */
-                    for(x = s->x; x < s->width; x++) {
-                        vc_clear_xy(vc, x, s->y);
+                    for(x = s->vt.x; x < s->vt.width; x++) {
+                        vc_clear_xy(vc, x, s->vt.y);
                     }
                     break;
                 case 1:
                     /* clear from beginning of line */
-                    for (x = 0; x <= s->x && x < s->width; x++) {
-                        vc_clear_xy(vc, x, s->y);
+                    for (x = 0; x <= s->vt.x && x < s->vt.width; x++) {
+                        vc_clear_xy(vc, x, s->vt.y);
                     }
                     break;
                 case 2:
                     /* clear entire line */
-                    for(x = 0; x < s->width; x++) {
-                        vc_clear_xy(vc, x, s->y);
+                    for(x = 0; x < s->vt.width; x++) {
+                        vc_clear_xy(vc, x, s->vt.y);
                     }
                     break;
                 }
@@ -1013,7 +1016,7 @@ static void vc_putchar(VCChardev *vc, int ch)
                 case 6:
                     /* report cursor position */
                     response = g_strdup_printf("\033[%d;%dR",
-                                               s->y + 1, s->x + 1);
+                                               s->vt.y + 1, s->vt.x + 1);
                     vc_respond_str(vc, response);
                     break;
                 }
@@ -1066,19 +1069,19 @@ static int vc_chr_write(Chardev *chr, const uint8_t *buf, int len)
     QemuTextConsole *s = drv->console;
     int i;
 
-    s->update_x0 = s->width * FONT_WIDTH;
-    s->update_y0 = s->height * FONT_HEIGHT;
-    s->update_x1 = 0;
-    s->update_y1 = 0;
+    s->vt.update_x0 = s->vt.width * FONT_WIDTH;
+    s->vt.update_y0 = s->vt.height * FONT_HEIGHT;
+    s->vt.update_x1 = 0;
+    s->vt.update_y1 = 0;
     console_show_cursor(s, 0);
     for(i = 0; i < len; i++) {
         vc_putchar(drv, buf[i]);
     }
     console_show_cursor(s, 1);
-    if (s->update_x0 < s->update_x1) {
-        dpy_gfx_update(QEMU_CONSOLE(s), s->update_x0, s->update_y0,
-                       s->update_x1 - s->update_x0,
-                       s->update_y1 - s->update_y0);
+    if (s->vt.update_x0 < s->vt.update_x1) {
+        dpy_gfx_update(QEMU_CONSOLE(s), s->vt.update_x0, s->vt.update_y0,
+                       s->vt.update_x1 - s->vt.update_x0,
+                       s->vt.update_y1 - s->vt.update_y0);
     }
     return len;
 }
@@ -1137,7 +1140,7 @@ qemu_text_console_init(Object *obj)
     QemuTextConsole *c = QEMU_TEXT_CONSOLE(obj);
 
     fifo8_create(&c->out_fifo, 16);
-    c->total_height = DEFAULT_BACKSCROLL;
+    c->vt.total_height = DEFAULT_BACKSCROLL;
     QEMU_CONSOLE(c)->hw_ops = &text_console_ops;
     QEMU_CONSOLE(c)->hw = c;
 }
@@ -1168,12 +1171,12 @@ static void vc_chr_set_echo(Chardev *chr, bool echo)
 {
     VCChardev *drv = VC_CHARDEV(chr);
 
-    drv->console->echo = echo;
+    drv->console->vt.echo = echo;
 }
 
 void qemu_text_console_update_size(QemuTextConsole *c)
 {
-    dpy_text_resize(QEMU_CONSOLE(c), c->width, c->height);
+    dpy_text_resize(QEMU_CONSOLE(c), c->vt.width, c->vt.height);
 }
 
 static bool vc_chr_open(Chardev *chr, ChardevBackend *backend, Error **errp)

-- 
2.53.0


Re: [PATCH 15/60] ui/console-vc: introduce QemuVT100
Posted by Philippe Mathieu-Daudé 5 days, 15 hours ago
On 17/3/26 09:50, Marc-André Lureau wrote:
> Start moving VT100 emulation specific code in a different structure.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   ui/console-vc.c | 381 ++++++++++++++++++++++++++++----------------------------
>   1 file changed, 192 insertions(+), 189 deletions(-)


> @@ -232,23 +235,23 @@ static void console_refresh(QemuTextConsole *s)
>       int x, y, y1;
Having looked at the following patches, I'd use this pattern here (in
various functions of this patch) to minimize the review code churn in
the following ones when you pass QemuVT100 *vt by argument:

         QemuVT100 *vt = &s->vt;

>       assert(surface);
> -    s->text_x[0] = 0;
> -    s->text_y[0] = 0;
> -    s->text_x[1] = s->width - 1;
> -    s->text_y[1] = s->height - 1;
> -    s->cursor_invalidate = 1;
> +    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;
> +    s->vt.cursor_invalidate = 1;


Re: [PATCH 15/60] ui/console-vc: introduce QemuVT100
Posted by Philippe Mathieu-Daudé 5 days, 15 hours ago
On 17/3/26 09:50, Marc-André Lureau wrote:
> Start moving VT100 emulation specific code in a different structure.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   ui/console-vc.c | 381 ++++++++++++++++++++++++++++----------------------------
>   1 file changed, 192 insertions(+), 189 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>