On Thu, Jun 15, 2023 at 11:07 AM Bilal Elmoussaoui <belmo...@redhat.com>
wrote:

> So that clients making use of the DBus backend could
> send touch events through the new org.qemu.Display1.Touch
> interface
>
> Signed-off-by: Bilal Elmoussaoui <belmo...@redhat.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com>


> ---
>  ui/dbus-console.c    | 59 +++++++++++++++++++++++++++++++++++++++++++-
>  ui/dbus-display1.xml | 45 +++++++++++++++++++++++++++++++--
>  ui/trace-events      |  1 +
>  3 files changed, 102 insertions(+), 3 deletions(-)
>
> diff --git a/ui/dbus-console.c b/ui/dbus-console.c
> index f77bc49..7722f39 100644
> --- a/ui/dbus-console.c
> +++ b/ui/dbus-console.c
> @@ -32,6 +32,8 @@
>
>  #include "dbus.h"
>
> +static struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX];
> +
>  struct _DBusDisplayConsole {
>      GDBusObjectSkeleton parent_instance;
>      DisplayChangeListener dcl;
> @@ -44,6 +46,7 @@ struct _DBusDisplayConsole {
>      QKbdState *kbd;
>
>      QemuDBusDisplay1Mouse *iface_mouse;
> +    QemuDBusDisplay1Touch *iface_touch;
>      gboolean last_set;
>      guint last_x;
>      guint last_y;
> @@ -345,6 +348,46 @@ dbus_mouse_rel_motion(DBusDisplayConsole *ddc,
>      return DBUS_METHOD_INVOCATION_HANDLED;
>  }
>
> +static gboolean
> +dbus_touch_send_event(DBusDisplayConsole *ddc,
> +                      GDBusMethodInvocation *invocation,
> +                      guint kind, uint64_t num_slot,
> +                      double x, double y)
> +{
> +    Error *error = NULL;
> +    int width, height;
> +    trace_dbus_touch_send_event(kind, num_slot, x, y);
> +
> +    if (kind != INPUT_MULTI_TOUCH_TYPE_BEGIN &&
> +        kind != INPUT_MULTI_TOUCH_TYPE_UPDATE &&
> +        kind != INPUT_MULTI_TOUCH_TYPE_CANCEL &&
> +        kind != INPUT_MULTI_TOUCH_TYPE_END)
> +    {
> +        g_dbus_method_invocation_return_error(
> +            invocation, DBUS_DISPLAY_ERROR,
> +            DBUS_DISPLAY_ERROR_INVALID,
> +            "Invalid touch event kind");
> +        return DBUS_METHOD_INVOCATION_HANDLED;
> +    }
> +    width = qemu_console_get_width(ddc->dcl.con, 0);
> +    height = qemu_console_get_height(ddc->dcl.con, 0);
> +
> +    console_handle_touch_event(ddc->dcl.con, touch_slots,
> +                               num_slot, width, height,
> +                               x, y, kind, &error);
> +    if (error != NULL) {
> +        g_dbus_method_invocation_return_error(
> +            invocation, DBUS_DISPLAY_ERROR,
> +            DBUS_DISPLAY_ERROR_INVALID,
> +            error_get_pretty(error), NULL);
> +        error_free(error);
> +    } else {
> +        qemu_dbus_display1_touch_complete_send_event(ddc->iface_touch,
> +                                                     invocation);
> +    }
> +    return DBUS_METHOD_INVOCATION_HANDLED;
> +}
> +
>  static gboolean
>  dbus_mouse_set_pos(DBusDisplayConsole *ddc,
>                     GDBusMethodInvocation *invocation,
> @@ -440,7 +483,7 @@ dbus_display_console_new(DBusDisplay *display,
> QemuConsole *con)
>      g_autofree char *label = NULL;
>      char device_addr[256] = "";
>      DBusDisplayConsole *ddc;
> -    int idx;
> +    int idx, i;
>
>      assert(display);
>      assert(con);
> @@ -495,6 +538,20 @@ dbus_display_console_new(DBusDisplay *display,
> QemuConsole *con)
>      g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(ddc),
>          G_DBUS_INTERFACE_SKELETON(ddc->iface_mouse));
>
> +    ddc->iface_touch = qemu_dbus_display1_touch_skeleton_new();
> +    g_object_connect(ddc->iface_touch,
> +        "swapped-signal::handle-send-event", dbus_touch_send_event, ddc,
> +        NULL);
> +    qemu_dbus_display1_touch_set_max_slots(ddc->iface_touch,
> +                                           INPUT_EVENT_SLOTS_MAX);
> +    g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(ddc),
> +        G_DBUS_INTERFACE_SKELETON(ddc->iface_touch));
> +
> +    for (i = 0; i < INPUT_EVENT_SLOTS_MAX; i++) {
> +        struct touch_slot *slot = &touch_slots[i];
> +        slot->tracking_id = -1;
> +    }
> +
>      register_displaychangelistener(&ddc->dcl);
>      ddc->mouse_mode_notifier.notify = dbus_mouse_mode_change;
>      qemu_add_mouse_mode_change_notifier(&ddc->mouse_mode_notifier);
> diff --git a/ui/dbus-display1.xml b/ui/dbus-display1.xml
> index c3b2293..a98cfd1 100644
> --- a/ui/dbus-display1.xml
> +++ b/ui/dbus-display1.xml
> @@ -39,8 +39,9 @@
>        "Text" (see :dbus:prop:`Type` and other properties).
>
>        Interactions with a console may be done with
> -      :dbus:iface:`org.qemu.Display1.Keyboard` and
> -      :dbus:iface:`org.qemu.Display1.Mouse` interfaces when available.
> +      :dbus:iface:`org.qemu.Display1.Keyboard`,
> +      :dbus:iface:`org.qemu.Display1.Mouse` and
> +      :dbus:iface:`org.qemu.Display1.Touch` interfaces when available.
>    -->
>    <interface name="org.qemu.Display1.Console">
>      <!--
> @@ -236,6 +237,46 @@
>      <property name="IsAbsolute" type="b" access="read"/>
>    </interface>
>
> +  <!--
> +      org.qemu.Display1.Touch:
> +
> +      This interface in implemented on ``/org/qemu/Display1/Console_$id``
> (see
> +      :dbus:iface:`~org.qemu.Display1.Console` documentation).
> +
> +      .. _dbus-kind-values:
> +
> +      **Kind values**::
> +
> +        Begin       = 0
> +        Update      = 1
> +        End         = 2
> +        Cancel      = 3
> +  -->
> +  <interface name="org.qemu.Display1.Touch">
> +    <!--
> +        SendEvent:
> +        @kind: The touch event kind
> +        @num_slot: The slot number.
> +        @x: The x coordinates.
> +        @y: The y coordinates.
> +
> +        Send a touch gesture event.
> +    -->
> +    <method name="SendEvent">
> +      <arg type="u" name="kind" direction="in"/>
> +      <arg type="t" name="num_slot" direction="in"/>
> +      <arg type="d" name="x" direction="in"/>
> +      <arg type="d" name="y" direction="in"/>
> +    </method>
> +
> +    <!--
> +        MaxSlots:
> +
> +        The maximum number of slots.
> +    -->
> +    <property name="MaxSlots" type="i" access="read"/>
> +  </interface>
> +
>    <!--
>        org.qemu.Display1.Listener:
>
> diff --git a/ui/trace-events b/ui/trace-events
> index 6747361..138a09c 100644
> --- a/ui/trace-events
> +++ b/ui/trace-events
> @@ -154,6 +154,7 @@ dbus_mouse_press(unsigned int button) "button %u"
>  dbus_mouse_release(unsigned int button) "button %u"
>  dbus_mouse_set_pos(unsigned int x, unsigned int y) "x=%u, y=%u"
>  dbus_mouse_rel_motion(int dx, int dy) "dx=%d, dy=%d"
> +dbus_touch_send_event(unsigned int kind, uint32_t num_slot, uint32_t x,
> uint32_t y) "kind=%u, num_slot=%u, x=%d, y=%d"
>  dbus_update(int x, int y, int w, int h) "x=%d, y=%d, w=%d, h=%d"
>  dbus_clipboard_grab_failed(void) ""
>  dbus_clipboard_register(const char *bus_name) "peer %s"
> --
> 2.40.1
>
>
>

-- 
Marc-André Lureau

Reply via email to