ui/dbus: expose vc encoding via D-Bus Chardev.VCEncoding interface
When a D-Bus VC chardev is instantiated, export an extra org.qemu.Display1.Chardev.VCEncoding interface on the chardev object. This lets D-Bus display clients discover the encoding (cp437 or utf8) in use by the virtual console. Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Marc-André Lureau committed
Apr 20, 2026 at 17:04 UTC
ff7977e2c69d57b4dfcf98c80c6943042d15e119
4 files changed
+35
ui/dbus-chardev.c
+10
@@ -53,6 +53,15 @@ dbus_display_chardev_export(DBusDisplay *dpy, DBusChardev *chr)
53
sk = g_dbus_object_skeleton_new(path);
54
g_dbus_object_skeleton_add_interface(
55
sk, G_DBUS_INTERFACE_SKELETON(chr->iface));
56
+ if (chr->iface_vc_encoding) {
57
+ const char *interfaces[] = {
58
+ "org.qemu.Display1.Chardev.VCEncoding",
59
+ NULL
60
+ };
61
+ g_dbus_object_skeleton_add_interface(
62
+ sk, G_DBUS_INTERFACE_SKELETON(chr->iface_vc_encoding));
63
+ g_object_set(chr->iface, "interfaces", interfaces, NULL);
64
+ }
65
g_dbus_object_manager_server_export(dpy->server, sk);
66
chr->exported = true;
67
}
@@ -290,6 +299,7 @@ char_dbus_finalize(Object *obj)
299
};
300
301
dbus_display_notify(&event);
302
+ g_clear_object(&dc->iface_vc_encoding);
303
g_clear_object(&dc->iface);
304
}
305
ui/dbus-display1.xml
+18
@@ -1141,4 +1141,22 @@
1141
-->
1142
<property name="Interfaces" type="as" access="read"/>
1143
</interface>
1144
+
1145
+ <!--
1146
+ org.qemu.Display1.Chardev.VCEncoding:
1147
+
1148
+ Provides encoding information for virtual console chardevs.
1149
+
1150
+ This interface is present on chardev objects that are virtual
1151
+ consoles, and exposes the character encoding used by the guest.
1152
+ -->
1153
+ <interface name="org.qemu.Display1.Chardev.VCEncoding">
1154
+ <!--
1155
+ Encoding:
1156
+
1157
+ The character encoding used by the virtual console
1158
+ (matching ``ChardevVCEncoding``): ``cp437`` or ``utf8``.
1159
+ -->
1160
+ <property name="Encoding" type="s" access="read"/>
1161
+ </interface>
1162
</node>
ui/dbus.c
+6
@@ -514,6 +514,7 @@ CHARDEV_VC_ENCODING_PROPERTY_DEFINE(DBUS_VC_CHARDEV)
514
static bool
515
dbus_vc_open(Chardev *chr, ChardevBackend *backend, Error **errp)
516
{
517
+ DBusChardev *dc = DBUS_CHARDEV(chr);
518
DBusVCChardev *vc = DBUS_VC_CHARDEV(chr);
519
ChardevClass *parent =
520
CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_DBUS));
@@ -522,6 +523,11 @@ dbus_vc_open(Chardev *chr, ChardevBackend *backend, Error **errp)
523
if (be->has_encoding) {
524
vc->encoding = be->encoding;
525
}
526
+ dc->iface_vc_encoding =
527
+ qemu_dbus_display1_chardev_vcencoding_skeleton_new();
528
+ qemu_dbus_display1_chardev_vcencoding_set_encoding(
529
+ dc->iface_vc_encoding,
530
+ qapi_enum_lookup(&ChardevVCEncoding_lookup, vc->encoding));
531
532
return parent->chr_open(chr, backend, errp);
533
}
ui/dbus.h
+1
@@ -126,6 +126,7 @@ typedef struct DBusChardev {
126
127
bool exported;
128
QemuDBusDisplay1Chardev *iface;
129
+ QemuDBusDisplay1ChardevVCEncoding *iface_vc_encoding;
130
} DBusChardev;
131
132
DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS)