diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2013-02-27 14:31:28 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2013-05-10 14:58:40 +1000 |
commit | ae986afa600c9f704370c0f5ab1e9a3a6f13542d (patch) | |
tree | 148f9fcc64be41bb5d54fe77fb356e5c399b5db0 | |
parent | 965c8384cc64472967d4923bbff6e1aaa5207321 (diff) |
server/grab: add test for proper grab passing
A client rejecting an already-finished grab should pass the touch on to the
next client. That client needs to get the touch end event as well as the
replayed Begin/End events.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | tests/server/grab.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/server/grab.cpp b/tests/server/grab.cpp index 2e2c763..6232a73 100644 --- a/tests/server/grab.cpp +++ b/tests/server/grab.cpp @@ -677,6 +677,55 @@ TEST_F(TouchGrabTest, TouchGrabPassedToCoreGrab) } } +TEST_F(TouchGrabTest, TouchGrabPassedToTouch) +{ + XORG_TESTCASE("Client C1 has touch grab on root window.\n" + "Client c2 has touch grab on window.\n" + "Touch begin/end\n" + "Reject from C1\n" + "Verify C2 gets all events\n"); + + ::Display *dpy1 = Display(); + ::Display *dpy2 = XOpenDisplay(server.GetDisplayString().c_str()); + XSynchronize(dpy2, True); + + Window root = DefaultRootWindow(dpy1); + Window win = CreateWindow(dpy2, None); + + XIEventMask mask; + mask.deviceid = VIRTUAL_CORE_POINTER_ID; + mask.mask_len = XIMaskLen(XI_TouchEnd); + mask.mask = new unsigned char[mask.mask_len](); + XISetMask(mask.mask, XI_TouchBegin); + XISetMask(mask.mask, XI_TouchUpdate); + XISetMask(mask.mask, XI_TouchEnd); + + XIGrabModifiers mods = {}; + mods.modifiers = XIAnyModifier; + ASSERT_EQ(Success, XIGrabTouchBegin(dpy1, VIRTUAL_CORE_POINTER_ID, + root, False, &mask, 1, &mods)); + ASSERT_EQ(Success, XIGrabTouchBegin(dpy2, VIRTUAL_CORE_POINTER_ID, + win, False, &mask, 1, &mods)); + delete[] mask.mask; + + for (int i = 0; i < 10; i++) { + dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_begin.events"); + dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_end.events"); + + ASSERT_EVENT(XIDeviceEvent, tbegin, dpy1, GenericEvent, xi2_opcode, XI_TouchBegin); + ASSERT_EVENT(XIDeviceEvent, tend, dpy1, GenericEvent, xi2_opcode, XI_TouchEnd); + XIAllowTouchEvents(dpy1, tbegin->deviceid, tbegin->detail, root, XIRejectTouch); + ASSERT_TRUE(NoEventPending(dpy1)); + + ASSERT_EVENT(XIDeviceEvent, tbegin2, dpy2, GenericEvent, xi2_opcode, XI_TouchBegin); + ASSERT_EVENT(XIDeviceEvent, tend2, dpy2, GenericEvent, xi2_opcode, XI_TouchEnd); + ASSERT_TRUE(NoEventPending(dpy2)); + } + +} + + + /** * @tparam AsyncPointer, SyncPointer, ReplayPointer */ |