diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2013-07-05 14:53:51 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2013-07-18 15:17:04 +1000 |
commit | bf7fc9521db715d1994c942c04fd6d1cc47a6335 (patch) | |
tree | f9267b8b80cd4ac12abe7576071a2ce88443b9af | |
parent | d3460b095ba37f13c9285ed94e2a184c8af282d9 (diff) |
server/grab: add a test of a pointer grab over poitner emulation
For a legacy client on a touch device
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | tests/server/grab.cpp | 175 |
1 files changed, 121 insertions, 54 deletions
diff --git a/tests/server/grab.cpp b/tests/server/grab.cpp index 840fc7b..ba08b0b 100644 --- a/tests/server/grab.cpp +++ b/tests/server/grab.cpp @@ -570,8 +570,129 @@ public: "Option \"CoreKeyboard\" \"on\"\n"); config.WriteConfig(); } + + virtual Window CreateWindow(::Display *dpy, Window parent) + { + Window win; + win = XCreateSimpleWindow(dpy, parent, 0, 0, + DisplayWidth(dpy, DefaultScreen(dpy)), + DisplayHeight(dpy, DefaultScreen(dpy)), + 0, 0, 0); + XSelectInput(dpy, win, StructureNotifyMask); + XMapWindow(dpy, win); + if (xorg::testing::XServer::WaitForEventOfType(dpy, MapNotify, -1, -1)) { + XEvent ev; + XNextEvent(dpy, &ev); + } else { + ADD_FAILURE() << "Failed waiting for Exposure"; + } + XSelectInput(dpy, win, 0); + XSync(dpy, False); + return win; + } + + virtual 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); + } + + /** + * Return a new synchronized client given our default server connection. + * Client is initialised for XI 2.2 + */ + virtual ::Display* NewClient(void) { + ::Display *d = XOpenDisplay(server.GetDisplayString().c_str()); + if (!d) + ADD_FAILURE() << "Failed to open display for new client.\n"; + XSynchronize(d, True); + int major = 2, minor = 2; + if (XIQueryVersion(d, &major, &minor) != Success) + ADD_FAILURE() << "XIQueryVersion failed on new client.\n"; + return d; + } + + virtual void TouchBegin(int x, int y) { + dev->PlayOne(EV_KEY, BTN_TOUCH, 1); + TouchUpdate(x, y); + } + + virtual void TouchUpdate(int x, int y) { + dev->PlayOne(EV_ABS, ABS_X, x); + dev->PlayOne(EV_ABS, ABS_Y, y); + dev->PlayOne(EV_ABS, ABS_MT_POSITION_X, x); + dev->PlayOne(EV_ABS, ABS_MT_POSITION_Y, y); + /* same values as the recordings file */ + dev->PlayOne(EV_ABS, ABS_MT_ORIENTATION, 0); + dev->PlayOne(EV_ABS, ABS_MT_TOUCH_MAJOR, 468); + dev->PlayOne(EV_ABS, ABS_MT_TOUCH_MINOR, 306); + dev->PlayOne(EV_SYN, SYN_MT_REPORT, 0); + dev->PlayOne(EV_SYN, SYN_REPORT, 0); + } + + virtual void TouchEnd() { + dev->PlayOne(EV_KEY, BTN_TOUCH, 0); + dev->PlayOne(EV_SYN, SYN_REPORT, 0); + } + }; +TEST_F(TouchGrabTest, ActivePointerGrabOverPointerSelection) +{ + XORG_TESTCASE("Client c1 creates window and selects for button press.\n" + "Client c2 has async active grab on the window\n" + "Touch the window\n"); + + ::Display *dpy1 = Display(); + ::Display *dpy2 = NewClient(); + + Window win = CreateWindow(dpy1, DefaultRootWindow(dpy1)); + + SelectXI2Events(dpy1, XIAllMasterDevices, win, + XI_ButtonPress, + XI_ButtonRelease, + XI_Motion, + -1); + GrabPointer(dpy2, VIRTUAL_CORE_POINTER_ID, win); + + TouchBegin(200, 200); + TouchUpdate(282, 282); + TouchEnd(); + + ASSERT_EVENT(XIDeviceEvent, press, dpy2, GenericEvent, xi2_opcode, XI_ButtonPress); + ASSERT_EVENT(XIDeviceEvent, motion, dpy2, GenericEvent, xi2_opcode, XI_Motion); + ASSERT_EVENT(XIDeviceEvent, release, dpy2, GenericEvent, xi2_opcode, XI_ButtonRelease); + + ASSERT_TRUE(NoEventPending(dpy2)); + + TouchBegin(210, 210); + TouchUpdate(292, 292); + TouchEnd(); + + ASSERT_EVENT(XIDeviceEvent, press2, dpy2, GenericEvent, xi2_opcode, XI_ButtonPress); + ASSERT_EVENT(XIDeviceEvent, motion2, dpy2, GenericEvent, xi2_opcode, XI_Motion); + ASSERT_EVENT(XIDeviceEvent, release2, dpy2, GenericEvent, xi2_opcode, XI_ButtonRelease); + + ASSERT_TRUE(NoEventPending(dpy2)); + ASSERT_TRUE(NoEventPending(dpy1)); + + XCloseDisplay(dpy2); +} + + class TouchGrabTestMultipleModes : public TouchGrabTest, public ::testing::WithParamInterface<int> { @@ -809,27 +930,6 @@ INSTANTIATE_TEST_CASE_P(, TouchGrabTestMultipleTaps, class TouchOwnershipTest : public TouchGrabTest { public: - Window CreateWindow(::Display *dpy, Window parent) - { - Window win; - win = XCreateSimpleWindow(dpy, parent, 0, 0, - DisplayWidth(dpy, DefaultScreen(dpy)), - DisplayHeight(dpy, DefaultScreen(dpy)), - 0, 0, 0); - XSelectInput(dpy, win, StructureNotifyMask); - XMapWindow(dpy, win); - if (xorg::testing::XServer::WaitForEventOfType(dpy, MapNotify, -1, -1)) { - XEvent ev; - XNextEvent(dpy, &ev); - } else { - ADD_FAILURE() << "Failed waiting for Exposure"; - } - XSelectInput(dpy, win, 0); - XSync(dpy, False); - return win; - } - - void GrabTouchOnWindow(::Display *dpy, Window win, bool ownership = false) { XIEventMask mask; @@ -874,25 +974,6 @@ 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; @@ -912,20 +993,6 @@ public: XSync(dpy, False); } - /** - * Return a new synchronized client given our default server connection. - * Client is initialised for XI 2.2 - */ - ::Display* NewClient(void) { - ::Display *d = XOpenDisplay(server.GetDisplayString().c_str()); - if (!d) - ADD_FAILURE() << "Failed to open display for new client.\n"; - XSynchronize(d, True); - int major = 2, minor = 2; - if (XIQueryVersion(d, &major, &minor) != Success) - ADD_FAILURE() << "XIQueryVersion failed on new client.\n"; - return d; - } }; TEST_F(TouchOwnershipTest, OwnershipAfterRejectTouch) |