Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
ui/dbus: Expose a touch device interface
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>
Message-Id: <20230619095337.9899-3-belmouss@redhat.com>
  • Loading branch information
bilelmoussaoui authored and elmarco committed Jun 27, 2023
1 parent b659678 commit de9f844
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 3 deletions.
59 changes: 58 additions & 1 deletion ui/dbus-console.c
Expand Up @@ -32,6 +32,8 @@

#include "dbus.h"

static struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX];

struct _DBusDisplayConsole {
GDBusObjectSkeleton parent_instance;
DisplayChangeListener dcl;
Expand All @@ -44,6 +46,7 @@ struct _DBusDisplayConsole {
QKbdState *kbd;

QemuDBusDisplay1Mouse *iface_mouse;
QemuDBusDisplay1MultiTouch *iface_touch;
gboolean last_set;
guint last_x;
guint last_y;
Expand Down Expand Up @@ -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_multi_touch_complete_send_event(ddc->iface_touch,
invocation);
}
return DBUS_METHOD_INVOCATION_HANDLED;
}

static gboolean
dbus_mouse_set_pos(DBusDisplayConsole *ddc,
GDBusMethodInvocation *invocation,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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_multi_touch_skeleton_new();
g_object_connect(ddc->iface_touch,
"swapped-signal::handle-send-event", dbus_touch_send_event, ddc,
NULL);
qemu_dbus_display1_multi_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);
Expand Down
45 changes: 43 additions & 2 deletions ui/dbus-display1.xml
Expand Up @@ -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.MultiTouch` interfaces when available.
-->
<interface name="org.qemu.Display1.Console">
<!--
Expand Down Expand Up @@ -236,6 +237,46 @@
<property name="IsAbsolute" type="b" access="read"/>
</interface>

<!--
org.qemu.Display1.MultiTouch:
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.MultiTouch">
<!--
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:
Expand Down
1 change: 1 addition & 0 deletions ui/trace-events
Expand Up @@ -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"
Expand Down

0 comments on commit de9f844

Please sign in to comment.