From 307d80a45b2862ee7447e80689dd2d96c3dbfe06 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 30 Apr 2014 14:10:54 +1000 Subject: input/synaptics: add a couple of checks for synaptics top softbuttons Signed-off-by: Peter Hutterer --- .../touchpads/SynPS2-Synaptics-TouchPad-T440.desc | 117 ++++++++++ tests/input/synaptics.cpp | 235 +++++++++++++++++++++ 2 files changed, 352 insertions(+) create mode 100644 recordings/touchpads/SynPS2-Synaptics-TouchPad-T440.desc diff --git a/recordings/touchpads/SynPS2-Synaptics-TouchPad-T440.desc b/recordings/touchpads/SynPS2-Synaptics-TouchPad-T440.desc new file mode 100644 index 0000000..8afd902 --- /dev/null +++ b/recordings/touchpads/SynPS2-Synaptics-TouchPad-T440.desc @@ -0,0 +1,117 @@ +# EVEMU 1.2 +# Input device name: "SynPS/2 Synaptics TouchPad" +# Input device ID: bus 0x11 vendor 0x02 product 0x07 version 0x1b1 +# Supported events: +# Event type 0 (EV_SYN) +# Event code 0 (SYN_REPORT) +# Event code 1 (SYN_CONFIG) +# Event code 3 (SYN_DROPPED) +# Event type 1 (EV_KEY) +# Event code 272 (BTN_LEFT) +# Event code 325 (BTN_TOOL_FINGER) +# Event code 328 (BTN_TOOL_QUINTTAP) +# Event code 330 (BTN_TOUCH) +# Event code 333 (BTN_TOOL_DOUBLETAP) +# Event code 334 (BTN_TOOL_TRIPLETAP) +# Event code 335 (BTN_TOOL_QUADTAP) +# Event type 3 (EV_ABS) +# Event code 0 (ABS_X) +# Value 0 +# Min 1472 +# Max 5112 +# Fuzz 0 +# Flat 0 +# Resolution 42 +# Event code 1 (ABS_Y) +# Value 0 +# Min 1408 +# Max 3834 +# Fuzz 0 +# Flat 0 +# Resolution 42 +# Event code 24 (ABS_PRESSURE) +# Value 0 +# Min 0 +# Max 255 +# Fuzz 0 +# Flat 0 +# Resolution 0 +# Event code 28 (ABS_TOOL_WIDTH) +# Value 0 +# Min 0 +# Max 15 +# Fuzz 0 +# Flat 0 +# Resolution 0 +# Event code 47 (ABS_MT_SLOT) +# Value 0 +# Min 0 +# Max 1 +# Fuzz 0 +# Flat 0 +# Resolution 0 +# Event code 53 (ABS_MT_POSITION_X) +# Value 0 +# Min 1472 +# Max 5112 +# Fuzz 8 +# Flat 0 +# Resolution 42 +# Event code 54 (ABS_MT_POSITION_Y) +# Value 0 +# Min 1408 +# Max 3834 +# Fuzz 8 +# Flat 0 +# Resolution 42 +# Event code 57 (ABS_MT_TRACKING_ID) +# Value 0 +# Min 0 +# Max 65535 +# Fuzz 0 +# Flat 0 +# Resolution 0 +# Event code 58 (ABS_MT_PRESSURE) +# Value 0 +# Min 0 +# Max 255 +# Fuzz 0 +# Flat 0 +# Resolution 0 +# Properties: +# Property type 0 (INPUT_PROP_POINTER) +# Property type 2 (INPUT_PROP_BUTTONPAD) +# Property type 4 (INPUT_PROP_TOPBUTTONPAD) +N: SynPS/2 Synaptics TouchPad +I: 0011 0002 0007 01b1 +P: 15 00 00 00 00 00 00 00 +B: 00 0b 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 01 00 00 00 00 00 +B: 01 20 e5 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 01 00 00 00 00 00 00 00 00 +B: 02 00 00 00 00 00 00 00 00 +B: 03 03 00 00 11 00 80 60 06 +B: 04 00 00 00 00 00 00 00 00 +B: 05 00 00 00 00 00 00 00 00 +B: 11 00 00 00 00 00 00 00 00 +B: 12 00 00 00 00 00 00 00 00 +B: 15 00 00 00 00 00 00 00 00 +B: 15 00 00 00 00 00 00 00 00 +A: 00 1472 5112 0 0 42 +A: 01 1408 3834 0 0 42 +A: 18 0 255 0 0 0 +A: 1c 0 15 0 0 0 +A: 2f 0 1 0 0 0 +A: 35 1472 5112 8 0 42 +A: 36 1408 3834 8 0 42 +A: 39 0 65535 0 0 0 +A: 3a 0 255 0 0 0 diff --git a/tests/input/synaptics.cpp b/tests/input/synaptics.cpp index 51a03ec..ed747a6 100644 --- a/tests/input/synaptics.cpp +++ b/tests/input/synaptics.cpp @@ -638,6 +638,7 @@ public: nfingers_down |= 1 << slot; dev->PlayOne(EV_KEY, BTN_TOUCH, 1); dev->PlayOne(EV_ABS, ABS_MT_SLOT, slot); + dev->PlayOne(EV_ABS, ABS_PRESSURE, 40); dev->PlayOne(EV_ABS, ABS_MT_TRACKING_ID, tracking_id++); TouchUpdate(slot, x, y); } @@ -1045,6 +1046,14 @@ TEST_F(SynapticsClickpadTest, ClickFinger3Distance) ASSERT_EQ(release->xbutton.button, 3); } +TEST_F(SynapticsClickpadTest, SecondaryButtonPropertyNotSet) +{ + XORG_TESTCASE("Secondary software button property must not exist on this device\n"); + + int deviceid; + ASSERT_TRUE(FindInputDeviceByName(Display(), "--device--", &deviceid)); + ASSERT_FALSE(DevicePropertyExists(Display(), deviceid, "Synaptics Secondary Soft Button Areas")); +} /** * Synaptics driver test for clickpad devices with the SoftButtonArea option @@ -1583,6 +1592,232 @@ TEST_F(SynapticsScrollButtonTest, ScrollButtonUpDownMiddleDouble) ASSERT_EQ(middle4->xbutton.button, 2); } +class SynapticsSecondarySoftButtonTest : public SynapticsClickpadTest { +public: + /** + * Initializes a standard touchpad device. + */ + virtual void SetUp() { + SetDevice("touchpads/SynPS2-Synaptics-TouchPad-T440.desc"); + + xi2_major_minimum = 2; + xi2_minor_minimum = 1; + + XITServerInputTest::SetUp(); + } + + /** + * Sets up an xorg.conf for a single synaptics CorePointer device based on + * the evemu device. Options enabled: tapping (1 finger), two-finger + * vertical scroll. + */ + virtual void SetUpConfigAndLog() { + + config.AddDefaultScreenWithDriver(); + config.AddInputSection("synaptics", "--device--", + "Option \"Protocol\" \"event\"\n" + "Option \"CorePointer\" \"on\"\n" + "Option \"TapButton1\" \"1\"\n" + "Option \"GrabEventDevice\" \"1\"\n" + "Option \"FastTaps\" \"1\"\n" + "Option \"VertTwoFingerScroll\" \"1\"\n" + "Option \"SecondarySoftButtonAreas\" \"58% 0 0 8% 42% 58% 0 8%\"\n" + "Option \"Device\" \"" + dev->GetDeviceNode() + "\"\n"); + config.WriteConfig(); + } +}; + +TEST_F(SynapticsSecondarySoftButtonTest, PropertyExists) +{ + XORG_TESTCASE("Start with a default value for SecondarySoftButtonAreas\n" + "Expect the property to exist and be non-zero"); + + ::Display *dpy = Display(); + int deviceid; + ASSERT_EQ(FindInputDeviceByName(dpy, "--device--", &deviceid), 1); + + ASSERT_PROPERTY(int, prop, dpy, deviceid, "Synaptics Secondary Soft Button Areas"); + + ASSERT_EQ(prop.type, XA_INTEGER); + ASSERT_EQ(prop.nitems, 8); + ASSERT_EQ(prop.format, 32); + + ASSERT_NE(prop.data[0], 0); + ASSERT_NE(prop.data[3], 0); + ASSERT_NE(prop.data[4], 0); + ASSERT_NE(prop.data[5], 0); + ASSERT_NE(prop.data[7], 0); + + ASSERT_EQ(prop.data[1], 0); + ASSERT_EQ(prop.data[2], 0); + ASSERT_EQ(prop.data[6], 0); +} + +TEST_F(SynapticsSecondarySoftButtonTest, NoMovementWithinTopButtons) +{ + XORG_TESTCASE("Start with the top buttons enabled\n" + "Put a finger down in the top buttons\n" + "Move finger across, staying in the area\n" + "Don't expect events\n"); + + ::Display *dpy = Display(); + + XSelectInput(dpy, DefaultRootWindow(dpy), PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + TouchBegin(0, 1500, 1500); + TouchUpdate(0, 1600, 1500); + TouchUpdate(0, 1700, 1500); + TouchEnd(0); + + ASSERT_TRUE(NoEventPending(dpy)); +} + +TEST_F(SynapticsSecondarySoftButtonTest, NoMovementInTopButtonsAfterClick) +{ + XORG_TESTCASE("Start with the top buttons enabled\n" + "Put a finger down in the top buttons\n" + "Press\n" + "Move finger out of button area\n" + "Don't expect motion events\n"); + + ::Display *dpy = Display(); + + XSelectInput(dpy, DefaultRootWindow(dpy), PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + TouchBegin(0, 1500, 1500); + dev->PlayOne(EV_KEY, BTN_LEFT, 1, true); + TouchUpdate(0, 1600, 1500); + TouchUpdate(0, 1700, 1500); + + ASSERT_EVENT(XEvent, press, dpy, ButtonPress); + ASSERT_TRUE(NoEventPending(dpy)); + + dev->PlayOne(EV_KEY, BTN_LEFT, 0, true); + TouchEnd(0); + ASSERT_EVENT(XEvent, release, dpy, ButtonRelease); +} + +TEST_F(SynapticsSecondarySoftButtonTest, MovementInTopButtonsMovingOut) +{ + XORG_TESTCASE("Start with the top buttons enabled\n" + "Put a finger down in the top buttons\n" + "Move finger out of the buttons\n" + "Expect motion events\n"); + + ::Display *dpy = Display(); + + XSelectInput(dpy, DefaultRootWindow(dpy), PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + TouchBegin(0, 1500, 1500); + TouchUpdate(0, 1600, 2600); + TouchUpdate(0, 1700, 3500); + TouchEnd(0); + + ASSERT_EVENT(XEvent, motion, dpy, MotionNotify); +} + +TEST_F(SynapticsSecondarySoftButtonTest, MovementIntoTopButtons) +{ + XORG_TESTCASE("Start with the top buttons enabled\n" + "Put a finger down outside the top buttons\n" + "Move finger into the buttons\n" + "Expect motion events\n" + "Move finger within the buttons\n" + "Expect motion events\n"); + + ::Display *dpy = Display(); + + XSelectInput(dpy, DefaultRootWindow(dpy), PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + TouchBegin(0, 1500, 3500); + TouchUpdate(0, 1500, 2500); + TouchUpdate(0, 1500, 1500); + + while (XPending(dpy)) { + ASSERT_EVENT(XEvent, motion, dpy, MotionNotify); + XSync(dpy, False); + } + + TouchUpdate(0, 1600, 1500); + TouchUpdate(0, 1700, 1500); + TouchUpdate(0, 1800, 1500); + TouchUpdate(0, 1900, 1500); + + TouchEnd(0); + + ASSERT_EVENT(XEvent, motion, dpy, MotionNotify); + while (XPending(dpy)) { + ASSERT_EVENT(XEvent, motion, dpy, MotionNotify); + XSync(dpy, False); + } +} + +TEST_F(SynapticsSecondarySoftButtonTest, TopButtonLeftClick) +{ + XORG_TESTCASE("Start with the top buttons set\n" + "Put a finger down in the top buttons\n" + "Click\n" + "Expect left click\n"); + + ::Display *dpy = Display(); + + XSelectInput(dpy, DefaultRootWindow(dpy), PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + TouchBegin(0, 1500, 1500); + dev->PlayOne(EV_KEY, BTN_LEFT, 1, true); + dev->PlayOne(EV_KEY, BTN_LEFT, 0, true); + TouchEnd(0); + + ASSERT_EVENT(XEvent, press, dpy, ButtonPress); + ASSERT_EVENT(XEvent, release, dpy, ButtonRelease); + ASSERT_EQ(press->xbutton.button, 1); + ASSERT_EQ(release->xbutton.button, 1); +} + +TEST_F(SynapticsSecondarySoftButtonTest, TopButtonRightClick) +{ + XORG_TESTCASE("Start with the top buttons set\n" + "Put a finger down in the top buttons\n" + "Click\n" + "Expect right click\n"); + + ::Display *dpy = Display(); + + XSelectInput(dpy, DefaultRootWindow(dpy), PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + TouchBegin(0, 4500, 1500); + dev->PlayOne(EV_KEY, BTN_LEFT, 1, true); + dev->PlayOne(EV_KEY, BTN_LEFT, 0, true); + TouchEnd(0); + + ASSERT_EVENT(XEvent, press, dpy, ButtonPress); + ASSERT_EVENT(XEvent, release, dpy, ButtonRelease); + ASSERT_EQ(press->xbutton.button, 3); + ASSERT_EQ(release->xbutton.button, 3); +} + +TEST_F(SynapticsSecondarySoftButtonTest, TopButtonMiddleClick) +{ + XORG_TESTCASE("Start with the top buttons set\n" + "Put a finger down in the top buttons\n" + "Click\n" + "Expect middle click\n"); + + ::Display *dpy = Display(); + + XSelectInput(dpy, DefaultRootWindow(dpy), PointerMotionMask | ButtonPressMask | ButtonReleaseMask); + + TouchBegin(0, 3292, 1500); + dev->PlayOne(EV_KEY, BTN_LEFT, 1, true); + dev->PlayOne(EV_KEY, BTN_LEFT, 0, true); + TouchEnd(0); + + ASSERT_EVENT(XEvent, press, dpy, ButtonPress); + ASSERT_EVENT(XEvent, release, dpy, ButtonRelease); + ASSERT_EQ(press->xbutton.button, 2); + ASSERT_EQ(release->xbutton.button, 2); +} + int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); -- cgit v1.2.3