summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-02-27 15:10:58 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-05-10 14:58:40 +1000
commita33c5787b5a63f742bc308d868235b9e7e70a5d0 (patch)
treeb5b885bc16ef71e050b6991c2e957b6357bd6833
parentae986afa600c9f704370c0f5ab1e9a3a6f13542d (diff)
server/grab: add test for early accept
A client may accept early, before it gets the ownership event. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--tests/server/grab.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/tests/server/grab.cpp b/tests/server/grab.cpp
index 6232a73..4c3bbc0 100644
--- a/tests/server/grab.cpp
+++ b/tests/server/grab.cpp
@@ -724,6 +724,84 @@ TEST_F(TouchGrabTest, TouchGrabPassedToTouch)
}
+TEST_F(TouchGrabTest, TouchGrabPassedToTouchEarlyAccept)
+{
+ XORG_TESTCASE("Client C1 has touch grab on root window.\n"
+ "Client C2 has touch grab with ownership on window.\n"
+ "Client C3 has touch grab with ownership on window.\n"
+ "Touch begin\n"
+ "Accept touch from C2.\n"
+ "Expect TouchEnd for C3.\n"
+ "Reject from C1\n"
+ "Expect TouchEnd for C1\n"
+ "Expect TouchOwnerhip for C2\n"
+ "Touch end\n"
+ "Expect TouchEnd for C2\n");
+
+ ::Display *dpy1 = Display();
+ ::Display *dpy2 = XOpenDisplay(server.GetDisplayString().c_str());
+ ::Display *dpy3 = XOpenDisplay(server.GetDisplayString().c_str());
+ XSynchronize(dpy1, True);
+ XSynchronize(dpy2, True);
+ XSynchronize(dpy3, True);
+
+ int major = 2, minor = 3;
+ XIQueryVersion(dpy2, &major, &minor);
+ XIQueryVersion(dpy3, &major, &minor);
+
+
+ Window root = DefaultRootWindow(dpy1);
+ Window win = CreateWindow(dpy3, None);
+ Window subwin = CreateWindow(dpy3, win);
+
+ 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));
+
+ XISetMask(mask.mask, XI_TouchOwnership);
+
+ ASSERT_EQ(Success, XIGrabTouchBegin(dpy2, VIRTUAL_CORE_POINTER_ID,
+ win, False, &mask, 1, &mods));
+ ASSERT_EQ(Success, XIGrabTouchBegin(dpy3, VIRTUAL_CORE_POINTER_ID,
+ subwin, False, &mask, 1, &mods));
+ delete[] mask.mask;
+
+ dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_begin.events");
+
+ /* C1 is owner, but all three get begin event */
+ ASSERT_EVENT(XIDeviceEvent, tbegin1, dpy1, GenericEvent, xi2_opcode, XI_TouchBegin);
+ ASSERT_EVENT(XIDeviceEvent, tbegin2, dpy2, GenericEvent, xi2_opcode, XI_TouchBegin);
+ ASSERT_EVENT(XIDeviceEvent, tbegin3, dpy3, GenericEvent, xi2_opcode, XI_TouchBegin);
+ ASSERT_TRUE(NoEventPending(dpy1));
+ ASSERT_TRUE(NoEventPending(dpy2));
+ ASSERT_TRUE(NoEventPending(dpy3));
+
+ /* Accept from C2, changes nothing on the wire yet */
+ XIAllowTouchEvents(dpy2, tbegin2->deviceid, tbegin2->detail, win, XIAcceptTouch);
+
+ /* Reject from C1, finishes for C1, owner is C2 */
+ XIAllowTouchEvents(dpy1, tbegin1->deviceid, tbegin1->detail, root, XIRejectTouch);
+ ASSERT_EVENT(XIDeviceEvent, tend1, dpy1, GenericEvent, xi2_opcode, XI_TouchEnd);
+ ASSERT_EVENT(XIDeviceEvent, towner2, dpy2, GenericEvent, xi2_opcode, XI_TouchOwnership);
+
+ /* Physicall end touch */
+ dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_end.events");
+ ASSERT_EVENT(XIDeviceEvent, tend2, dpy2, GenericEvent, xi2_opcode, XI_TouchEnd);
+ ASSERT_TRUE(NoEventPending(dpy2));
+
+ ASSERT_EVENT(XIDeviceEvent, tend3, dpy3, GenericEvent, xi2_opcode, XI_TouchEnd);
+ ASSERT_TRUE(NoEventPending(dpy3));
+}
+
/**