Commit 1c539b3b authored by Peter Hutterer's avatar Peter Hutterer
Browse files

Merge branch 'evemu-additions'

parents fe6331a4 879f0195
......@@ -102,6 +102,31 @@ class Device {
*/
const std::string& GetDeviceNode(void);
/**
* Check if a device supports a specific event.
*
* @param [in] type Type of the event (EV_REL, EV_ABS, ...)
* @param [in] code Event code (ABS_X, REL_Y, ...)
*
* @return true if this device supports this event or false otherwise.
*/
bool HasEvent(int type, int code);
/**
* Retrieve data about an absolute axis on this device.
*
* @param [in] code The axis to query (e.g. ABS_X)
* @param [out] min Min value for this axis
* @param [out] max Max value for this axis
* @param [out] fuzz Fuzz value for this axis
* @param [out] flat Flat value for this axis
* @param [out] resolution Resolution of this axis
*
* @return false if this device doesn't have this axis, or true on success
*/
bool GetAbsData(int code, int *min, int *max, int *fuzz = NULL, int *flat = NULL, int *resolution = NULL);
private:
struct Private;
std::auto_ptr<Private> d_;
......
......@@ -236,6 +236,27 @@ void xorg::testing::evemu::Device::PlayOne(int type, int code, int value, bool s
}
}
bool xorg::testing::evemu::Device::HasEvent(int type, int code)
{
return evemu_has_event(d_->device, type, code);
}
bool xorg::testing::evemu::Device::GetAbsData(int code, int *min, int *max, int *fuzz, int *flat, int *resolution)
{
if (!HasEvent(EV_ABS, code))
return false;
*min = evemu_get_abs_minimum(d_->device, code);
*max = evemu_get_abs_maximum(d_->device, code);
if (fuzz)
*fuzz = evemu_get_abs_fuzz(d_->device, code);
if (flat)
*flat = evemu_get_abs_flat(d_->device, code);
if (resolution)
*resolution = evemu_get_abs_resolution(d_->device, code);
return true;
}
const std::string& xorg::testing::evemu::Device::GetDeviceNode(void) {
if (d_->device_node.empty())
GuessDeviceNode(d_->ctime);
......
N: SynPS/2 Synaptics TouchPad
I: 0011 0002 0007 01b1
P: 05 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 5472 8 0
A: 01 1408 4448 8 0
A: 18 0 255 0 0
A: 1c 0 15 0 0
A: 2f 0 1 0 0
A: 35 1472 5472 8 0
A: 36 1408 4448 8 0
A: 39 0 65535 0 0
A: 3a 0 255 0 0
......@@ -2,6 +2,9 @@
#include <xorg/gtest/xorg-gtest.h>
#ifdef HAVE_EVEMU
#ifndef BTN_TOOL_QUINTTAP
#define BTN_TOOL_QUINTTAP 0x148
#endif
using namespace xorg::testing;
......@@ -24,6 +27,170 @@ TEST(Device, InotifyWait)
ASSERT_FALSE(d.GetDeviceNode().empty());
}
TEST(Device, HasEvent)
{
XORG_TESTCASE("HasEvent must return the right bits.\n");
xorg::testing::evemu::Device d(TEST_ROOT_DIR "PIXART-USB-OPTICAL-MOUSE.desc");
for (int i = ABS_X; i < ABS_MAX; i++)
ASSERT_FALSE(d.HasEvent(EV_ABS, i)) << "Axis code " << i;
for (int i = REL_X; i < REL_MAX; i++) {
if (i == REL_X || i == REL_Y || i == REL_WHEEL)
ASSERT_TRUE(d.HasEvent(EV_REL, i)) << "Axis code " << i;
else
ASSERT_FALSE(d.HasEvent(EV_REL, i)) << "Axis code " << i;
}
for (int i = BTN_LEFT; i < KEY_MAX; i++) {
if (i == BTN_LEFT || i == BTN_RIGHT || i == BTN_MIDDLE)
ASSERT_TRUE(d.HasEvent(EV_KEY, i)) << "Axis code " << i;
else
ASSERT_FALSE(d.HasEvent(EV_KEY, i)) << "Axis code " << i;
}
xorg::testing::evemu::Device d2(TEST_ROOT_DIR "SynPS2-Synaptics-TouchPad.desc");
for (int i = REL_X; i < REL_MAX; i++)
ASSERT_FALSE(d2.HasEvent(EV_REL, i)) << "Axis code " << i;
for (int i = ABS_X; i < ABS_MAX; i++) {
switch (i) {
case ABS_X:
case ABS_Y:
case ABS_PRESSURE:
case ABS_TOOL_WIDTH:
case ABS_MT_SLOT:
case ABS_MT_POSITION_X:
case ABS_MT_POSITION_Y:
case ABS_MT_TRACKING_ID:
case ABS_MT_PRESSURE:
ASSERT_TRUE(d2.HasEvent(EV_ABS, i)) << "Axis code " << i;
break;
default:
ASSERT_FALSE(d2.HasEvent(EV_REL, i)) << "Axis code " << i;
break;
}
}
for (int i = BTN_LEFT; i < KEY_MAX; i++) {
switch (i) {
case BTN_LEFT:
case BTN_TOOL_FINGER:
case BTN_TOOL_QUINTTAP:
case BTN_TOUCH:
case BTN_TOOL_DOUBLETAP:
case BTN_TOOL_TRIPLETAP:
case BTN_TOOL_QUADTAP:
ASSERT_TRUE(d2.HasEvent(EV_KEY, i)) << "Axis code " << i;
break;
default:
ASSERT_FALSE(d2.HasEvent(EV_KEY, i)) << "Axis code " << i;
}
}
}
TEST(Device, AbsAxisData) {
XORG_TESTCASE("GetAbsData must return the right values.\n");
xorg::testing::evemu::Device d(TEST_ROOT_DIR "SynPS2-Synaptics-TouchPad.desc");
const int DEFAULT = -3;
for (int i = ABS_X; i < ABS_MAX; i++) {
int min = 0, max = 0, fuzz = 0, flat = 0, resolution = 0;
bool axis_exists = 1;
switch (i) {
case ABS_X:
case ABS_MT_POSITION_X:
min = 1472;
max = 5472;
fuzz = 8;
break;
case ABS_Y:
case ABS_MT_POSITION_Y:
min = 1408;
max = 4448;
fuzz = 8;
break;
case ABS_PRESSURE:
min = 0;
max = 255;
break;
case ABS_TOOL_WIDTH:
min = 0;
max = 15;
break;
case ABS_MT_SLOT:
min = 0;
max = 1;
break;
case ABS_MT_TRACKING_ID:
min = 0;
max = 65535;
break;
case ABS_MT_PRESSURE:
min = 0;
max = 255;
break;
default:
axis_exists = false;
break;
}
if (axis_exists) {
int min_ret = min;
int max_ret = max;
int fuzz_ret = fuzz;
int flat_ret = flat;
int res_ret = resolution;
ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret)) << "Axis code " << i;
ASSERT_EQ(min, min_ret);
ASSERT_EQ(max, max_ret);
ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret, &fuzz)) << "Axis code " << i;
ASSERT_EQ(min, min_ret);
ASSERT_EQ(max, max_ret);
ASSERT_EQ(fuzz, fuzz_ret);
ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret, &fuzz, &flat)) << "Axis code " << i;
ASSERT_EQ(min, min_ret);
ASSERT_EQ(max, max_ret);
ASSERT_EQ(fuzz, fuzz_ret);
ASSERT_EQ(flat, flat_ret);
ASSERT_TRUE(d.GetAbsData(i, &min_ret, &max_ret, &fuzz, &flat, &res_ret)) << "Axis code " << i;
ASSERT_EQ(min, min_ret);
ASSERT_EQ(max, max_ret);
ASSERT_EQ(fuzz, fuzz_ret);
ASSERT_EQ(flat, flat_ret);
ASSERT_EQ(res_ret, resolution);
} else {
min = DEFAULT;
max = DEFAULT;
fuzz = DEFAULT;
flat = DEFAULT;
resolution = DEFAULT;
ASSERT_FALSE(d.GetAbsData(i, &min, &max)) << "Axis code " << i;
/* make sure we didn't overwrite the values */
ASSERT_EQ(min, DEFAULT);
ASSERT_EQ(max, DEFAULT);
ASSERT_EQ(fuzz, DEFAULT);
ASSERT_EQ(flat, DEFAULT);
ASSERT_EQ(resolution, DEFAULT);
}
}
}
#endif
int main(int argc, char *argv[]) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment