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 <marcandre.lureau@redhat.com>
---
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