* [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 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
* 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
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).