Maintain a list of QemuVT100 instances so the cursor timer can directly iterate over them and call vt100_refresh(), instead of going through qemu_invalidate_text_consoles() which iterated over all consoles (including graphic ones) and called back into the generic display layer.
This removes the qemu_invalidate_text_consoles() function from console.c, further decoupling VT100 text rendering from the console core. Signed-off-by: Marc-André Lureau <[email protected]> --- include/ui/console.h | 1 - ui/console-priv.h | 2 +- ui/console-vc-stubs.c | 2 +- ui/console-vc.c | 28 +++++++++++++++++++++++----- ui/console.c | 19 +------------------ 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index 4896e9e0e04..401e5a010fd 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -416,7 +416,6 @@ void qemu_console_set_window_id(QemuConsole *con, int window_id); void qemu_console_resize(QemuConsole *con, int width, int height); DisplaySurface *qemu_console_surface(QemuConsole *con); void coroutine_fn qemu_console_co_wait_update(QemuConsole *con); -int qemu_invalidate_text_consoles(void); /* console-gl.c */ #ifdef CONFIG_OPENGL diff --git a/ui/console-priv.h b/ui/console-priv.h index 2c2cfd99570..8bcdb79d914 100644 --- a/ui/console-priv.h +++ b/ui/console-priv.h @@ -36,7 +36,7 @@ struct QemuConsole { }; void qemu_text_console_update_size(QemuTextConsole *c); -void qemu_text_console_update_cursor(void); +void vt100_update_cursor(void); void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym); #endif diff --git a/ui/console-vc-stubs.c b/ui/console-vc-stubs.c index 8a7f19c1f44..d911a82f263 100644 --- a/ui/console-vc-stubs.c +++ b/ui/console-vc-stubs.c @@ -14,7 +14,7 @@ void qemu_text_console_update_size(QemuTextConsole *c) { } -void qemu_text_console_update_cursor(void) +void vt100_update_cursor(void) { } diff --git a/ui/console-vc.c b/ui/console-vc.c index d2a7d527586..22d1128ee6b 100644 --- a/ui/console-vc.c +++ b/ui/console-vc.c @@ -8,6 +8,7 @@ #include "qapi/error.h" #include "qemu/fifo8.h" #include "qemu/option.h" +#include "qemu/queue.h" #include "ui/console.h" #include "ui/cp437.h" @@ -69,8 +70,13 @@ struct QemuVT100 { int update_y0; int update_x1; int update_y1; + + QTAILQ_ENTRY(QemuVT100) list; }; +static QTAILQ_HEAD(QemuVT100Head, QemuVT100) vt100s = + QTAILQ_HEAD_INITIALIZER(vt100s); + typedef struct QemuTextConsole { QemuConsole parent; @@ -1090,20 +1096,28 @@ static int vc_chr_write(Chardev *chr, const uint8_t *buf, int len) return len; } -void qemu_text_console_update_cursor(void) +void vt100_update_cursor(void) { + QemuVT100 *vt; + cursor_visible_phase = !cursor_visible_phase; - if (qemu_invalidate_text_consoles()) { - timer_mod(cursor_timer, - qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + CONSOLE_CURSOR_PERIOD / 2); + if (QTAILQ_EMPTY(&vt100s)) { + return; + } + + QTAILQ_FOREACH(vt, &vt100s, list) { + vt100_refresh(vt); } + + timer_mod(cursor_timer, + qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + CONSOLE_CURSOR_PERIOD / 2); } static void cursor_timer_cb(void *opaque) { - qemu_text_console_update_cursor(); + vt100_update_cursor(); } static void text_console_invalidate(void *opaque) @@ -1119,6 +1133,9 @@ static void text_console_invalidate(void *opaque) static void qemu_text_console_finalize(Object *obj) { + QemuTextConsole *s = QEMU_TEXT_CONSOLE(obj); + + QTAILQ_REMOVE(&vt100s, &s->vt, list); } static void @@ -1143,6 +1160,7 @@ qemu_text_console_init(Object *obj) { QemuTextConsole *c = QEMU_TEXT_CONSOLE(obj); + QTAILQ_INSERT_HEAD(&vt100s, &c->vt, list); fifo8_create(&c->out_fifo, 16); c->vt.total_height = DEFAULT_BACKSCROLL; QEMU_CONSOLE(c)->hw_ops = &text_console_ops; diff --git a/ui/console.c b/ui/console.c index 24e4761e1f9..8af1dee0e22 100644 --- a/ui/console.c +++ b/ui/console.c @@ -752,7 +752,7 @@ void register_displaychangelistener(DisplayChangeListener *dcl) } else if (QEMU_IS_TEXT_CONSOLE(dcl->con)) { qemu_text_console_update_size(QEMU_TEXT_CONSOLE(dcl->con)); } - qemu_text_console_update_cursor(); + vt100_update_cursor(); } void update_displaychangelistener(DisplayChangeListener *dcl, @@ -1457,23 +1457,6 @@ int qemu_console_get_height(QemuConsole *con, int fallback) } } -int qemu_invalidate_text_consoles(void) -{ - QemuConsole *s; - int count = 0; - - QTAILQ_FOREACH(s, &consoles, next) { - if (qemu_console_is_graphic(s) || - !qemu_console_is_visible(s)) { - continue; - } - count++; - graphic_hw_invalidate(s); - } - - return count; -} - void qemu_console_resize(QemuConsole *s, int width, int height) { DisplaySurface *surface = qemu_console_surface(s); -- 2.53.0
