summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2012-12-06 14:50:13 -0500
committerJasper St. Pierre <jstpierre@mecheye.net>2012-12-06 18:03:27 -0500
commit175164c149dae289943f69bbaa817a50da516f5e (patch)
tree615150cb3fe7d94e1d1fe310b9a3708c1c033db9
parenteb0a6285fea074a744bf1da1593841fdbe30f405 (diff)
barriers: Add tests for passive grabs
-rw-r--r--tests/server/barriers-notify.cpp91
1 files changed, 87 insertions, 4 deletions
diff --git a/tests/server/barriers-notify.cpp b/tests/server/barriers-notify.cpp
index 062b76b..9dea1c0 100644
--- a/tests/server/barriers-notify.cpp
+++ b/tests/server/barriers-notify.cpp
@@ -510,18 +510,101 @@ TEST_F(BarrierNotify, EventsDuringPassiveGrab)
"Trigger a passive pointer grab\n"
"Move pointer against barrier.\n"
"Expect events\n");
- /* FIXME:
- variations
- - core, xi2 (xi1 not needed)
+ /* variations
+ TODO: - core, xi2 (xi1 not needed)
- barrier event masks set in grab mask
- owner_events true/false
- - grab window == barrier window or other window
+ TODO: - grab window == barrier window or other window
if OE is true and mask is set → event
if OE is false and mask is set → event
if OE is true and mask is not set, but set on window → event
if OE is false and mask is not set, but set on window → no event
*/
+
+ ::Display *dpy = Display();
+ Window root = DefaultRootWindow(dpy);
+
+ XIGrabModifiers mods = { (int)XIAnyModifier, 0 };
+
+ unsigned char event_mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
+ XIEventMask event_mask = { XIAllMasterDevices, sizeof (event_mask_bits), event_mask_bits };
+ XISetMask(event_mask_bits, XI_BarrierHit);
+
+ unsigned char no_mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
+ XIEventMask no_mask = { XIAllMasterDevices, sizeof (no_mask_bits), no_mask_bits };
+
+ PointerBarrier barrier = XFixesCreatePointerBarrier(dpy, root, 20, 20, 20, 40, 0, 0, NULL);
+ XSync(dpy, False);
+
+ /* if OE is true and mask is not set, but set on window → event */
+ XIWarpPointer(dpy, VIRTUAL_CORE_POINTER_ID, None, root, 0, 0, 0, 0, 30, 30);
+ XISelectEvents(dpy, root, &event_mask, 1);
+ XIGrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, None, GrabModeAsync, GrabModeAsync, True, &no_mask, 1, &mods);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 1, True);
+ dev->PlayOne(EV_REL, REL_X, -40, True);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 0, True);
+ ASSERT_TRUE(xorg::testing::XServer::WaitForEventOfType(dpy, GenericEvent, xi2_opcode, XI_BarrierHit, 500));
+ {
+ XITEvent<XIBarrierEvent> hit(dpy, GenericEvent, xi2_opcode, XI_BarrierHit);
+ ASSERT_TRUE(hit.ev);
+ ASSERT_EQ(hit.ev->window, root);
+ ASSERT_EQ(hit.ev->root, root);
+ ASSERT_EQ(hit.ev->barrier, barrier);
+ ASSERT_EQ(hit.ev->root_x, 20);
+ ASSERT_EQ(hit.ev->root_y, 30);
+ }
+ XIUngrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, 1, &mods);
+
+ /* if OE is false and mask is not set, but set on window → no event */
+ XIWarpPointer(dpy, VIRTUAL_CORE_POINTER_ID, None, root, 0, 0, 0, 0, 30, 30);
+ XISelectEvents(dpy, root, &event_mask, 1);
+ XIGrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, None, GrabModeAsync, GrabModeAsync, False, &no_mask, 1, &mods);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 1, True);
+ dev->PlayOne(EV_REL, REL_X, -40, True);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 0, True);
+ ASSERT_FALSE(xorg::testing::XServer::WaitForEvent(dpy, 500));
+ XIUngrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, 1, &mods);
+
+ /* if OE is true and mask is set → event */
+ XIWarpPointer(dpy, VIRTUAL_CORE_POINTER_ID, None, root, 0, 0, 0, 0, 30, 30);
+ XISelectEvents(dpy, root, &no_mask, 1);
+ XIGrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, None, GrabModeAsync, GrabModeAsync, True, &event_mask, 1, &mods);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 1, True);
+ dev->PlayOne(EV_REL, REL_X, -40, True);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 0, True);
+ ASSERT_TRUE(xorg::testing::XServer::WaitForEventOfType(dpy, GenericEvent, xi2_opcode, XI_BarrierHit, 500));
+ {
+ XITEvent<XIBarrierEvent> hit(dpy, GenericEvent, xi2_opcode, XI_BarrierHit);
+ ASSERT_TRUE(hit.ev);
+ ASSERT_EQ(hit.ev->window, root);
+ ASSERT_EQ(hit.ev->root, root);
+ ASSERT_EQ(hit.ev->barrier, barrier);
+ ASSERT_EQ(hit.ev->root_x, 20);
+ ASSERT_EQ(hit.ev->root_y, 30);
+ }
+ XIUngrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, 1, &mods);
+
+ /* if OE is false and mask is set → event */
+ XIWarpPointer(dpy, VIRTUAL_CORE_POINTER_ID, None, root, 0, 0, 0, 0, 30, 30);
+ XISelectEvents(dpy, root, &no_mask, 1);
+ XIGrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, None, GrabModeAsync, GrabModeAsync, False, &event_mask, 1, &mods);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 1, True);
+ dev->PlayOne(EV_REL, REL_X, -40, True);
+ dev->PlayOne(EV_KEY, BTN_LEFT, 0, True);
+ ASSERT_TRUE(xorg::testing::XServer::WaitForEventOfType(dpy, GenericEvent, xi2_opcode, XI_BarrierHit, 500));
+ {
+ XITEvent<XIBarrierEvent> hit(dpy, GenericEvent, xi2_opcode, XI_BarrierHit);
+ ASSERT_TRUE(hit.ev);
+ ASSERT_EQ(hit.ev->window, root);
+ ASSERT_EQ(hit.ev->root, root);
+ ASSERT_EQ(hit.ev->barrier, barrier);
+ ASSERT_EQ(hit.ev->root_x, 20);
+ ASSERT_EQ(hit.ev->root_y, 30);
+ }
+ XIUngrabButton(dpy, VIRTUAL_CORE_POINTER_ID, 1, root, 1, &mods);
+
+ XFixesDestroyPointerBarrier(dpy, barrier);
}
TEST_F(BarrierNotify, BarrierRandREventsVertical)