Replace the type-checking chain in qemu_console_get_label() (using QEMU_IS_GRAPHIC_CONSOLE/QEMU_IS_TEXT_CONSOLE) with a QemuConsoleClass virtual method, allowing each console subclass to provide its own get_label implementation.
Signed-off-by: Marc-André Lureau <[email protected]> --- include/ui/console.h | 2 + ui/console-priv.h | 1 - ui/console-vc-stubs.c | 6 --- ui/console-vc.c | 12 ++++-- ui/console.c | 101 +++++++++++++++++++++++++++----------------------- 5 files changed, 65 insertions(+), 57 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index 3677a9d334d..4896e9e0e04 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -129,6 +129,8 @@ void console_handle_touch_event(QemuConsole *con, struct QemuConsoleClass { ObjectClass parent_class; + + char * (*get_label)(QemuConsole *con); }; typedef struct ScanoutTexture { diff --git a/ui/console-priv.h b/ui/console-priv.h index 43ceb8122f1..2c2cfd99570 100644 --- a/ui/console-priv.h +++ b/ui/console-priv.h @@ -36,7 +36,6 @@ struct QemuConsole { }; void qemu_text_console_update_size(QemuTextConsole *c); -const char * qemu_text_console_get_label(QemuTextConsole *c); void qemu_text_console_update_cursor(void); void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym); diff --git a/ui/console-vc-stubs.c b/ui/console-vc-stubs.c index b63e2fb2345..8a7f19c1f44 100644 --- a/ui/console-vc-stubs.c +++ b/ui/console-vc-stubs.c @@ -14,12 +14,6 @@ void qemu_text_console_update_size(QemuTextConsole *c) { } -const char * -qemu_text_console_get_label(QemuTextConsole *c) -{ - return NULL; -} - void qemu_text_console_update_cursor(void) { } diff --git a/ui/console-vc.c b/ui/console-vc.c index fae8c8ce768..e83a0b04e3f 100644 --- a/ui/console-vc.c +++ b/ui/console-vc.c @@ -125,10 +125,12 @@ static const pixman_color_t color_table_rgb[2][8] = { static bool cursor_visible_phase; static QEMUTimer *cursor_timer; -const char * -qemu_text_console_get_label(QemuTextConsole *c) +static char * +qemu_text_console_get_label(QemuConsole *c) { - return c->chr ? c->chr->label : NULL; + QemuTextConsole *tc = QEMU_TEXT_CONSOLE(c); + + return tc->chr ? g_strdup(tc->chr->label) : NULL; } static void qemu_console_fill_rect(QemuConsole *con, int posx, int posy, @@ -1115,9 +1117,13 @@ qemu_text_console_finalize(Object *obj) static void qemu_text_console_class_init(ObjectClass *oc, const void *data) { + QemuConsoleClass *cc = QEMU_CONSOLE_CLASS(oc); + if (!cursor_timer) { cursor_timer = timer_new_ms(QEMU_CLOCK_REALTIME, cursor_timer_cb, NULL); } + + cc->get_label = qemu_text_console_get_label; } static const GraphicHwOps text_console_ops = { diff --git a/ui/console.c b/ui/console.c index f445db11389..24e4761e1f9 100644 --- a/ui/console.c +++ b/ui/console.c @@ -436,9 +436,58 @@ qemu_graphic_console_prop_get_head(Object *obj, Visitor *v, const char *name, visit_type_uint32(v, name, &c->head, errp); } +static bool +qemu_graphic_console_is_multihead(QemuGraphicConsole *c) +{ + QemuConsole *con; + + QTAILQ_FOREACH(con, &consoles, next) { + QemuGraphicConsole *candidate; + + if (!QEMU_IS_GRAPHIC_CONSOLE(con)) { + continue; + } + + candidate = QEMU_GRAPHIC_CONSOLE(con); + if (candidate->device != c->device) { + continue; + } + + if (candidate->head != c->head) { + return true; + } + } + return false; +} + +static char * +qemu_graphic_console_get_label(QemuConsole *con) +{ + QemuGraphicConsole *c = QEMU_GRAPHIC_CONSOLE(con); + + if (c->device) { + DeviceState *dev; + bool multihead; + + dev = DEVICE(c->device); + multihead = qemu_graphic_console_is_multihead(c); + if (multihead) { + return g_strdup_printf("%s.%d", dev->id ? + dev->id : + object_get_typename(c->device), + c->head); + } else { + return g_strdup(dev->id ? : object_get_typename(c->device)); + } + } + return g_strdup("VGA"); +} + static void qemu_graphic_console_class_init(ObjectClass *oc, const void *data) { + QemuConsoleClass *cc = QEMU_CONSOLE_CLASS(oc); + object_class_property_add_link(oc, "device", TYPE_DEVICE, offsetof(QemuGraphicConsole, device), object_property_allow_set_link, @@ -446,6 +495,8 @@ qemu_graphic_console_class_init(ObjectClass *oc, const void *data) object_class_property_add(oc, "head", "uint32", qemu_graphic_console_prop_get_head, NULL, NULL, NULL); + + cc->get_label = qemu_graphic_console_get_label; } static void @@ -1347,56 +1398,12 @@ bool qemu_console_is_gl_blocked(QemuConsole *con) return con->gl_block; } -static bool qemu_graphic_console_is_multihead(QemuGraphicConsole *c) -{ - QemuConsole *con; - - QTAILQ_FOREACH(con, &consoles, next) { - QemuGraphicConsole *candidate; - - if (!QEMU_IS_GRAPHIC_CONSOLE(con)) { - continue; - } - - candidate = QEMU_GRAPHIC_CONSOLE(con); - if (candidate->device != c->device) { - continue; - } - - if (candidate->head != c->head) { - return true; - } - } - return false; -} - char *qemu_console_get_label(QemuConsole *con) { - if (QEMU_IS_GRAPHIC_CONSOLE(con)) { - QemuGraphicConsole *c = QEMU_GRAPHIC_CONSOLE(con); - if (c->device) { - DeviceState *dev; - bool multihead; - - dev = DEVICE(c->device); - multihead = qemu_graphic_console_is_multihead(c); - if (multihead) { - return g_strdup_printf("%s.%d", dev->id ? - dev->id : - object_get_typename(c->device), - c->head); - } else { - return g_strdup(dev->id ? : object_get_typename(c->device)); - } - } - return g_strdup("VGA"); - } else if (QEMU_IS_TEXT_CONSOLE(con)) { - const char *label = qemu_text_console_get_label(QEMU_TEXT_CONSOLE(con)); - if (label) { - return g_strdup(label); - } + char *label = QEMU_CONSOLE_GET_CLASS(con)->get_label(con); + if (label) { + return label; } - return g_strdup_printf("vc%d", con->index); } -- 2.53.0
