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>
This commit is contained in:
Marc-André Lureau
2026-04-20 17:04:31 +04:00
parent 0b1f036753
commit ff7977e2c6
4 changed files with 35 additions and 0 deletions

View File

@@ -53,6 +53,15 @@ dbus_display_chardev_export(DBusDisplay *dpy, DBusChardev *chr)
sk = g_dbus_object_skeleton_new(path);
g_dbus_object_skeleton_add_interface(
sk, G_DBUS_INTERFACE_SKELETON(chr->iface));
if (chr->iface_vc_encoding) {
const char *interfaces[] = {
"org.qemu.Display1.Chardev.VCEncoding",
NULL
};
g_dbus_object_skeleton_add_interface(
sk, G_DBUS_INTERFACE_SKELETON(chr->iface_vc_encoding));
g_object_set(chr->iface, "interfaces", interfaces, NULL);
}
g_dbus_object_manager_server_export(dpy->server, sk);
chr->exported = true;
}
@@ -290,6 +299,7 @@ char_dbus_finalize(Object *obj)
};
dbus_display_notify(&event);
g_clear_object(&dc->iface_vc_encoding);
g_clear_object(&dc->iface);
}

View File

@@ -1141,4 +1141,22 @@
-->
<property name="Interfaces" type="as" access="read"/>
</interface>
<!--
org.qemu.Display1.Chardev.VCEncoding:
Provides encoding information for virtual console chardevs.
This interface is present on chardev objects that are virtual
consoles, and exposes the character encoding used by the guest.
-->
<interface name="org.qemu.Display1.Chardev.VCEncoding">
<!--
Encoding:
The character encoding used by the virtual console
(matching ``ChardevVCEncoding``): ``cp437`` or ``utf8``.
-->
<property name="Encoding" type="s" access="read"/>
</interface>
</node>

View File

@@ -514,6 +514,7 @@ CHARDEV_VC_ENCODING_PROPERTY_DEFINE(DBUS_VC_CHARDEV)
static bool
dbus_vc_open(Chardev *chr, ChardevBackend *backend, Error **errp)
{
DBusChardev *dc = DBUS_CHARDEV(chr);
DBusVCChardev *vc = DBUS_VC_CHARDEV(chr);
ChardevClass *parent =
CHARDEV_CLASS(object_class_by_name(TYPE_CHARDEV_DBUS));
@@ -522,6 +523,11 @@ dbus_vc_open(Chardev *chr, ChardevBackend *backend, Error **errp)
if (be->has_encoding) {
vc->encoding = be->encoding;
}
dc->iface_vc_encoding =
qemu_dbus_display1_chardev_vcencoding_skeleton_new();
qemu_dbus_display1_chardev_vcencoding_set_encoding(
dc->iface_vc_encoding,
qapi_enum_lookup(&ChardevVCEncoding_lookup, vc->encoding));
return parent->chr_open(chr, backend, errp);
}

View File

@@ -126,6 +126,7 @@ typedef struct DBusChardev {
bool exported;
QemuDBusDisplay1Chardev *iface;
QemuDBusDisplay1ChardevVCEncoding *iface_vc_encoding;
} DBusChardev;
DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS)