From 2d8cc468335383243aa9fb2cea3b8ae3bb2c66c1 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sun, 30 May 2021 18:24:00 +0300 Subject: Implement support for playing of touchpad gesture events --- .../xorg/gtest/inputtest/xorg-gtest-device.h | 24 +++- gtest/src/inputtest-device.cpp | 79 +++++++++++- gtest/src/inputtest-driver-connection.cpp | 135 +++++++++++++++++++++ gtest/src/inputtest-driver-connection.h | 22 ++++ 4 files changed, 255 insertions(+), 5 deletions(-) diff --git a/gtest/include/xorg/gtest/inputtest/xorg-gtest-device.h b/gtest/include/xorg/gtest/inputtest/xorg-gtest-device.h index 4c959c2..c21df43 100644 --- a/gtest/include/xorg/gtest/inputtest/xorg-gtest-device.h +++ b/gtest/include/xorg/gtest/inputtest/xorg-gtest-device.h @@ -40,8 +40,9 @@ enum class DeviceType { KEYBOARD, POINTER, POINTER_ABSOLUTE, + POINTER_GESTURE, POINTER_ABSOLUTE_PROXIMITY, - TOUCH + TOUCH, }; #define XORG_INPUTTEST_DRIVER "inputtest" @@ -98,6 +99,27 @@ public: void TouchEnd(double x, double y, std::uint32_t id); void TouchEnd(double x, double y, std::uint32_t id, const Valuators& extra_valuators); + void GestureSwipeBegin(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + void GestureSwipeUpdate(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + void GestureSwipeEnd(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + void GestureSwipeCancel(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + + void GesturePinchBegin(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); + void GesturePinchUpdate(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); + void GesturePinchEnd(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); + void GesturePinchCancel(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); private: struct Private; diff --git a/gtest/src/inputtest-device.cpp b/gtest/src/inputtest-device.cpp index b66b072..8b73972 100644 --- a/gtest/src/inputtest-device.cpp +++ b/gtest/src/inputtest-device.cpp @@ -48,6 +48,7 @@ std::string DeviceTypeToOptionString(DeviceType type) switch (type) { case DeviceType::KEYBOARD: return "Keyboard"; case DeviceType::POINTER: return "Pointer"; + case DeviceType::POINTER_GESTURE: return "PointerGesture"; case DeviceType::POINTER_ABSOLUTE: return "PointerAbsolute"; case DeviceType::POINTER_ABSOLUTE_PROXIMITY: return "PointerAbsoluteProximity"; case DeviceType::TOUCH: return "Touch"; @@ -100,7 +101,7 @@ void Device::WaitForDriver() void Device::RelMotion(double x, double y) { - EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER}); + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER, DeviceType::POINTER_GESTURE}); Valuators valuators; valuators.Set(0, x); valuators.Set(1, y); @@ -109,7 +110,7 @@ void Device::RelMotion(double x, double y) void Device::RelMotion(double x, double y, const Valuators& extra_valuators) { - EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER}); + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER, DeviceType::POINTER_GESTURE}); Valuators valuators = extra_valuators; valuators.Set(0, x); valuators.Set(1, y); @@ -150,13 +151,14 @@ void Device::ButtonDown(std::int32_t button) { EnsureDeviceTypeForEvent(d_->device_type, { DeviceType::POINTER, + DeviceType::POINTER_GESTURE, DeviceType::POINTER_ABSOLUTE, DeviceType::POINTER_ABSOLUTE_PROXIMITY, }); if (button == 0 || button >= 256) throw std::runtime_error("Invalid button number"); - if (d_->device_type == DeviceType::POINTER) { + if (d_->device_type == DeviceType::POINTER || d_->device_type == DeviceType::POINTER_GESTURE) { d_->connection.ButtonDownRel(button, Valuators()); } else { d_->connection.ButtonDownAbs(button, Valuators()); @@ -167,13 +169,14 @@ void Device::ButtonUp(std::int32_t button) { EnsureDeviceTypeForEvent(d_->device_type, { DeviceType::POINTER, + DeviceType::POINTER_GESTURE, DeviceType::POINTER_ABSOLUTE, DeviceType::POINTER_ABSOLUTE_PROXIMITY, }); if (button == 0 || button >= 256) throw std::runtime_error("Invalid button number"); - if (d_->device_type == DeviceType::POINTER) { + if (d_->device_type == DeviceType::POINTER || d_->device_type == DeviceType::POINTER_GESTURE) { d_->connection.ButtonUpRel(button, Valuators()); } else { d_->connection.ButtonUpAbs(button, Valuators()); @@ -246,6 +249,74 @@ void Device::TouchEnd(double x, double y, std::uint32_t id, const Valuators& ext d_->connection.TouchEnd(id, valuators); } +void Device::GestureSwipeBegin(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GestureSwipeBegin(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y); +} + +void Device::GestureSwipeUpdate(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GestureSwipeUpdate(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y); +} + +void Device::GestureSwipeEnd(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GestureSwipeEnd(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y); +} + +void Device::GestureSwipeCancel(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GestureSwipeCancel(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y); +} + +void Device::GesturePinchBegin(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GesturePinchBegin(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y, scale, delta_angle); +} + +void Device::GesturePinchUpdate(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GesturePinchUpdate(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y, scale, delta_angle); +} + +void Device::GesturePinchEnd(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GesturePinchEnd(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y, scale, delta_angle); +} + +void Device::GesturePinchCancel(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureDeviceTypeForEvent(d_->device_type, {DeviceType::POINTER_GESTURE}); + d_->connection.GesturePinchCancel(num_touches, delta_x, delta_y, + delta_unaccel_x, delta_unaccel_y, scale, delta_angle); +} + } // namespace xorg } // namespace testing } // namespace inputtest diff --git a/gtest/src/inputtest-driver-connection.cpp b/gtest/src/inputtest-driver-connection.cpp index 564d100..3032981 100644 --- a/gtest/src/inputtest-driver-connection.cpp +++ b/gtest/src/inputtest-driver-connection.cpp @@ -85,6 +85,39 @@ void SendTouchEvent(int fd, std::uint16_t type, std::uint32_t touchid, const Val SendEvent(fd, ev); } +void SendGesturePinchEvent(int fd, std::uint16_t type, std::uint32_t flags, + std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + xf86ITEventGesturePinch ev = CreateEvent(XF86IT_EVENT_GESTURE_PINCH); + ev.gesture_type = type; + ev.num_touches = num_touches; + ev.flags = flags; + ev.delta_x = delta_x; + ev.delta_y = delta_y; + ev.delta_unaccel_x = delta_unaccel_x; + ev.delta_unaccel_y = delta_unaccel_y; + ev.scale = scale; + ev.delta_angle = delta_angle; + SendEvent(fd, ev); +} + +void SendGestureSwipeEvent(int fd, std::uint16_t type, std::uint32_t flags, + std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + xf86ITEventGestureSwipe ev = CreateEvent(XF86IT_EVENT_GESTURE_SWIPE); + ev.gesture_type = type; + ev.num_touches = num_touches; + ev.flags = flags; + ev.delta_x = delta_x; + ev.delta_y = delta_y; + ev.delta_unaccel_x = delta_unaccel_x; + ev.delta_unaccel_y = delta_unaccel_y; + SendEvent(fd, ev); +} + template T ReceiveResponse(int fd, int type) { @@ -206,6 +239,12 @@ void DriverConnection::EnsureConnectedToDriver() throw std::runtime_error("DriverConnection is not open"); } +void DriverConnection::EnsureVersionMinor(unsigned major, unsigned minor) +{ + if (d_->protocol_version_major != major || d_->protocol_version_minor < minor) + throw std::runtime_error("Server does not support event type"); +} + void DriverConnection::RelMotion(const Valuators& valuators) { EnsureConnectedToDriver(); @@ -315,6 +354,102 @@ void DriverConnection::TouchEnd(std::uint32_t id, const Valuators& valuators) Sync(); } +void DriverConnection::GestureSwipeBegin(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGestureSwipeEvent(d_->socket_fd, XI_GestureSwipeBegin, 0, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y); + Sync(); +} + +void DriverConnection::GestureSwipeUpdate(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGestureSwipeEvent(d_->socket_fd, XI_GestureSwipeUpdate, 0, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y); + Sync(); +} + +void DriverConnection::GestureSwipeEnd(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGestureSwipeEvent(d_->socket_fd, XI_GestureSwipeEnd, 0, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y); + Sync(); +} + +void DriverConnection::GestureSwipeCancel(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGestureSwipeEvent(d_->socket_fd, XI_GestureSwipeEnd, XIGestureSwipeEventCancelled, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y); + Sync(); +} + +void DriverConnection::GesturePinchBegin(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGesturePinchEvent(d_->socket_fd, XI_GesturePinchBegin, 0, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y, + scale, delta_angle); + Sync(); +} + +void DriverConnection::GesturePinchUpdate(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGesturePinchEvent(d_->socket_fd, XI_GesturePinchUpdate, 0, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y, + scale, delta_angle); + Sync(); +} + +void DriverConnection::GesturePinchEnd(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGesturePinchEvent(d_->socket_fd, XI_GesturePinchEnd, 0, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y, + scale, delta_angle); + Sync(); +} + +void DriverConnection::GesturePinchCancel(std::uint16_t num_touches, + double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle) +{ + EnsureConnectedToDriver(); + EnsureVersionMinor(1, 1); + SendGesturePinchEvent(d_->socket_fd, XI_GesturePinchEnd, XIGesturePinchEventCancelled, + num_touches, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y, + scale, delta_angle); + Sync(); +} + } // namespace xorg } // namespace testing } // namespace inputtest diff --git a/gtest/src/inputtest-driver-connection.h b/gtest/src/inputtest-driver-connection.h index af17cac..1c1a925 100644 --- a/gtest/src/inputtest-driver-connection.h +++ b/gtest/src/inputtest-driver-connection.h @@ -97,12 +97,34 @@ public: void TouchUpdate(std::uint32_t id, const Valuators& valuators); void TouchEnd(std::uint32_t id, const Valuators& valuators); + void GestureSwipeBegin(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + void GestureSwipeUpdate(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + void GestureSwipeEnd(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + void GestureSwipeCancel(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y); + + void GesturePinchBegin(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); + void GesturePinchUpdate(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); + void GesturePinchEnd(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); + void GesturePinchCancel(std::uint16_t num_touches, double delta_x, double delta_y, + double delta_unaccel_x, double delta_unaccel_y, + double scale, double delta_angle); private: struct Private; std::unique_ptr d_; bool TryConnectToDriver(); void EnsureConnectedToDriver(); + void EnsureVersionMinor(unsigned major, unsigned minor); }; } // namespace inputtest -- cgit v1.2.3