summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPovilas Kanapickas <povilas@radix.lt>2020-12-20 00:45:39 +0200
committerPovilas Kanapickas <povilas@radix.lt>2021-02-07 15:13:12 +0200
commita0976f77bcf912935bf0f8bd466e57fc20f43386 (patch)
tree5976cbb189660394ee984e0f58e19bb331314d0b
parent54ab1574c26c783cac9878930d80a8f47800d9b7 (diff)
Test case when emulated touch is replayed after a explicit grab
This covers https://bugs.freedesktop.org/show_bug.cgi?id=96536
-rw-r--r--tests/server/grab.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/server/grab.cpp b/tests/server/grab.cpp
index 367451a..0a4c4f0 100644
--- a/tests/server/grab.cpp
+++ b/tests/server/grab.cpp
@@ -1232,6 +1232,74 @@ TEST_F(TouchGrabTest, GrabMultipleTouchpoints)
EXPECT_EVENT(XIDeviceEvent, tend2, dpy, GenericEvent, xi2_opcode, XI_TouchEnd);
}
+TEST_F(TouchGrabTest, DISABLED_DeviceUngrabDropsEmulatedEvents)
+{
+ XORG_TESTCASE("Client A actively asynchronously grabs touch events on the device.\n"
+ "Client B selects for pointer events.\n"
+ "A touch begins and ends.\n"
+ "Client A deactivates the active grab.\n"
+ "https://gitlab.freedesktop.org/xorg/xserver/-/issues/7\n"
+ "https://bugs.freedesktop.org/show_bug.cgi?id=96536\n");
+ ::Display *dpy = Display();
+ XSynchronize(dpy, True);
+
+ ::Display *dpy2 = NewClient();
+
+ /* Client A grabs the device */
+ XIEventMask mask;
+ mask.deviceid = VIRTUAL_CORE_POINTER_ID;
+ mask.mask_len = XIMaskLen(XI_TouchOwnership);
+ mask.mask = new unsigned char[mask.mask_len]();
+
+ XISetMask(mask.mask, XI_TouchBegin);
+ XISetMask(mask.mask, XI_TouchUpdate);
+ XISetMask(mask.mask, XI_TouchEnd);
+ XISetMask(mask.mask, XI_TouchOwnership);
+
+ ASSERT_EQ(Success, XIGrabDevice(dpy, VIRTUAL_CORE_POINTER_ID,
+ DefaultRootWindow(dpy), CurrentTime, None,
+ GrabModeAsync, GrabModeAsync,
+ False, &mask));
+
+ delete[] mask.mask;
+ XSync(dpy, False);
+
+ /* Client B selects for events on window */
+ Window win = CreateWindow(dpy2, DefaultRootWindow(dpy2));
+
+ mask.deviceid = XIAllMasterDevices;
+ mask.mask_len = XIMaskLen(XI_TouchEnd);
+ mask.mask = new unsigned char[mask.mask_len]();
+
+ XISetMask(mask.mask, XI_ButtonPress);
+ XISetMask(mask.mask, XI_Motion);
+ XISetMask(mask.mask, XI_ButtonRelease);
+
+ ASSERT_EQ(Success, XISelectEvents(dpy2, win, &mask, 1));
+
+ delete[] mask.mask;
+ XSync(dpy2, False);
+
+ /* Touch begins */
+ TouchDev().TouchBegin(200, 200, 0);
+ TouchDev().TouchEnd(200, 200, 0);
+
+ /* Expect emulated motion and button press events on A */
+ ASSERT_EVENT(XIDeviceEvent, A_begin, dpy, GenericEvent, xi2_opcode, XI_TouchBegin);
+ ASSERT_EVENT(XIDeviceEvent, A_owner, dpy, GenericEvent, xi2_opcode, XI_TouchOwnership);
+ ASSERT_EVENT(XIDeviceEvent, A_end, dpy, GenericEvent, xi2_opcode, XI_TouchEnd);
+
+ /* No other events should come */
+ ASSERT_TRUE(NoEventPending(dpy));
+ ASSERT_TRUE(NoEventPending(dpy2));
+
+ /* Client A ungrabs */
+ XIUngrabDevice(dpy, VIRTUAL_CORE_POINTER_ID, CurrentTime);
+ XSync(dpy, False);
+
+ ASSERT_TRUE(NoEventPending(dpy));
+ ASSERT_TRUE(NoEventPending(dpy2));
+}
class TouchGrabTestOnLegacyClient : public TouchGrabTest {
void SetUp() override {