@samitouri / QOSamiQemu / commits / ff7977e2c6

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)