qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/2] ui/touch: Move event handling to a common helper
@ 2023-06-15  9:06 Bilal Elmoussaoui
  2023-06-15  9:06 ` [PATCH v2 2/2] ui/dbus: Expose a touch device interface Bilal Elmoussaoui
  2023-06-15  9:27 ` [PATCH v2 1/2] ui/touch: Move event handling to a common helper Marc-André Lureau
  0 siblings, 2 replies; 4+ messages in thread
From: Bilal Elmoussaoui @ 2023-06-15  9:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bilal Elmoussaoui

To share code between the GTK and DBus UI bakcends
see the next commit for details

Signed-off-by: Bilal Elmoussaoui <belmouss@redhat.com>
---
 include/ui/console.h | 15 ++++++++++
 ui/console.c         | 65 ++++++++++++++++++++++++++++++++++++++++++++
 ui/gtk.c             | 61 ++++-------------------------------------
 3 files changed, 85 insertions(+), 56 deletions(-)

diff --git a/include/ui/console.h b/include/ui/console.h
index ae5ec46..2093e2a 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -5,6 +5,7 @@
 #include "qom/object.h"
 #include "qemu/notify.h"
 #include "qapi/qapi-types-ui.h"
+#include "ui/input.h"
 
 #ifdef CONFIG_OPENGL
 # include <epoxy/gl.h>
@@ -95,6 +96,20 @@ bool kbd_put_qcode_console(QemuConsole *s, int qcode, bool ctrl);
 void kbd_put_string_console(QemuConsole *s, const char *str, int len);
 void kbd_put_keysym(int keysym);
 
+/* Touch devices */
+typedef struct touch_slot {
+    int x;
+    int y;
+    int tracking_id;
+} touch_slot;
+
+void console_handle_touch_event(QemuConsole *con,
+                                struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX],
+                                uint64_t num_slot,
+                                int width, int height,
+                                double x, double y,
+                                InputMultiTouchType type,
+                                Error **errp);
 /* consoles */
 
 #define TYPE_QEMU_CONSOLE "qemu-console"
diff --git a/ui/console.c b/ui/console.c
index e173731..63e952e 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1635,6 +1635,71 @@ static bool console_compatible_with(QemuConsole *con,
     return true;
 }
 
+void console_handle_touch_event(QemuConsole *con,
+                                struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX],
+                                uint64_t num_slot,
+                                int width, int height,
+                                double x, double y,
+                                InputMultiTouchType type,
+                                Error **errp)
+{
+    struct touch_slot *slot;
+    bool needs_sync = false;
+    int update;
+    int i;
+
+    if (num_slot >= INPUT_EVENT_SLOTS_MAX) {
+        error_setg(errp,
+                   "Unexpected touch slot number: % " PRId64" >= %d",
+                   num_slot, INPUT_EVENT_SLOTS_MAX);
+        return;
+    }
+
+    slot = &touch_slots[num_slot];
+    slot->x = x;
+    slot->y = y;
+
+    if (type == INPUT_MULTI_TOUCH_TYPE_BEGIN) {
+        slot->tracking_id = num_slot;
+    }
+
+    for (i = 0; i < INPUT_EVENT_SLOTS_MAX; ++i) {
+        if (i == num_slot) {
+            update = type;
+        } else {
+            update = INPUT_MULTI_TOUCH_TYPE_UPDATE;
+        }
+
+        slot = &touch_slots[i];
+
+        if (slot->tracking_id == -1) {
+            continue;
+        }
+
+        if (update == INPUT_MULTI_TOUCH_TYPE_END) {
+            slot->tracking_id = -1;
+            qemu_input_queue_mtt(con, update, i, slot->tracking_id);
+            needs_sync = true;
+        } else {
+            qemu_input_queue_mtt(con, update, i, slot->tracking_id);
+            qemu_input_queue_btn(con, INPUT_BUTTON_TOUCH, true);
+            qemu_input_queue_mtt_abs(con,
+                                    INPUT_AXIS_X, (int) slot->x,
+                                    0, width,
+                                    i, slot->tracking_id);
+            qemu_input_queue_mtt_abs(con,
+                                    INPUT_AXIS_Y, (int) slot->y,
+                                    0, height,
+                                    i, slot->tracking_id);
+            needs_sync = true;
+        }
+    }
+
+    if (needs_sync) {
+        qemu_input_event_sync();
+    }
+}
+
 void qemu_console_set_display_gl_ctx(QemuConsole *con, DisplayGLCtx *gl)
 {
     /* display has opengl support */
diff --git a/ui/gtk.c b/ui/gtk.c
index e50f950..e09e164 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -130,11 +130,6 @@ typedef struct VCChardev VCChardev;
 DECLARE_INSTANCE_CHECKER(VCChardev, VC_CHARDEV,
                          TYPE_CHARDEV_VC)
 
-struct touch_slot {
-    int x;
-    int y;
-    int tracking_id;
-};
 static struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX];
 
 bool gtk_use_gl_area;
@@ -1068,27 +1063,12 @@ static gboolean gd_touch_event(GtkWidget *widget, GdkEventTouch *touch,
                                void *opaque)
 {
     VirtualConsole *vc = opaque;
-    struct touch_slot *slot;
     uint64_t num_slot = GPOINTER_TO_UINT(touch->sequence);
-    bool needs_sync = false;
-    int update;
     int type = -1;
-    int i;
-
-    if (num_slot >= INPUT_EVENT_SLOTS_MAX) {
-        warn_report("gtk: unexpected touch slot number: % " PRId64" >= %d\n",
-                    num_slot, INPUT_EVENT_SLOTS_MAX);
-        return FALSE;
-    }
-
-    slot = &touch_slots[num_slot];
-    slot->x = touch->x;
-    slot->y = touch->y;
 
     switch (touch->type) {
     case GDK_TOUCH_BEGIN:
         type = INPUT_MULTI_TOUCH_TYPE_BEGIN;
-        slot->tracking_id = num_slot;
         break;
     case GDK_TOUCH_UPDATE:
         type = INPUT_MULTI_TOUCH_TYPE_UPDATE;
@@ -1099,44 +1079,13 @@ static gboolean gd_touch_event(GtkWidget *widget, GdkEventTouch *touch,
         break;
     default:
         warn_report("gtk: unexpected touch event type\n");
+        return FALSE;
     }
 
-    for (i = 0; i < INPUT_EVENT_SLOTS_MAX; ++i) {
-        if (i == num_slot) {
-            update = type;
-        } else {
-            update = INPUT_MULTI_TOUCH_TYPE_UPDATE;
-        }
-
-        slot = &touch_slots[i];
-
-        if (slot->tracking_id == -1) {
-            continue;
-        }
-
-        if (update == INPUT_MULTI_TOUCH_TYPE_END) {
-            slot->tracking_id = -1;
-            qemu_input_queue_mtt(vc->gfx.dcl.con, update, i, slot->tracking_id);
-            needs_sync = true;
-        } else {
-            qemu_input_queue_mtt(vc->gfx.dcl.con, update, i, slot->tracking_id);
-            qemu_input_queue_btn(vc->gfx.dcl.con, INPUT_BUTTON_TOUCH, true);
-            qemu_input_queue_mtt_abs(vc->gfx.dcl.con,
-                                     INPUT_AXIS_X, (int) slot->x,
-                                     0, surface_width(vc->gfx.ds),
-                                     i, slot->tracking_id);
-            qemu_input_queue_mtt_abs(vc->gfx.dcl.con,
-                                     INPUT_AXIS_Y, (int) slot->y,
-                                     0, surface_height(vc->gfx.ds),
-                                     i, slot->tracking_id);
-            needs_sync = true;
-        }
-    }
-
-    if (needs_sync) {
-        qemu_input_event_sync();
-    }
-
+    console_handle_touch_event(vc->gfx.dcl.con, touch_slots,
+                               num_slot, surface_width(vc->gfx.ds),
+                               surface_height(vc->gfx.ds), touch->x,
+                               touch->y, type, &error_warn);
     return TRUE;
 }
 
-- 
2.40.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/2] ui/dbus: Expose a touch device interface
  2023-06-15  9:06 [PATCH v2 1/2] ui/touch: Move event handling to a common helper Bilal Elmoussaoui
@ 2023-06-15  9:06 ` Bilal Elmoussaoui
  2023-06-15  9:28   ` Marc-André Lureau
  2023-06-15  9:27 ` [PATCH v2 1/2] ui/touch: Move event handling to a common helper Marc-André Lureau
  1 sibling, 1 reply; 4+ messages in thread
From: Bilal Elmoussaoui @ 2023-06-15  9:06 UTC (permalink / raw)
  To: qemu-devel; +Cc: Bilal Elmoussaoui

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 <belmouss@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



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 1/2] ui/touch: Move event handling to a common helper
  2023-06-15  9:06 [PATCH v2 1/2] ui/touch: Move event handling to a common helper Bilal Elmoussaoui
  2023-06-15  9:06 ` [PATCH v2 2/2] ui/dbus: Expose a touch device interface Bilal Elmoussaoui
@ 2023-06-15  9:27 ` Marc-André Lureau
  1 sibling, 0 replies; 4+ messages in thread
From: Marc-André Lureau @ 2023-06-15  9:27 UTC (permalink / raw)
  To: Bilal Elmoussaoui; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 7833 bytes --]

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

> To share code between the GTK and DBus UI bakcends
> see the next commit for details
>
> Signed-off-by: Bilal Elmoussaoui <belmouss@redhat.com>
>

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


> ---
>  include/ui/console.h | 15 ++++++++++
>  ui/console.c         | 65 ++++++++++++++++++++++++++++++++++++++++++++
>  ui/gtk.c             | 61 ++++-------------------------------------
>  3 files changed, 85 insertions(+), 56 deletions(-)
>
> diff --git a/include/ui/console.h b/include/ui/console.h
> index ae5ec46..2093e2a 100644
> --- a/include/ui/console.h
> +++ b/include/ui/console.h
> @@ -5,6 +5,7 @@
>  #include "qom/object.h"
>  #include "qemu/notify.h"
>  #include "qapi/qapi-types-ui.h"
> +#include "ui/input.h"
>
>  #ifdef CONFIG_OPENGL
>  # include <epoxy/gl.h>
> @@ -95,6 +96,20 @@ bool kbd_put_qcode_console(QemuConsole *s, int qcode,
> bool ctrl);
>  void kbd_put_string_console(QemuConsole *s, const char *str, int len);
>  void kbd_put_keysym(int keysym);
>
> +/* Touch devices */
> +typedef struct touch_slot {
> +    int x;
> +    int y;
> +    int tracking_id;
> +} touch_slot;
> +
> +void console_handle_touch_event(QemuConsole *con,
> +                                struct touch_slot
> touch_slots[INPUT_EVENT_SLOTS_MAX],
> +                                uint64_t num_slot,
> +                                int width, int height,
> +                                double x, double y,
> +                                InputMultiTouchType type,
> +                                Error **errp);
>  /* consoles */
>
>  #define TYPE_QEMU_CONSOLE "qemu-console"
> diff --git a/ui/console.c b/ui/console.c
> index e173731..63e952e 100644
> --- a/ui/console.c
> +++ b/ui/console.c
> @@ -1635,6 +1635,71 @@ static bool console_compatible_with(QemuConsole
> *con,
>      return true;
>  }
>
> +void console_handle_touch_event(QemuConsole *con,
> +                                struct touch_slot
> touch_slots[INPUT_EVENT_SLOTS_MAX],
> +                                uint64_t num_slot,
> +                                int width, int height,
> +                                double x, double y,
> +                                InputMultiTouchType type,
> +                                Error **errp)
> +{
> +    struct touch_slot *slot;
> +    bool needs_sync = false;
> +    int update;
> +    int i;
> +
> +    if (num_slot >= INPUT_EVENT_SLOTS_MAX) {
> +        error_setg(errp,
> +                   "Unexpected touch slot number: % " PRId64" >= %d",
> +                   num_slot, INPUT_EVENT_SLOTS_MAX);
> +        return;
> +    }
> +
> +    slot = &touch_slots[num_slot];
> +    slot->x = x;
> +    slot->y = y;
> +
> +    if (type == INPUT_MULTI_TOUCH_TYPE_BEGIN) {
> +        slot->tracking_id = num_slot;
> +    }
> +
> +    for (i = 0; i < INPUT_EVENT_SLOTS_MAX; ++i) {
> +        if (i == num_slot) {
> +            update = type;
> +        } else {
> +            update = INPUT_MULTI_TOUCH_TYPE_UPDATE;
> +        }
> +
> +        slot = &touch_slots[i];
> +
> +        if (slot->tracking_id == -1) {
> +            continue;
> +        }
> +
> +        if (update == INPUT_MULTI_TOUCH_TYPE_END) {
> +            slot->tracking_id = -1;
> +            qemu_input_queue_mtt(con, update, i, slot->tracking_id);
> +            needs_sync = true;
> +        } else {
> +            qemu_input_queue_mtt(con, update, i, slot->tracking_id);
> +            qemu_input_queue_btn(con, INPUT_BUTTON_TOUCH, true);
> +            qemu_input_queue_mtt_abs(con,
> +                                    INPUT_AXIS_X, (int) slot->x,
> +                                    0, width,
> +                                    i, slot->tracking_id);
> +            qemu_input_queue_mtt_abs(con,
> +                                    INPUT_AXIS_Y, (int) slot->y,
> +                                    0, height,
> +                                    i, slot->tracking_id);
> +            needs_sync = true;
> +        }
> +    }
> +
> +    if (needs_sync) {
> +        qemu_input_event_sync();
> +    }
> +}
> +
>  void qemu_console_set_display_gl_ctx(QemuConsole *con, DisplayGLCtx *gl)
>  {
>      /* display has opengl support */
> diff --git a/ui/gtk.c b/ui/gtk.c
> index e50f950..e09e164 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -130,11 +130,6 @@ typedef struct VCChardev VCChardev;
>  DECLARE_INSTANCE_CHECKER(VCChardev, VC_CHARDEV,
>                           TYPE_CHARDEV_VC)
>
> -struct touch_slot {
> -    int x;
> -    int y;
> -    int tracking_id;
> -};
>  static struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX];
>
>  bool gtk_use_gl_area;
> @@ -1068,27 +1063,12 @@ static gboolean gd_touch_event(GtkWidget *widget,
> GdkEventTouch *touch,
>                                 void *opaque)
>  {
>      VirtualConsole *vc = opaque;
> -    struct touch_slot *slot;
>      uint64_t num_slot = GPOINTER_TO_UINT(touch->sequence);
> -    bool needs_sync = false;
> -    int update;
>      int type = -1;
> -    int i;
> -
> -    if (num_slot >= INPUT_EVENT_SLOTS_MAX) {
> -        warn_report("gtk: unexpected touch slot number: % " PRId64" >=
> %d\n",
> -                    num_slot, INPUT_EVENT_SLOTS_MAX);
> -        return FALSE;
> -    }
> -
> -    slot = &touch_slots[num_slot];
> -    slot->x = touch->x;
> -    slot->y = touch->y;
>
>      switch (touch->type) {
>      case GDK_TOUCH_BEGIN:
>          type = INPUT_MULTI_TOUCH_TYPE_BEGIN;
> -        slot->tracking_id = num_slot;
>          break;
>      case GDK_TOUCH_UPDATE:
>          type = INPUT_MULTI_TOUCH_TYPE_UPDATE;
> @@ -1099,44 +1079,13 @@ static gboolean gd_touch_event(GtkWidget *widget,
> GdkEventTouch *touch,
>          break;
>      default:
>          warn_report("gtk: unexpected touch event type\n");
> +        return FALSE;
>      }
>
> -    for (i = 0; i < INPUT_EVENT_SLOTS_MAX; ++i) {
> -        if (i == num_slot) {
> -            update = type;
> -        } else {
> -            update = INPUT_MULTI_TOUCH_TYPE_UPDATE;
> -        }
> -
> -        slot = &touch_slots[i];
> -
> -        if (slot->tracking_id == -1) {
> -            continue;
> -        }
> -
> -        if (update == INPUT_MULTI_TOUCH_TYPE_END) {
> -            slot->tracking_id = -1;
> -            qemu_input_queue_mtt(vc->gfx.dcl.con, update, i,
> slot->tracking_id);
> -            needs_sync = true;
> -        } else {
> -            qemu_input_queue_mtt(vc->gfx.dcl.con, update, i,
> slot->tracking_id);
> -            qemu_input_queue_btn(vc->gfx.dcl.con, INPUT_BUTTON_TOUCH,
> true);
> -            qemu_input_queue_mtt_abs(vc->gfx.dcl.con,
> -                                     INPUT_AXIS_X, (int) slot->x,
> -                                     0, surface_width(vc->gfx.ds),
> -                                     i, slot->tracking_id);
> -            qemu_input_queue_mtt_abs(vc->gfx.dcl.con,
> -                                     INPUT_AXIS_Y, (int) slot->y,
> -                                     0, surface_height(vc->gfx.ds),
> -                                     i, slot->tracking_id);
> -            needs_sync = true;
> -        }
> -    }
> -
> -    if (needs_sync) {
> -        qemu_input_event_sync();
> -    }
> -
> +    console_handle_touch_event(vc->gfx.dcl.con, touch_slots,
> +                               num_slot, surface_width(vc->gfx.ds),
> +                               surface_height(vc->gfx.ds), touch->x,
> +                               touch->y, type, &error_warn);
>      return TRUE;
>  }
>
> --
> 2.40.1
>
>
>

-- 
Marc-André Lureau

[-- Attachment #2: Type: text/html, Size: 10126 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 2/2] ui/dbus: Expose a touch device interface
  2023-06-15  9:06 ` [PATCH v2 2/2] ui/dbus: Expose a touch device interface Bilal Elmoussaoui
@ 2023-06-15  9:28   ` Marc-André Lureau
  0 siblings, 0 replies; 4+ messages in thread
From: Marc-André Lureau @ 2023-06-15  9:28 UTC (permalink / raw)
  To: Bilal Elmoussaoui; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 7101 bytes --]

On Thu, Jun 15, 2023 at 11:07 AM Bilal Elmoussaoui <belmouss@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 <belmouss@redhat.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lureau@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

[-- Attachment #2: Type: text/html, Size: 9177 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-06-15  9:28 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-15  9:06 [PATCH v2 1/2] ui/touch: Move event handling to a common helper Bilal Elmoussaoui
2023-06-15  9:06 ` [PATCH v2 2/2] ui/dbus: Expose a touch device interface Bilal Elmoussaoui
2023-06-15  9:28   ` Marc-André Lureau
2023-06-15  9:27 ` [PATCH v2 1/2] ui/touch: Move event handling to a common helper Marc-André Lureau

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).