summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2012-11-26 15:17:26 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2012-11-26 15:17:26 +1000
commit69e6c14b99b167344679808002434777091d067e (patch)
tree6433fda456246e8323b7e481aa28bb360cee47ab
parent7ba52267513b97baaf98f54c5d09234284e74a38 (diff)
server/grab: more grab tests
-rw-r--r--tests/server/grab.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/tests/server/grab.cpp b/tests/server/grab.cpp
index 823c465..add2325 100644
--- a/tests/server/grab.cpp
+++ b/tests/server/grab.cpp
@@ -530,6 +530,25 @@ public:
XSync(dpy, False);
}
+ void GrabPointer(::Display *dpy, int deviceid, Window win)
+ {
+ XIEventMask mask;
+ mask.deviceid = deviceid;
+ mask.mask_len = XIMaskLen(XI_TouchOwnership);
+ mask.mask = new unsigned char[mask.mask_len]();
+
+ XISetMask(mask.mask, XI_ButtonPress);
+ XISetMask(mask.mask, XI_ButtonRelease);
+ XISetMask(mask.mask, XI_Motion);
+
+ ASSERT_EQ(Success, XIGrabDevice(dpy, deviceid,
+ win, CurrentTime, None,
+ GrabModeAsync, GrabModeAsync,
+ False, &mask));
+ delete[] mask.mask;
+ XSync(dpy, False);
+ }
+
void SelectTouchOnWindow(::Display *dpy, Window win, bool ownership = false)
{
XIEventMask mask;
@@ -952,6 +971,98 @@ TEST_F(TouchOwnershipTest, ActiveGrabOwnershipUngrabDevice)
AssertNoEventsPending(dpy);
}
+TEST_F(TouchOwnershipTest, ActivePointerGrabForWholeTouch)
+{
+ XORG_TESTCASE("Client A pointer-grabs the device.\n"
+ "Client B registers for TouchOwnership events on a window.\n"
+ "TouchBegin/End in the window.\n"
+ "Expect ButtonPress/Release to A.\n"
+ "Expect TouchBegin/End to B without ownership.");
+
+ ::Display *dpy = Display();
+ XSynchronize(dpy, True);
+
+ ::Display *dpy2 = NewClient();
+
+ /* CLient B selects for events on window */
+ Window win = CreateWindow(dpy2, DefaultRootWindow(dpy));
+ SelectTouchOnWindow(dpy2, win, true);
+
+ /* Client A grabs the device */
+ GrabPointer(dpy, VIRTUAL_CORE_POINTER_ID, DefaultRootWindow(dpy));
+
+ dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_begin.events");
+
+ EventWrapper<XIDeviceEvent> A_btnpress(dpy, GenericEvent, xi2_opcode, XI_ButtonPress);
+ ASSERT_TRUE(A_btnpress.ev);
+
+ EventWrapper<XIDeviceEvent> B_begin(dpy2, GenericEvent, xi2_opcode, XI_TouchBegin);
+ ASSERT_TRUE(B_begin.ev);
+
+ /* No ownership event on the wire */
+ AssertNoEventsPending(dpy2);
+
+ dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_end.events");
+
+ EventWrapper<XIDeviceEvent> A_btnrelease(dpy, GenericEvent, xi2_opcode, XI_ButtonRelease);
+ ASSERT_TRUE(A_btnrelease.ev);
+
+ /* One event on the wire and it's TouchEnd, not ownership */
+ ASSERT_EQ(XPending(dpy2), 1);
+
+ XIUngrabDevice(dpy, VIRTUAL_CORE_POINTER_ID, CurrentTime);
+
+ EventWrapper<XIDeviceEvent> B_end(dpy2, GenericEvent, xi2_opcode, XI_TouchEnd);
+ ASSERT_TRUE(B_end.ev);
+
+ AssertNoEventsPending(dpy);
+}
+
+TEST_F(TouchOwnershipTest, ActivePointerUngrabDuringTouch)
+{
+ XORG_TESTCASE("Client A pointer-grabs the device.\n"
+ "Client B registers for TouchOwnership events on a window.\n"
+ "TouchBegin in the window.\n"
+ "Expect ButtonPress to A.\n"
+ "Ungrab pointer.\n"
+ "Expect TouchBegin and TouchOwnership to B.\n"
+ "TouchEnd in the window, expect TouchEnd on B.\n");
+
+ ::Display *dpy = Display();
+ XSynchronize(dpy, True);
+
+ ::Display *dpy2 = NewClient();
+
+ /* CLient B selects for events on window */
+ Window win = CreateWindow(dpy2, DefaultRootWindow(dpy));
+ SelectTouchOnWindow(dpy2, win, true);
+
+ /* Client A grabs the device */
+ GrabPointer(dpy, VIRTUAL_CORE_POINTER_ID, DefaultRootWindow(dpy));
+
+ dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_begin.events");
+
+ EventWrapper<XIDeviceEvent> A_btnpress(dpy, GenericEvent, xi2_opcode, XI_ButtonPress);
+ ASSERT_TRUE(A_btnpress.ev);
+
+ EventWrapper<XIDeviceEvent> B_begin(dpy2, GenericEvent, xi2_opcode, XI_TouchBegin);
+ ASSERT_TRUE(B_begin.ev);
+
+ /* No ownership event on the wire */
+ AssertNoEventsPending(dpy2);
+
+ XIUngrabDevice(dpy, VIRTUAL_CORE_POINTER_ID, CurrentTime);
+
+ EventWrapper<XITouchOwnershipEvent> B_ownership(dpy2, GenericEvent, xi2_opcode, XI_TouchOwnership);
+ ASSERT_TRUE(B_ownership.ev);
+
+ dev->Play(RECORDINGS_DIR "tablets/N-Trig-MultiTouch.touch_1_end.events");
+
+ EventWrapper<XIDeviceEvent> B_end(dpy2, GenericEvent, xi2_opcode, XI_TouchEnd);
+ ASSERT_TRUE(B_end.ev);
+
+ AssertNoEventsPending(dpy);
+}
#endif /* HAVE_XI22 */