| Index: ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc
|
| diff --git a/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc b/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9c9759b91df462ff9b55f24ee39a46d1add00bf4
|
| --- /dev/null
|
| +++ b/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc
|
| @@ -0,0 +1,498 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <errno.h>
|
| +#include <fcntl.h>
|
| +#include <linux/input.h>
|
| +#include <unistd.h>
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/scoped_vector.h"
|
| +#include "base/posix/eintr_wrapper.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/time/time.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "ui/events/event.h"
|
| +#include "ui/events/ozone/device/device_manager.h"
|
| +#include "ui/events/ozone/evdev/event_converter_test_util.h"
|
| +#include "ui/events/ozone/evdev/event_device_test_util.h"
|
| +#include "ui/events/ozone/evdev/event_factory_evdev.h"
|
| +#include "ui/events/ozone/evdev/tablet_event_converter_evdev.h"
|
| +#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
|
| +#include "ui/events/platform/platform_event_dispatcher.h"
|
| +#include "ui/events/platform/platform_event_source.h"
|
| +
|
| +namespace {
|
| +
|
| +static int SetNonBlocking(int fd) {
|
| + int flags = fcntl(fd, F_GETFL, 0);
|
| + if (flags == -1)
|
| + flags = 0;
|
| + return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
| +}
|
| +
|
| +const char kTestDevicePath[] = "/dev/input/test-device";
|
| +
|
| +const ui::DeviceAbsoluteAxis kWacomIntuos5SPenAbsAxes[] = {
|
| + {ABS_X, {0, 0, 31496, 4, 0, 200}},
|
| + {ABS_Y, {0, 0, 19685, 4, 0, 200}},
|
| + {ABS_Z, {0, -900, 899, 0, 0, 0}},
|
| + {ABS_RZ, {0, -900, 899, 0, 0, 0}},
|
| + {ABS_THROTTLE, {0, -1023, 1023, 0, 0, 0}},
|
| + {ABS_WHEEL, {0, 0, 1023, 0, 0, 0}},
|
| + {ABS_PRESSURE, {0, 0, 2047, 0, 0, 0}},
|
| + {ABS_DISTANCE, {0, 0, 63, 0, 0, 0}},
|
| + {ABS_TILT_X, {0, 0, 127, 0, 0, 0}},
|
| + {ABS_TILT_Y, {0, 0, 127, 0, 0, 0}},
|
| + {ABS_MISC, {0, 0, 0, 0, 0, 0}},
|
| +};
|
| +
|
| +const ui::DeviceCapabilities kWacomIntuos5SPen = {
|
| + /* path */ "/sys/devices/pci0000:00/0000:00:14.0/usb1/"
|
| + "1-1/1-1:1.0/input/input19/event5",
|
| + /* name */ "Wacom Intuos5 touch S Pen",
|
| + /* phys */ "",
|
| + /* uniq */ "",
|
| + /* bustype */ "0003",
|
| + /* vendor */ "056a",
|
| + /* product */ "0026",
|
| + /* version */ "0107",
|
| + /* prop */ "1",
|
| + /* ev */ "1f",
|
| + /* key */ "1cdf 1f007f 0 0 0 0",
|
| + /* rel */ "100",
|
| + /* abs */ "1000f000167",
|
| + /* msc */ "1",
|
| + /* sw */ "0",
|
| + /* led */ "0",
|
| + /* ff */ "0",
|
| + kWacomIntuos5SPenAbsAxes,
|
| + arraysize(kWacomIntuos5SPenAbsAxes),
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +namespace ui {
|
| +
|
| +class MockTabletEventConverterEvdev : public TabletEventConverterEvdev {
|
| + public:
|
| + MockTabletEventConverterEvdev(int fd,
|
| + base::FilePath path,
|
| + CursorDelegateEvdev* cursor,
|
| + const EventDeviceInfo& devinfo,
|
| + DeviceEventDispatcherEvdev* dispatcher);
|
| + ~MockTabletEventConverterEvdev() override {};
|
| +
|
| + void ConfigureReadMock(struct input_event* queue,
|
| + long read_this_many,
|
| + long queue_index);
|
| +
|
| + // Actually dispatch the event reader code.
|
| + void ReadNow() {
|
| + OnFileCanReadWithoutBlocking(read_pipe_);
|
| + base::RunLoop().RunUntilIdle();
|
| + }
|
| +
|
| + private:
|
| + int read_pipe_;
|
| + int write_pipe_;
|
| +
|
| + ScopedVector<Event> dispatched_events_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockTabletEventConverterEvdev);
|
| +};
|
| +
|
| +class MockTabletCursorEvdev : public CursorDelegateEvdev {
|
| + public:
|
| + MockTabletCursorEvdev() { cursor_confined_bounds_ = gfx::Rect(1024, 768); }
|
| + ~MockTabletCursorEvdev() override {}
|
| +
|
| + // CursorDelegateEvdev:
|
| + void MoveCursorTo(gfx::AcceleratedWidget widget,
|
| + const gfx::PointF& location) override {
|
| + NOTREACHED();
|
| + }
|
| + void MoveCursorTo(const gfx::PointF& location) override {
|
| + cursor_location_ = location;
|
| + }
|
| + void MoveCursor(const gfx::Vector2dF& delta) override { NOTREACHED(); }
|
| + bool IsCursorVisible() override { return 1; }
|
| + gfx::PointF GetLocation() override { return cursor_location_; }
|
| + gfx::Rect GetCursorConfinedBounds() override {
|
| + return cursor_confined_bounds_;
|
| + }
|
| +
|
| + private:
|
| + gfx::PointF cursor_location_;
|
| + gfx::Rect cursor_confined_bounds_;
|
| + DISALLOW_COPY_AND_ASSIGN(MockTabletCursorEvdev);
|
| +};
|
| +
|
| +MockTabletEventConverterEvdev::MockTabletEventConverterEvdev(
|
| + int fd,
|
| + base::FilePath path,
|
| + CursorDelegateEvdev* cursor,
|
| + const EventDeviceInfo& devinfo,
|
| + DeviceEventDispatcherEvdev* dispatcher)
|
| + : TabletEventConverterEvdev(fd,
|
| + path,
|
| + 1,
|
| + INPUT_DEVICE_UNKNOWN,
|
| + cursor,
|
| + devinfo,
|
| + dispatcher) {
|
| + int fds[2];
|
| +
|
| + if (pipe(fds))
|
| + PLOG(FATAL) << "failed pipe";
|
| +
|
| + EXPECT_FALSE(SetNonBlocking(fds[0]) || SetNonBlocking(fds[1]))
|
| + << "failed to set non-blocking: " << strerror(errno);
|
| +
|
| + read_pipe_ = fds[0];
|
| + write_pipe_ = fds[1];
|
| +}
|
| +
|
| +void MockTabletEventConverterEvdev::ConfigureReadMock(struct input_event* queue,
|
| + long read_this_many,
|
| + long queue_index) {
|
| + int nwrite = HANDLE_EINTR(write(write_pipe_, queue + queue_index,
|
| + sizeof(struct input_event) * read_this_many));
|
| + DCHECK(nwrite ==
|
| + static_cast<int>(sizeof(struct input_event) * read_this_many))
|
| + << "write() failed, errno: " << errno;
|
| +}
|
| +
|
| +} // namespace ui
|
| +
|
| +// Test fixture.
|
| +class TabletEventConverterEvdevTest : public testing::Test {
|
| + public:
|
| + TabletEventConverterEvdevTest() {}
|
| +
|
| + // Overridden from testing::Test:
|
| + void SetUp() override {
|
| + // Set up pipe to satisfy message pump (unused).
|
| + int evdev_io[2];
|
| + if (pipe(evdev_io))
|
| + PLOG(FATAL) << "failed pipe";
|
| + events_in_ = evdev_io[0];
|
| + events_out_ = evdev_io[1];
|
| +
|
| + cursor_.reset(new ui::MockTabletCursorEvdev());
|
| + device_manager_ = ui::CreateDeviceManagerForTest();
|
| + event_factory_ = ui::CreateEventFactoryEvdevForTest(
|
| + cursor_.get(), device_manager_.get(),
|
| + ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine(),
|
| + base::Bind(&TabletEventConverterEvdevTest::DispatchEventForTest,
|
| + base::Unretained(this)));
|
| + dispatcher_ =
|
| + ui::CreateDeviceEventDispatcherEvdevForTest(event_factory_.get());
|
| + }
|
| +
|
| + void TearDown() override {
|
| + cursor_.reset();
|
| + }
|
| +
|
| + ui::MockTabletEventConverterEvdev* CreateDevice(
|
| + const ui::DeviceCapabilities& caps) {
|
| + ui::EventDeviceInfo devinfo;
|
| + CapabilitiesToDeviceInfo(caps, &devinfo);
|
| + return new ui::MockTabletEventConverterEvdev(
|
| + events_in_, base::FilePath(kTestDevicePath), cursor_.get(), devinfo,
|
| + dispatcher_.get());
|
| + }
|
| +
|
| + ui::CursorDelegateEvdev* cursor() { return cursor_.get(); }
|
| +
|
| + unsigned size() { return dispatched_events_.size(); }
|
| + ui::MouseEvent* dispatched_event(unsigned index) {
|
| + DCHECK_GT(dispatched_events_.size(), index);
|
| + ui::Event* ev = dispatched_events_[index];
|
| + DCHECK(ev->IsMouseEvent());
|
| + return static_cast<ui::MouseEvent*>(ev);
|
| + }
|
| +
|
| + void DispatchEventForTest(ui::Event* event) {
|
| + scoped_ptr<ui::Event> cloned_event = ui::Event::Clone(*event);
|
| + dispatched_events_.push_back(cloned_event.Pass());
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<ui::MockTabletCursorEvdev> cursor_;
|
| + scoped_ptr<ui::DeviceManager> device_manager_;
|
| + scoped_ptr<ui::EventFactoryEvdev> event_factory_;
|
| + scoped_ptr<ui::DeviceEventDispatcherEvdev> dispatcher_;
|
| +
|
| + ScopedVector<ui::Event> dispatched_events_;
|
| +
|
| + int events_out_;
|
| + int events_in_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TabletEventConverterEvdevTest);
|
| +};
|
| +
|
| +#define EPSILON 20
|
| +
|
| +// Uses real data captured from Wacom Intuos 5 Pen
|
| +TEST_F(TabletEventConverterEvdevTest, MoveTopLeft) {
|
| + scoped_ptr<ui::MockTabletEventConverterEvdev> dev =
|
| + make_scoped_ptr(CreateDevice(kWacomIntuos5SPen));
|
| +
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 63},
|
| + {{0, 0}, EV_ABS, ABS_X, 477},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 66},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 62},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 1050626},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 0},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 0},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| + EXPECT_EQ(1u, size());
|
| +
|
| + ui::MouseEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_MOUSE_MOVED, event->type());
|
| +
|
| + EXPECT_LT(cursor()->GetLocation().x(), EPSILON);
|
| + EXPECT_LT(cursor()->GetLocation().y(), EPSILON);
|
| +}
|
| +
|
| +TEST_F(TabletEventConverterEvdevTest, MoveTopRight) {
|
| + scoped_ptr<ui::MockTabletEventConverterEvdev> dev =
|
| + make_scoped_ptr(CreateDevice(kWacomIntuos5SPen));
|
| +
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 63},
|
| + {{0, 0}, EV_ABS, ABS_X, 31496},
|
| + {{0, 0}, EV_ABS, ABS_Y, 109},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 66},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 61},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 1050626},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 0},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 0},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| + EXPECT_EQ(1u, size());
|
| +
|
| + ui::MouseEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_MOUSE_MOVED, event->type());
|
| +
|
| + EXPECT_GT(cursor()->GetLocation().x(),
|
| + cursor()->GetCursorConfinedBounds().width() - EPSILON);
|
| + EXPECT_LT(cursor()->GetLocation().y(), EPSILON);
|
| +}
|
| +
|
| +TEST_F(TabletEventConverterEvdevTest, MoveBottomLeft) {
|
| + scoped_ptr<ui::MockTabletEventConverterEvdev> dev =
|
| + make_scoped_ptr(CreateDevice(kWacomIntuos5SPen));
|
| +
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 63},
|
| + {{0, 0}, EV_ABS, ABS_Y, 19685},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 64},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 61},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 1050626},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_Y, 0},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 0},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 0},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| + EXPECT_EQ(1u, size());
|
| +
|
| + ui::MouseEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_MOUSE_MOVED, event->type());
|
| +
|
| + EXPECT_LT(cursor()->GetLocation().x(), EPSILON);
|
| + EXPECT_GT(cursor()->GetLocation().y(),
|
| + cursor()->GetCursorConfinedBounds().height() - EPSILON);
|
| +}
|
| +
|
| +TEST_F(TabletEventConverterEvdevTest, MoveBottomRight) {
|
| + scoped_ptr<ui::MockTabletEventConverterEvdev> dev =
|
| + make_scoped_ptr(CreateDevice(kWacomIntuos5SPen));
|
| +
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 63},
|
| + {{0, 0}, EV_ABS, ABS_X, 31496},
|
| + {{0, 0}, EV_ABS, ABS_Y, 19685},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 67},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 63},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 1050626},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_Y, 0},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 0},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 0},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| + EXPECT_EQ(1u, size());
|
| +
|
| + ui::MouseEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_MOUSE_MOVED, event->type());
|
| +
|
| + EXPECT_GT(cursor()->GetLocation().x(),
|
| + cursor()->GetCursorConfinedBounds().height() - EPSILON);
|
| + EXPECT_GT(cursor()->GetLocation().y(),
|
| + cursor()->GetCursorConfinedBounds().height() - EPSILON);
|
| +}
|
| +
|
| +TEST_F(TabletEventConverterEvdevTest, Tap) {
|
| + scoped_ptr<ui::MockTabletEventConverterEvdev> dev =
|
| + make_scoped_ptr(CreateDevice(kWacomIntuos5SPen));
|
| +
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_ABS, ABS_X, 15456},
|
| + {{0, 0}, EV_ABS, ABS_Y, 8605},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 49},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 68},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 64},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 1050626},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 15725},
|
| + {{0, 0}, EV_ABS, ABS_Y, 8755},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 29},
|
| + {{0, 0}, EV_ABS, ABS_PRESSURE, 992},
|
| + {{0, 0}, EV_KEY, BTN_TOUCH, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 15922},
|
| + {{0, 0}, EV_ABS, ABS_Y, 8701},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 32},
|
| + {{0, 0}, EV_ABS, ABS_PRESSURE, 0},
|
| + {{0, 0}, EV_KEY, BTN_TOUCH, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_Y, 0},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 0},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 0},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| + EXPECT_EQ(3u, size());
|
| +
|
| + ui::MouseEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_MOUSE_MOVED, event->type());
|
| + event = dispatched_event(1);
|
| + EXPECT_EQ(ui::ET_MOUSE_PRESSED, event->type());
|
| + EXPECT_EQ(true, event->IsLeftMouseButton());
|
| + event = dispatched_event(2);
|
| + EXPECT_EQ(ui::ET_MOUSE_RELEASED, event->type());
|
| + EXPECT_EQ(true, event->IsLeftMouseButton());
|
| +}
|
| +
|
| +TEST_F(TabletEventConverterEvdevTest, StylusButtonPress) {
|
| + scoped_ptr<ui::MockTabletEventConverterEvdev> dev =
|
| + make_scoped_ptr(CreateDevice(kWacomIntuos5SPen));
|
| +
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 63},
|
| + {{0, 0}, EV_ABS, ABS_X, 18372},
|
| + {{0, 0}, EV_ABS, ABS_Y, 9880},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 61},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 60},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 63},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 1050626},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 18294},
|
| + {{0, 0}, EV_ABS, ABS_Y, 9723},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 20},
|
| + {{0, 0}, EV_ABS, ABS_PRESSURE, 1015},
|
| + {{0, 0}, EV_KEY, BTN_STYLUS2, 1},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 18516},
|
| + {{0, 0}, EV_ABS, ABS_Y, 9723},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 23},
|
| + {{0, 0}, EV_KEY, BTN_STYLUS2, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + {{0, 0}, EV_ABS, ABS_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_Y, 0},
|
| + {{0, 0}, EV_ABS, ABS_DISTANCE, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_TILT_Y, 0},
|
| + {{0, 0}, EV_KEY, BTN_TOOL_PEN, 0},
|
| + {{0, 0}, EV_ABS, ABS_MISC, 0},
|
| + {{0, 0}, EV_MSC, MSC_SERIAL, 897618290},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| + EXPECT_EQ(3u, size());
|
| +
|
| + ui::MouseEvent* event = dispatched_event(0);
|
| + EXPECT_EQ(ui::ET_MOUSE_MOVED, event->type());
|
| + event = dispatched_event(1);
|
| + EXPECT_EQ(ui::ET_MOUSE_PRESSED, event->type());
|
| + EXPECT_EQ(true, event->IsRightMouseButton());
|
| + event = dispatched_event(2);
|
| + EXPECT_EQ(ui::ET_MOUSE_RELEASED, event->type());
|
| + EXPECT_EQ(true, event->IsRightMouseButton());
|
| +}
|
| +
|
| +// Should only get an event if BTN_TOOL received
|
| +TEST_F(TabletEventConverterEvdevTest, CheckStylusFiltering) {
|
| + scoped_ptr<ui::MockTabletEventConverterEvdev> dev =
|
| + make_scoped_ptr(CreateDevice(kWacomIntuos5SPen));
|
| +
|
| + struct input_event mock_kernel_queue[] = {
|
| + {{0, 0}, EV_ABS, ABS_X, 0},
|
| + {{0, 0}, EV_ABS, ABS_Y, 0},
|
| + {{0, 0}, EV_SYN, SYN_REPORT, 0},
|
| + };
|
| +
|
| + dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
|
| + EXPECT_EQ(0u, size());
|
| +}
|
|
|