From: Marc-André Lureau <[email protected]> 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é <[email protected]> Signed-off-by: Marc-André Lureau <[email protected]> --- ui/dbus.h | 1 + ui/dbus-chardev.c | 10 ++++++++++ ui/dbus.c | 6 ++++++ ui/dbus-display1.xml | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/ui/dbus.h b/ui/dbus.h index 986d7774601..e4e78590b49 100644 --- a/ui/dbus.h +++ b/ui/dbus.h @@ -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) diff --git a/ui/dbus-chardev.c b/ui/dbus-chardev.c index 9442b475517..55117029acc 100644 --- a/ui/dbus-chardev.c +++ b/ui/dbus-chardev.c @@ -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); } diff --git a/ui/dbus.c b/ui/dbus.c index 59b73e0aa94..e02a94df2f3 100644 --- a/ui/dbus.c +++ b/ui/dbus.c @@ -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); } diff --git a/ui/dbus-display1.xml b/ui/dbus-display1.xml index 4a41a7e0f34..d96bae2ed64 100644 --- a/ui/dbus-display1.xml +++ b/ui/dbus-display1.xml @@ -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> -- 2.54.0
