From: Chengyang Zhu <colazcyg@gmail.com>
To: qemu-devel@nongnu.org
Cc: marcandre.lureau@redhat.com, Chengyang Zhu <colazcyg@gmail.com>
Subject: [PATCH RFC 1/1] ui/dbus: add extensible SetUIInfo2 method
Date: Fri, 7 Aug 2026 16:40:50 +0800 [thread overview]
Message-ID: <20260807084050.526109-2-colazcyg@gmail.com> (raw)
In-Reply-To: <20260807084050.526109-1-colazcyg@gmail.com>
Currently, the `SetUIInfo` method cannot set a refresh rate.
Simply adding a `refresh_rate` argument would break the method signature.
This patch adds:
* An extensible `SetUIInfo2` method which takes a dictionary as input.
* A property `QemuUIInfoTypes`
which exposes the schema of the `SetUIInfo2` method's argument.
Signed-off-by: Chengyang Zhu <colazcyg@gmail.com>
---
ui/dbus-console.c | 56 ++++++++++++++++++++++++++++++++++++++++++++
ui/dbus-display1.xml | 17 ++++++++++++++
2 files changed, 73 insertions(+)
diff --git a/ui/dbus-console.c b/ui/dbus-console.c
index e1ac06814b..853a8a4087 100644
--- a/ui/dbus-console.c
+++ b/ui/dbus-console.c
@@ -217,6 +217,40 @@ dbus_console_set_ui_info(DBusDisplayConsole *ddc,
return DBUS_METHOD_INVOCATION_HANDLED;
}
+static gboolean
+dbus_console_set_ui_info2(DBusDisplayConsole *ddc,
+ GDBusMethodInvocation *invocation,
+ GVariant *arg_ui_info)
+{
+ if (!qemu_console_ui_info_supported(ddc->dcl.con)) {
+ g_dbus_method_invocation_return_error(invocation,
+ DBUS_DISPLAY_ERROR,
+ DBUS_DISPLAY_ERROR_UNSUPPORTED,
+ "SetUIInfo2 is not supported");
+ return DBUS_METHOD_INVOCATION_HANDLED;
+ }
+
+ GVariantDict ui_info_dict;
+ g_variant_dict_init(&ui_info_dict, arg_ui_info);
+
+ QemuUIInfo info = *qemu_console_get_ui_info(ddc->dcl.con);
+
+ g_variant_dict_lookup(&ui_info_dict, "width_mm", "q", &info.width_mm);
+ g_variant_dict_lookup(&ui_info_dict, "height_mm", "q", &info.height_mm);
+ g_variant_dict_lookup(&ui_info_dict, "xoff", "i", &info.xoff);
+ g_variant_dict_lookup(&ui_info_dict, "yoff", "i", &info.yoff);
+ g_variant_dict_lookup(&ui_info_dict, "width", "u", &info.width);
+ g_variant_dict_lookup(&ui_info_dict, "height", "u", &info.height);
+ g_variant_dict_lookup(&ui_info_dict, "refresh_rate",
+ "u", &info.refresh_rate);
+
+ g_variant_dict_clear(&ui_info_dict);
+
+ qemu_console_set_ui_info(ddc->dcl.con, &info, false);
+ qemu_dbus_display1_console_complete_set_uiinfo2(ddc->iface, invocation);
+ return DBUS_METHOD_INVOCATION_HANDLED;
+}
+
#ifdef G_OS_WIN32
bool
dbus_win32_import_socket(GDBusMethodInvocation *invocation,
@@ -538,6 +572,23 @@ QemuConsole *dbus_display_console_get_qemu_console(DBusDisplayConsole *ddc)
return ddc->dcl.con;
}
+static GVariant *get_qemu_ui_info_types(void)
+{
+ GVariantBuilder builder;
+
+ g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sg}"));
+
+ g_variant_builder_add(&builder, "{sg}", "width_mm", "q");
+ g_variant_builder_add(&builder, "{sg}", "height_mm", "q");
+ g_variant_builder_add(&builder, "{sg}", "xoff", "i");
+ g_variant_builder_add(&builder, "{sg}", "yoff", "i");
+ g_variant_builder_add(&builder, "{sg}", "width", "u");
+ g_variant_builder_add(&builder, "{sg}", "height", "u");
+ g_variant_builder_add(&builder, "{sg}", "refresh_rate", "u");
+
+ return g_variant_builder_end(&builder);
+}
+
DBusDisplayConsole *
dbus_display_console_new(DBusDisplay *display, QemuConsole *con)
{
@@ -575,6 +626,7 @@ dbus_display_console_new(DBusDisplay *display, QemuConsole *con)
"width", qemu_console_get_width(con, 0),
"height", qemu_console_get_height(con, 0),
"device-address", device_addr,
+ "qemu-uiinfo-types", get_qemu_ui_info_types(),
"interfaces", interfaces,
NULL);
g_object_connect(ddc->iface,
@@ -583,6 +635,10 @@ dbus_display_console_new(DBusDisplay *display, QemuConsole *con)
"swapped-signal::handle-set-uiinfo",
dbus_console_set_ui_info, ddc,
NULL);
+ g_object_connect(ddc->iface,
+ "swapped-signal::handle-set-uiinfo2",
+ dbus_console_set_ui_info2, ddc,
+ NULL);
g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(ddc),
G_DBUS_INTERFACE_SKELETON(ddc->iface));
diff --git a/ui/dbus-display1.xml b/ui/dbus-display1.xml
index d96bae2ed6..aa1816d02c 100644
--- a/ui/dbus-display1.xml
+++ b/ui/dbus-display1.xml
@@ -100,6 +100,23 @@
<arg name="height" type="u" direction="in"/>
</method>
+ <!--
+ QemuUIInfoTypes:
+
+ A D-Bus dictionary which maps the names of QemuUIInfo members to D-Bus type signatures.
+ -->
+ <property name="QemuUIInfoTypes" type="a{sg}" access="read"/>
+
+ <!--
+ SetUIInfo2:
+ @ui_info: the new QemuUIInfo.
+
+ Modify the display settings.
+ -->
+ <method name="SetUIInfo2">
+ <arg name="ui_info" type="a{sv}" direction="in"/>
+ </method>
+
<!--
Label:
--
2.55.0
next prev parent reply other threads:[~2026-08-07 12:11 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-07 8:40 [PATCH RFC 0/1] an extensible SetUIInfo2 design Chengyang Zhu
2026-08-07 8:40 ` Chengyang Zhu [this message]
2026-08-10 7:20 ` Marc-André Lureau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260807084050.526109-2-colazcyg@gmail.com \
--to=colazcyg@gmail.com \
--cc=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.