diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2012-11-26 15:17:26 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2012-11-26 15:17:26 +1000 |
commit | 69e6c14b99b167344679808002434777091d067e (patch) | |
tree | 6433fda456246e8323b7e481aa28bb360cee47ab | |
parent | 7ba52267513b97baaf98f54c5d09234284e74a38 (diff) |
server/grab: more grab tests
-rw-r--r-- | tests/server/grab.cpp | 111 |
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 */ |