summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2014-04-30 14:10:54 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2014-05-01 12:50:02 +1000
commit307d80a45b2862ee7447e80689dd2d96c3dbfe06 (patch)
treeb5c9ef46f1800a923602f4d7c8723eaf68754018
parent56142453c46d9875bef55d1dfc04a6ce53b7e86c (diff)
input/synaptics: add a couple of checks for synaptics top softbuttonsHEADmaster
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--recordings/touchpads/SynPS2-Synaptics-TouchPad-T440.desc117
-rw-r--r--tests/input/synaptics.cpp235
2 files changed, 352 insertions, 0 deletions
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();