diff options
author | miletus@chromium.org <miletus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-09 04:41:03 +0000 |
---|---|---|
committer | miletus@chromium.org <miletus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-09 04:41:03 +0000 |
commit | ed3668b12a4a4048024f65fcbffd8a1e2aeb7676 (patch) | |
tree | 81a7d2fcd1583ee20f9a81816de3276304ee80c2 /ui | |
parent | 3ed07538dfb329636198d56c56c2ac189c222387 (diff) | |
download | chromium_src-ed3668b12a4a4048024f65fcbffd8a1e2aeb7676.zip chromium_src-ed3668b12a4a4048024f65fcbffd8a1e2aeb7676.tar.gz chromium_src-ed3668b12a4a4048024f65fcbffd8a1e2aeb7676.tar.bz2 |
Add RootWindowHostX11Test::DispatchTouchEventToOneRootWindow
Add RootWindowHostX11Test::DispatchTouchEventToOneRootWindow
to test that RootWindowHostX11 correctly dispatchs X touch
events.
BUG=None.
TEST=the unittests pass.
Review URL: https://codereview.chromium.org/65423002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@234092 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/aura/aura.gyp | 3 | ||||
-rw-r--r-- | ui/aura/root_window_host_x11.h | 6 | ||||
-rw-r--r-- | ui/aura/root_window_host_x11_unittest.cc | 157 | ||||
-rw-r--r-- | ui/events/x/device_data_manager.h | 7 | ||||
-rw-r--r-- | ui/events/x/events_x_unittest.cc | 172 | ||||
-rw-r--r-- | ui/events/x/events_x_utils.cc | 77 | ||||
-rw-r--r-- | ui/events/x/events_x_utils.h | 35 |
7 files changed, 323 insertions, 134 deletions
diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp index 3129106..6a99f817 100644 --- a/ui/aura/aura.gyp +++ b/ui/aura/aura.gyp @@ -292,10 +292,11 @@ ], 'sources': [ 'gestures/gesture_recognizer_unittest.cc', + 'root_window_host_x11_unittest.cc', + 'root_window_unittest.cc', 'test/run_all_unittests.cc', 'test/test_suite.cc', 'test/test_suite.h', - 'root_window_unittest.cc', 'window_unittest.cc', ], 'conditions': [ diff --git a/ui/aura/root_window_host_x11.h b/ui/aura/root_window_host_x11.h index 91d8bca..9ddb4c7 100644 --- a/ui/aura/root_window_host_x11.h +++ b/ui/aura/root_window_host_x11.h @@ -32,9 +32,9 @@ namespace internal { class TouchEventCalibrate; } -class RootWindowHostX11 : public RootWindowHost, - public base::MessageLoop::Dispatcher, - public EnvObserver { +class AURA_EXPORT RootWindowHostX11 : public RootWindowHost, + public base::MessageLoop::Dispatcher, + public EnvObserver { public: explicit RootWindowHostX11(const gfx::Rect& bounds); virtual ~RootWindowHostX11(); diff --git a/ui/aura/root_window_host_x11_unittest.cc b/ui/aura/root_window_host_x11_unittest.cc new file mode 100644 index 0000000..8183bec --- /dev/null +++ b/ui/aura/root_window_host_x11_unittest.cc @@ -0,0 +1,157 @@ +// Copyright 2013 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 "base/sys_info.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/aura/root_window.h" +#include "ui/aura/root_window_host_delegate.h" +#include "ui/aura/root_window_host_x11.h" +#include "ui/aura/test/aura_test_base.h" +#include "ui/events/x/events_x_utils.h" + +namespace { +class TestRootWindowHostDelegate : public aura::RootWindowHostDelegate { + public: + TestRootWindowHostDelegate() : last_touch_type_(ui::ET_UNKNOWN), + last_touch_id_(-1), + last_touch_location_(0, 0) { + } + virtual ~TestRootWindowHostDelegate() {} + + virtual bool OnHostKeyEvent(ui::KeyEvent* event) OVERRIDE { + return true; + } + + virtual bool OnHostMouseEvent(ui::MouseEvent* event) OVERRIDE { + return true; + } + virtual bool OnHostScrollEvent(ui::ScrollEvent* event) OVERRIDE { + return true; + } + + virtual bool OnHostTouchEvent(ui::TouchEvent* event) OVERRIDE { + last_touch_id_ = event->touch_id(); + last_touch_type_ = event->type(); + last_touch_location_ = event->location(); + return true; + } + + virtual void OnHostCancelMode() OVERRIDE {} + + // Called when the windowing system activates the window. + virtual void OnHostActivated() OVERRIDE {} + + // Called when system focus is changed to another window. + virtual void OnHostLostWindowCapture() OVERRIDE {} + + // Called when the windowing system has mouse grab because it's performing a + // window move on our behalf, but we should still paint as if we're active. + virtual void OnHostLostMouseGrab() OVERRIDE {} + + virtual void OnHostPaint(const gfx::Rect& damage_rect) OVERRIDE {} + + virtual void OnHostMoved(const gfx::Point& origin) OVERRIDE {} + virtual void OnHostResized(const gfx::Size& size) OVERRIDE {} + + virtual float GetDeviceScaleFactor() OVERRIDE { + return 1.0f; + } + + virtual aura::RootWindow* AsRootWindow() OVERRIDE { + return NULL; + } + + ui::EventType last_touch_type() { + return last_touch_type_; + } + + int last_touch_id() { + return last_touch_id_; + } + + gfx::Point last_touch_location() { + return last_touch_location_; + } + + private: + ui::EventType last_touch_type_; + int last_touch_id_; + gfx::Point last_touch_location_; + + DISALLOW_COPY_AND_ASSIGN(TestRootWindowHostDelegate); +}; + +} // namespace + +namespace aura { + +typedef test::AuraTestBase RootWindowHostX11Test; + +// Send X touch events to one RootWindowHost. The RootWindowHost's +// delegate will get corresponding ui::TouchEvent if the touch events +// are winthin the bound of the RootWindowHost. +TEST_F(RootWindowHostX11Test, DispatchTouchEventToOneRootWindow) { +#if defined(OS_CHROMEOS) + // Fake a ChromeOS running env. + const char* kLsbRelease = "CHROMEOS_RELEASE_NAME=Chromium OS\n"; + base::SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, base::Time()); +#endif // defined(OS_CHROMEOS) + + scoped_ptr<RootWindowHostX11> root_window_host( + new RootWindowHostX11(gfx::Rect(0, 0, 2560, 1700))); + scoped_ptr<TestRootWindowHostDelegate> delegate( + new TestRootWindowHostDelegate()); + root_window_host->SetDelegate(delegate.get()); + + std::vector<unsigned int> devices; + devices.push_back(0); + ui::SetupTouchDevicesForTest(devices); + std::vector<ui::Valuator> valuators; + + EXPECT_EQ(ui::ET_UNKNOWN, delegate->last_touch_type()); + EXPECT_EQ(-1, delegate->last_touch_id()); + +#if defined(OS_CHROMEOS) + // This touch is out of bounds. + ui::XScopedTouchEvent event1(ui::CreateTouchEvent( + 0, XI_TouchBegin, 5, gfx::Point(1500, 2500), valuators)); + root_window_host->Dispatch(event1); + EXPECT_EQ(ui::ET_UNKNOWN, delegate->last_touch_type()); + EXPECT_EQ(-1, delegate->last_touch_id()); + EXPECT_EQ(gfx::Point(0, 0), delegate->last_touch_location()); +#endif // defined(OS_CHROMEOS) + + // Following touchs are within bounds and are passed to delegate. + ui::XScopedTouchEvent event2(ui::CreateTouchEvent( + 0, XI_TouchBegin, 5, gfx::Point(1500, 1500), valuators)); + root_window_host->Dispatch(event2); + EXPECT_EQ(ui::ET_TOUCH_PRESSED, delegate->last_touch_type()); + EXPECT_EQ(0, delegate->last_touch_id()); + EXPECT_EQ(gfx::Point(1500, 1500), delegate->last_touch_location()); + + ui::XScopedTouchEvent event3(ui::CreateTouchEvent( + 0, XI_TouchUpdate, 5, gfx::Point(1500, 1600), valuators)); + root_window_host->Dispatch(event3); + EXPECT_EQ(ui::ET_TOUCH_MOVED, delegate->last_touch_type()); + EXPECT_EQ(0, delegate->last_touch_id()); + EXPECT_EQ(gfx::Point(1500, 1600), delegate->last_touch_location()); + + ui::XScopedTouchEvent event4(ui::CreateTouchEvent( + 0, XI_TouchEnd, 5, gfx::Point(1500, 1600), valuators)); + root_window_host->Dispatch(event4); + EXPECT_EQ(ui::ET_TOUCH_RELEASED, delegate->last_touch_type()); + EXPECT_EQ(0, delegate->last_touch_id()); + EXPECT_EQ(gfx::Point(1500, 1600), delegate->last_touch_location()); + + // Revert the CrOS testing env otherwise the following non-CrOS aura + // tests will fail. +#if defined(OS_CHROMEOS) + // Fake a ChromeOS running env. + kLsbRelease = ""; + base::SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, base::Time()); +#endif // defined(OS_CHROMEOS) +} + +} // namespace aura diff --git a/ui/events/x/device_data_manager.h b/ui/events/x/device_data_manager.h index 7e20122..8ca2983 100644 --- a/ui/events/x/device_data_manager.h +++ b/ui/events/x/device_data_manager.h @@ -5,6 +5,13 @@ #ifndef UI_EVENTS_X_DEVICE_DATA_MANAGER_H_ #define UI_EVENTS_X_DEVICE_DATA_MANAGER_H_ +// Generically-named #defines from Xlib is conflicting with symbols in GTest. +// So many tests .cc file #undef Bool before including device_data_manager.h, +// which makes Bool unrecognized in XInput2.h. +#ifndef Bool +#define Bool int +#endif + #include <X11/extensions/XInput2.h> #include <bitset> diff --git a/ui/events/x/events_x_unittest.cc b/ui/events/x/events_x_unittest.cc index ed8f47a..c27e6ca 100644 --- a/ui/events/x/events_x_unittest.cc +++ b/ui/events/x/events_x_unittest.cc @@ -15,8 +15,7 @@ #include "ui/events/event.h" #include "ui/events/event_constants.h" #include "ui/events/event_utils.h" -#include "ui/events/x/device_data_manager.h" -#include "ui/events/x/touch_factory_x11.h" +#include "ui/events/x/events_x_utils.h" #include "ui/gfx/point.h" namespace ui { @@ -41,90 +40,6 @@ void InitButtonEvent(XEvent* event, button_event->state = state; } -#if defined(USE_XI2_MT) -const int kValuatorNum = 3; -const int kTouchValuatorMap[kValuatorNum][4] = { - // { valuator_index, valuator_type, min_val, max_val } - { 0, DeviceDataManager::DT_TOUCH_MAJOR, 0, 1000}, - { 1, DeviceDataManager::DT_TOUCH_ORIENTATION, 0, 1}, - { 2, DeviceDataManager::DT_TOUCH_PRESSURE, 0, 1000}, -}; - -struct Valuator { - Valuator(DeviceDataManager::DataType type, double v) - : data_type(type), value(v) {} - - DeviceDataManager::DataType data_type; - double value; -}; - -XEvent* CreateTouchEvent(int deviceid, - int evtype, - int tracking_id, - const gfx::Point& location, - const std::vector<Valuator>& valuators) { - XEvent* event = new XEvent; - memset(event, 0, sizeof(*event)); - event->type = GenericEvent; - event->xcookie.data = new XIDeviceEvent; - XIDeviceEvent* xiev = - static_cast<XIDeviceEvent*>(event->xcookie.data); - xiev->deviceid = deviceid; - xiev->sourceid = deviceid; - xiev->evtype = evtype; - xiev->detail = tracking_id; - xiev->event_x = location.x(); - xiev->event_y = location.y(); - - xiev->valuators.mask_len = (valuators.size() / 8) + 1; - xiev->valuators.mask = new unsigned char[xiev->valuators.mask_len]; - memset(xiev->valuators.mask, 0, xiev->valuators.mask_len); - xiev->valuators.values = new double[valuators.size()]; - - int val_count = 0; - for (int i = 0; i < kValuatorNum; i++) { - for(size_t j = 0; j < valuators.size(); j++) { - if (valuators[j].data_type == kTouchValuatorMap[i][1]) { - XISetMask(xiev->valuators.mask, kTouchValuatorMap[i][0]); - xiev->valuators.values[val_count++] = valuators[j].value; - } - } - } - - return event; -} - -void DestroyTouchEvent(XEvent* event) { - XIDeviceEvent* xiev = - static_cast<XIDeviceEvent*>(event->xcookie.data); - if (xiev) { - delete[] xiev->valuators.mask; - delete[] xiev->valuators.values; - delete xiev; - } - delete event; -} - -void SetupTouchFactory(const std::vector<unsigned int>& devices) { - TouchFactory* factory = TouchFactory::GetInstance(); - factory->SetTouchDeviceForTest(devices); -} - -void SetupDeviceDataManager(const std::vector<unsigned int>& devices) { - ui::DeviceDataManager* manager = ui::DeviceDataManager::GetInstance(); - manager->SetDeviceListForTest(devices); - for (size_t i = 0; i < devices.size(); i++) { - for (int j = 0; j < kValuatorNum; j++) { - manager->SetDeviceValuatorForTest( - devices[i], - kTouchValuatorMap[j][0], - static_cast<DeviceDataManager::DataType>(kTouchValuatorMap[j][1]), - kTouchValuatorMap[j][2], - kTouchValuatorMap[j][3]); - } - } -} -#endif } // namespace TEST(EventsXTest, ButtonEvents) { @@ -260,76 +175,73 @@ TEST(EventsXTest, ClickCount) { TEST(EventsXTest, TouchEventBasic) { std::vector<unsigned int> devices; devices.push_back(0); - SetupTouchFactory(devices); - SetupDeviceDataManager(devices); - XEvent* event = NULL; + ui::SetupTouchDevicesForTest(devices); std::vector<Valuator> valuators; // Init touch begin with tracking id 5, touch id 0. valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 20)); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.3f)); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 100)); - event = CreateTouchEvent(0, XI_TouchBegin, 5, gfx::Point(10, 10), valuators); - EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event)); - EXPECT_EQ("10,10", ui::EventLocationFromNative(event).ToString()); - EXPECT_EQ(GetTouchId(event), 0); - EXPECT_EQ(GetTouchRadiusX(event), 10); - EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.15f); - EXPECT_FLOAT_EQ(GetTouchForce(event), 0.1f); - DestroyTouchEvent(event); + ui::XScopedTouchEvent event1(CreateTouchEvent( + 0, XI_TouchBegin, 5, gfx::Point(10, 10), valuators)); + EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event1)); + EXPECT_EQ("10,10", ui::EventLocationFromNative(event1).ToString()); + EXPECT_EQ(GetTouchId(event1), 0); + EXPECT_EQ(GetTouchRadiusX(event1), 10); + EXPECT_FLOAT_EQ(GetTouchAngle(event1), 0.15f); + EXPECT_FLOAT_EQ(GetTouchForce(event1), 0.1f); // Touch update, with new orientation info. valuators.clear(); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.5f)); - event = CreateTouchEvent(0, XI_TouchUpdate, 5, gfx::Point(20, 20), valuators); - EXPECT_EQ(ui::ET_TOUCH_MOVED, ui::EventTypeFromNative(event)); - EXPECT_EQ("20,20", ui::EventLocationFromNative(event).ToString()); - EXPECT_EQ(GetTouchId(event), 0); - EXPECT_EQ(GetTouchRadiusX(event), 10); - EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.25f); - EXPECT_FLOAT_EQ(GetTouchForce(event), 0.1f); - DestroyTouchEvent(event); + ui::XScopedTouchEvent event2(CreateTouchEvent( + 0, XI_TouchUpdate, 5, gfx::Point(20, 20), valuators)); + EXPECT_EQ(ui::ET_TOUCH_MOVED, ui::EventTypeFromNative(event2)); + EXPECT_EQ("20,20", ui::EventLocationFromNative(event2).ToString()); + EXPECT_EQ(GetTouchId(event2), 0); + EXPECT_EQ(GetTouchRadiusX(event2), 10); + EXPECT_FLOAT_EQ(GetTouchAngle(event2), 0.25f); + EXPECT_FLOAT_EQ(GetTouchForce(event2), 0.1f); // Another touch with tracking id 6, touch id 1. valuators.clear(); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 100)); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.9f)); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 500)); - event = CreateTouchEvent( - 0, XI_TouchBegin, 6, gfx::Point(200, 200), valuators); - EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event)); - EXPECT_EQ("200,200", ui::EventLocationFromNative(event).ToString()); - EXPECT_EQ(GetTouchId(event), 1); - EXPECT_EQ(GetTouchRadiusX(event), 50); - EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.45f); - EXPECT_FLOAT_EQ(GetTouchForce(event), 0.5f); - DestroyTouchEvent(event); + ui::XScopedTouchEvent event3(CreateTouchEvent( + 0, XI_TouchBegin, 6, gfx::Point(200, 200), valuators)); + EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event3)); + EXPECT_EQ("200,200", ui::EventLocationFromNative(event3).ToString()); + EXPECT_EQ(GetTouchId(event3), 1); + EXPECT_EQ(GetTouchRadiusX(event3), 50); + EXPECT_FLOAT_EQ(GetTouchAngle(event3), 0.45f); + EXPECT_FLOAT_EQ(GetTouchForce(event3), 0.5f); // Touch with tracking id 5 should have old radius/angle value and new pressue // value. valuators.clear(); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 50)); - event = CreateTouchEvent(0, XI_TouchEnd, 5, gfx::Point(30, 30), valuators); - EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event)); - EXPECT_EQ("30,30", ui::EventLocationFromNative(event).ToString()); - EXPECT_EQ(GetTouchId(event), 0); - EXPECT_EQ(GetTouchRadiusX(event), 10); - EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.25f); - EXPECT_FLOAT_EQ(GetTouchForce(event), 0.05f); - DestroyTouchEvent(event); + ui::XScopedTouchEvent event4(CreateTouchEvent( + 0, XI_TouchEnd, 5, gfx::Point(30, 30), valuators)); + EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event4)); + EXPECT_EQ("30,30", ui::EventLocationFromNative(event4).ToString()); + EXPECT_EQ(GetTouchId(event4), 0); + EXPECT_EQ(GetTouchRadiusX(event4), 10); + EXPECT_FLOAT_EQ(GetTouchAngle(event4), 0.25f); + EXPECT_FLOAT_EQ(GetTouchForce(event4), 0.05f); // Touch with tracking id 6 should have old angle/pressure value and new // radius value. valuators.clear(); valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 50)); - event = CreateTouchEvent(0, XI_TouchEnd, 6, gfx::Point(200, 200), valuators); - EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event)); - EXPECT_EQ("200,200", ui::EventLocationFromNative(event).ToString()); - EXPECT_EQ(GetTouchId(event), 1); - EXPECT_EQ(GetTouchRadiusX(event), 25); - EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.45f); - EXPECT_FLOAT_EQ(GetTouchForce(event), 0.5f); - DestroyTouchEvent(event); + ui::XScopedTouchEvent event5(CreateTouchEvent( + 0, XI_TouchEnd, 6, gfx::Point(200, 200), valuators)); + EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event5)); + EXPECT_EQ("200,200", ui::EventLocationFromNative(event5).ToString()); + EXPECT_EQ(GetTouchId(event5), 1); + EXPECT_EQ(GetTouchRadiusX(event5), 25); + EXPECT_FLOAT_EQ(GetTouchAngle(event5), 0.45f); + EXPECT_FLOAT_EQ(GetTouchForce(event5), 0.5f); } #endif } // namespace ui diff --git a/ui/events/x/events_x_utils.cc b/ui/events/x/events_x_utils.cc index ebde628..416ccf2 100644 --- a/ui/events/x/events_x_utils.cc +++ b/ui/events/x/events_x_utils.cc @@ -11,6 +11,7 @@ #include "base/logging.h" #include "ui/events/event_constants.h" #include "ui/events/keycodes/keyboard_code_conversion_x.h" +#include "ui/events/x/touch_factory_x11.h" namespace { @@ -150,4 +151,80 @@ EVENTS_EXPORT void InitXMouseWheelEventForTesting(int wheel_delta, event->xbutton.button = wheel_delta > 0 ? Button4 : Button5; } +#if defined(USE_XI2_MT) +const int kValuatorNum = 3; +const int kTouchValuatorMap[kValuatorNum][4] = { + // { valuator_index, valuator_type, min_val, max_val } + { 0, DeviceDataManager::DT_TOUCH_MAJOR, 0, 1000}, + { 1, DeviceDataManager::DT_TOUCH_ORIENTATION, 0, 1}, + { 2, DeviceDataManager::DT_TOUCH_PRESSURE, 0, 1000}, +}; + +XScopedTouchEvent::XScopedTouchEvent(XEvent* event) : event_(event) { +} + +XScopedTouchEvent::~XScopedTouchEvent() { + XIDeviceEvent* xiev = + static_cast<XIDeviceEvent*>(event_->xcookie.data); + if (xiev) { + delete[] xiev->valuators.mask; + delete[] xiev->valuators.values; + delete xiev; + } +} + +XEvent* CreateTouchEvent(int deviceid, + int evtype, + int tracking_id, + const gfx::Point& location, + const std::vector<Valuator>& valuators) { + XEvent* event = new XEvent; + memset(event, 0, sizeof(*event)); + event->type = GenericEvent; + event->xcookie.data = new XIDeviceEvent; + XIDeviceEvent* xiev = + static_cast<XIDeviceEvent*>(event->xcookie.data); + memset(xiev, 0, sizeof(XIDeviceEvent)); + xiev->deviceid = deviceid; + xiev->sourceid = deviceid; + xiev->evtype = evtype; + xiev->detail = tracking_id; + xiev->event_x = location.x(); + xiev->event_y = location.y(); + + xiev->valuators.mask_len = (valuators.size() / 8) + 1; + xiev->valuators.mask = new unsigned char[xiev->valuators.mask_len]; + memset(xiev->valuators.mask, 0, xiev->valuators.mask_len); + xiev->valuators.values = new double[valuators.size()]; + + int val_count = 0; + for (int i = 0; i < kValuatorNum; i++) { + for(size_t j = 0; j < valuators.size(); j++) { + if (valuators[j].data_type == kTouchValuatorMap[i][1]) { + XISetMask(xiev->valuators.mask, kTouchValuatorMap[i][0]); + xiev->valuators.values[val_count++] = valuators[j].value; + } + } + } + + return event; +} + +void SetupTouchDevicesForTest(const std::vector<unsigned int>& devices) { + TouchFactory::GetInstance()->SetTouchDeviceForTest(devices); + ui::DeviceDataManager* manager = ui::DeviceDataManager::GetInstance(); + manager->SetDeviceListForTest(devices); + for (size_t i = 0; i < devices.size(); i++) { + for (int j = 0; j < kValuatorNum; j++) { + manager->SetDeviceValuatorForTest( + devices[i], + kTouchValuatorMap[j][0], + static_cast<DeviceDataManager::DataType>(kTouchValuatorMap[j][1]), + kTouchValuatorMap[j][2], + kTouchValuatorMap[j][3]); + } + } +} +#endif // defined(USE_XI2_MT) + } // namespace ui diff --git a/ui/events/x/events_x_utils.h b/ui/events/x/events_x_utils.h index a4cc905..c1ee0e8 100644 --- a/ui/events/x/events_x_utils.h +++ b/ui/events/x/events_x_utils.h @@ -2,9 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/memory/scoped_ptr.h" #include "ui/events/event_constants.h" #include "ui/events/events_export.h" #include "ui/events/keycodes/keyboard_codes.h" +#include "ui/events/x/device_data_manager.h" +#include "ui/gfx/point.h" #include "ui/gfx/x/x11_types.h" typedef union _XEvent XEvent; @@ -17,6 +20,38 @@ EVENTS_EXPORT void InitXKeyEventForTesting(EventType type, KeyboardCode key_code, int flags, XEvent* event); +#if defined(USE_XI2_MT) +struct Valuator { + Valuator(DeviceDataManager::DataType type, double v) + : data_type(type), value(v) {} + + DeviceDataManager::DataType data_type; + double value; +}; + +class EVENTS_EXPORT XScopedTouchEvent { + public: + explicit XScopedTouchEvent(XEvent* event); + ~XScopedTouchEvent(); + + operator XEvent*() { return event_.get(); } + + private: + scoped_ptr<XEvent> event_; + + DISALLOW_COPY_AND_ASSIGN(XScopedTouchEvent); +}; + +EVENTS_EXPORT XEvent* CreateTouchEvent(int deviceid, + int evtype, + int tracking_id, + const gfx::Point& location, + const std::vector<Valuator>& valuators); + +EVENTS_EXPORT void SetupTouchDevicesForTest( + const std::vector<unsigned int>& devices); + +#endif // defined(USE_XI2_MT) // Initializes a XEvent that holds XButtonEvent for testing. Note that ui::EF_ // flags should be passed as |flags|, not the native ones in <X11/X.h>. |