summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-05-13 15:49:21 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-05-13 15:49:21 +1000
commit50edd8597ed57d0a3153e9edf3b7206667126376 (patch)
treef721c8f943846ece34169838fa651aa7b2bf4411
parent8be277e206b06740b702fc869ab3d2d48caaa129 (diff)
server/grab: add test for touch grab → touch listener passing
This currently causes a stuck button in the server Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--tests/server/grab.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/server/grab.cpp b/tests/server/grab.cpp
index 0310965..c027026 100644
--- a/tests/server/grab.cpp
+++ b/tests/server/grab.cpp
@@ -683,6 +683,72 @@ public:
}
};
+TEST_F(TouchGrabTest, PassiveTouchGrabPassedToTouchClient)
+{
+ XORG_TESTCASE("Client 1: register for passive touch grab on roow window\n"
+ "Client 2: register for touch events on window\n"
+ "Trigger touch begin/end\n"
+ "Client 1: reject after TouchEnd\n"
+ "Client 2: verify touch event is received\n"
+ "Verify pointer has no button set\n");
+
+ int major = 2, minor = 2;
+ ::Display *dpy1 = Display();
+ ::Display *dpy2 = XOpenDisplay(server.GetDisplayString().c_str());
+ XSynchronize(dpy2, True);
+ XIQueryVersion(dpy2, &major, &minor);
+
+ 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));
+ XISelectEvents(dpy2, win, &mask, 1);
+ delete[] mask.mask;
+
+ 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_EVENT(XEvent, tbegin2, dpy2, GenericEvent, xi2_opcode, XI_TouchBegin);
+ ASSERT_EVENT(XEvent, tend2, dpy2, GenericEvent, xi2_opcode, XI_TouchEnd);
+ ASSERT_TRUE(NoEventPending(dpy2));
+ ASSERT_TRUE(NoEventPending(dpy1));
+
+ /* use a third client for checking pointer state, since a XI2.2 client
+ * won't see emulated touch state */
+ ::Display *dpy3 = XOpenDisplay(server.GetDisplayString().c_str());
+ XSynchronize(dpy3, True);
+ Window child;
+ double win_x, win_y;
+ double root_x, root_y;
+ XIButtonState buttons;
+ XIModifierState modifiers;
+ XIGroupState group;
+ XIQueryPointer(dpy3, VIRTUAL_CORE_POINTER_ID,
+ root, &root, &child,
+ &root_x, &root_y,
+ &win_x, &win_y,
+ &buttons, &modifiers, &group);
+
+ ASSERT_GE(buttons.mask_len, 1);
+ for (int i = 0; i < buttons.mask_len * 8; i++)
+ ASSERT_FALSE(XIMaskIsSet(buttons.mask, i));
+}
+
TEST_F(TouchGrabTest, TouchGrabPassedToCoreGrab)
{
XORG_TESTCASE("Client 1: Register for passive touch grab on root window\n"