diff options
author | Povilas Kanapickas <povilas@radix.lt> | 2021-02-08 02:59:44 +0200 |
---|---|---|
committer | Povilas Kanapickas <povilas@radix.lt> | 2021-02-08 02:59:44 +0200 |
commit | bcb882cdf1476e0fee479edd42284d325ff0be2c (patch) | |
tree | fa524592c112d5e176461ddfd67026af9f2ce351 | |
parent | 2b01b2250dd265acd2317e076eb6511f8b27b2ab (diff) |
Add a XI2 mask builder
-rw-r--r-- | tests/common/helpers.cpp | 24 | ||||
-rw-r--r-- | tests/common/helpers.h | 22 |
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 |