diff options
author | Povilas Kanapickas <povilas@radix.lt> | 2020-12-20 00:45:39 +0200 |
---|---|---|
committer | Povilas Kanapickas <povilas@radix.lt> | 2021-02-07 15:13:12 +0200 |
commit | a0976f77bcf912935bf0f8bd466e57fc20f43386 (patch) | |
tree | 5976cbb189660394ee984e0f58e19bb331314d0b | |
parent | 54ab1574c26c783cac9878930d80a8f47800d9b7 (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.cpp | 68 |
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 { |