summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPovilas Kanapickas <povilas@radix.lt>2021-02-08 02:59:44 +0200
committerPovilas Kanapickas <povilas@radix.lt>2021-02-08 02:59:44 +0200
commitbcb882cdf1476e0fee479edd42284d325ff0be2c (patch)
treefa524592c112d5e176461ddfd67026af9f2ce351
parent2b01b2250dd265acd2317e076eb6511f8b27b2ab (diff)
Add a XI2 mask builder
-rw-r--r--tests/common/helpers.cpp24
-rw-r--r--tests/common/helpers.h22
2 files changed, 40 insertions, 6 deletions
diff --git a/tests/common/helpers.cpp b/tests/common/helpers.cpp
index 33fbf76..479d41d 100644
--- a/tests/common/helpers.cpp
+++ b/tests/common/helpers.cpp
@@ -299,12 +299,24 @@ int double_cmp(double a, double b, int precision)
void SelectXI2Events(::Display *dpy, int deviceid, Window win, const std::vector<int>& evtypes)
{
- XIEventMask mask;
- unsigned char m[XIMaskLen(XI_LASTEVENT)] = {0};
+ EventMaskBuilder mask{deviceid, evtypes};
+ XISelectEvents(dpy, win, mask.GetMask(), 1);
+}
+
+void GrabXI2Device(::Display *dpy, int deviceid, Window grab_win, int grab_mode,
+ int paired_device_mode, const std::vector<int>& evtypes)
+{
+ EventMaskBuilder mask{deviceid, evtypes};
+ XIGrabDevice(dpy, deviceid, grab_win, CurrentTime, None, grab_mode, paired_device_mode, False,
+ mask.GetMask());
+}
+
+EventMaskBuilder::EventMaskBuilder(int deviceid, const std::vector<int>& evtypes)
+{
mask.deviceid = deviceid;
mask.mask_len = XIMaskLen(XI_LASTEVENT);
- mask.mask = m;
- for (auto evtype : evtypes)
- XISetMask(mask.mask, evtype);
- XISelectEvents(dpy, win, &mask, 1);
+ storage.resize(mask.mask_len, 0);
+ mask.mask = storage.data();
+ for (auto event : evtypes)
+ XISetMask(mask.mask, event);
}
diff --git a/tests/common/helpers.h b/tests/common/helpers.h
index 3576d93..56f7ce6 100644
--- a/tests/common/helpers.h
+++ b/tests/common/helpers.h
@@ -28,6 +28,7 @@
#include <string>
#include <xorg/gtest/xorg-gtest.h>
#include "xorg-conf.h"
+#include <X11/extensions/XInput2.h>
#include "xit-server.h"
@@ -185,5 +186,26 @@ int double_cmp(double a, double b, int precision = 2);
*/
void SelectXI2Events(Display *dpy, int deviceid, Window win,
const std::vector<int>& evtypes);
+
+/**
+ * Grab the specific device for event types given in evtypes
+ */
+void GrabXI2Device(::Display *dpy, int deviceid, Window grab_win, int grab_mode,
+ int paired_device_mode, const std::vector<int>& evtypes);
+
+/**
+ * Builds a XI2 event mask
+ */
+class EventMaskBuilder {
+public:
+ EventMaskBuilder(int deviceid, const std::vector<int>& evtypes);
+
+ XIEventMask* GetMask() { return &mask; }
+
+private:
+ XIEventMask mask;
+ std::vector<unsigned char> storage;
+};
+
#endif