mirror of https://github.com/xemu-project/xemu.git
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>
This commit is contained in:
parent
b659678598
commit
de9f844ce2
|
@ -32,6 +32,8 @@
|
||||||
|
|
||||||
#include "dbus.h"
|
#include "dbus.h"
|
||||||
|
|
||||||
|
static struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX];
|
||||||
|
|
||||||
struct _DBusDisplayConsole {
|
struct _DBusDisplayConsole {
|
||||||
GDBusObjectSkeleton parent_instance;
|
GDBusObjectSkeleton parent_instance;
|
||||||
DisplayChangeListener dcl;
|
DisplayChangeListener dcl;
|
||||||
|
@ -44,6 +46,7 @@ struct _DBusDisplayConsole {
|
||||||
QKbdState *kbd;
|
QKbdState *kbd;
|
||||||
|
|
||||||
QemuDBusDisplay1Mouse *iface_mouse;
|
QemuDBusDisplay1Mouse *iface_mouse;
|
||||||
|
QemuDBusDisplay1MultiTouch *iface_touch;
|
||||||
gboolean last_set;
|
gboolean last_set;
|
||||||
guint last_x;
|
guint last_x;
|
||||||
guint last_y;
|
guint last_y;
|
||||||
|
@ -345,6 +348,46 @@ dbus_mouse_rel_motion(DBusDisplayConsole *ddc,
|
||||||
return DBUS_METHOD_INVOCATION_HANDLED;
|
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
|
static gboolean
|
||||||
dbus_mouse_set_pos(DBusDisplayConsole *ddc,
|
dbus_mouse_set_pos(DBusDisplayConsole *ddc,
|
||||||
GDBusMethodInvocation *invocation,
|
GDBusMethodInvocation *invocation,
|
||||||
|
@ -440,7 +483,7 @@ dbus_display_console_new(DBusDisplay *display, QemuConsole *con)
|
||||||
g_autofree char *label = NULL;
|
g_autofree char *label = NULL;
|
||||||
char device_addr[256] = "";
|
char device_addr[256] = "";
|
||||||
DBusDisplayConsole *ddc;
|
DBusDisplayConsole *ddc;
|
||||||
int idx;
|
int idx, i;
|
||||||
|
|
||||||
assert(display);
|
assert(display);
|
||||||
assert(con);
|
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_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(ddc),
|
||||||
G_DBUS_INTERFACE_SKELETON(ddc->iface_mouse));
|
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);
|
register_displaychangelistener(&ddc->dcl);
|
||||||
ddc->mouse_mode_notifier.notify = dbus_mouse_mode_change;
|
ddc->mouse_mode_notifier.notify = dbus_mouse_mode_change;
|
||||||
qemu_add_mouse_mode_change_notifier(&ddc->mouse_mode_notifier);
|
qemu_add_mouse_mode_change_notifier(&ddc->mouse_mode_notifier);
|
||||||
|
|
|
@ -39,8 +39,9 @@
|
||||||
"Text" (see :dbus:prop:`Type` and other properties).
|
"Text" (see :dbus:prop:`Type` and other properties).
|
||||||
|
|
||||||
Interactions with a console may be done with
|
Interactions with a console may be done with
|
||||||
:dbus:iface:`org.qemu.Display1.Keyboard` and
|
:dbus:iface:`org.qemu.Display1.Keyboard`,
|
||||||
:dbus:iface:`org.qemu.Display1.Mouse` interfaces when available.
|
:dbus:iface:`org.qemu.Display1.Mouse` and
|
||||||
|
:dbus:iface:`org.qemu.Display1.MultiTouch` interfaces when available.
|
||||||
-->
|
-->
|
||||||
<interface name="org.qemu.Display1.Console">
|
<interface name="org.qemu.Display1.Console">
|
||||||
<!--
|
<!--
|
||||||
|
@ -236,6 +237,46 @@
|
||||||
<property name="IsAbsolute" type="b" access="read"/>
|
<property name="IsAbsolute" type="b" access="read"/>
|
||||||
</interface>
|
</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:
|
org.qemu.Display1.Listener:
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,7 @@ dbus_mouse_press(unsigned int button) "button %u"
|
||||||
dbus_mouse_release(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_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_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_update(int x, int y, int w, int h) "x=%d, y=%d, w=%d, h=%d"
|
||||||
dbus_clipboard_grab_failed(void) ""
|
dbus_clipboard_grab_failed(void) ""
|
||||||
dbus_clipboard_register(const char *bus_name) "peer %s"
|
dbus_clipboard_register(const char *bus_name) "peer %s"
|
||||||
|
|
Loading…
Reference in New Issue