summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPovilas Kanapickas <povilas@radix.lt>2021-05-30 18:24:00 +0300
committerPovilas Kanapickas <povilas@radix.lt>2021-05-30 18:24:00 +0300
commit2d8cc468335383243aa9fb2cea3b8ae3bb2c66c1 (patch)
tree3a2c72f500649e6226ac0b99533bfcf6e70a2bac
parent02e4f2ffac4b7b6101ab370569e5180d74c3c4c0 (diff)
Implement support for playing of touchpad gesture events
-rw-r--r--gtest/include/xorg/gtest/inputtest/xorg-gtest-device.h24
-rw-r--r--gtest/src/inputtest-device.cpp79
-rw-r--r--gtest/src/inputtest-driver-connection.cpp135
-rw-r--r--gtest/src/inputtest-driver-connection.h22
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<xf86ITEventGesturePinch>(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<xf86ITEventGestureSwipe>(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<class T>
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<Private> d_;
bool TryConnectToDriver();
void EnsureConnectedToDriver();
+ void EnsureVersionMinor(unsigned major, unsigned minor);
};
} // namespace inputtest