summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-02-27 14:31:28 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-05-10 14:58:40 +1000
commitae986afa600c9f704370c0f5ab1e9a3a6f13542d (patch)
tree148f9fcc64be41bb5d54fe77fb356e5c399b5db0
parent965c8384cc64472967d4923bbff6e1aaa5207321 (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.cpp49
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
*/