[PATCH RFC 1/1] ui/dbus: add extensible SetUIInfo2 method

Chengyang Zhu <[email protected]>
Newsgroups gmane.comp.emulators.qemu
Message-ID <[email protected]>
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 <[email protected]>
---
 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.