summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authormiletus@chromium.org <miletus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-09 04:41:03 +0000
committermiletus@chromium.org <miletus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-09 04:41:03 +0000
commited3668b12a4a4048024f65fcbffd8a1e2aeb7676 (patch)
tree81a7d2fcd1583ee20f9a81816de3276304ee80c2 /ui
parent3ed07538dfb329636198d56c56c2ac189c222387 (diff)
downloadchromium_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.gyp3
-rw-r--r--ui/aura/root_window_host_x11.h6
-rw-r--r--ui/aura/root_window_host_x11_unittest.cc157
-rw-r--r--ui/events/x/device_data_manager.h7
-rw-r--r--ui/events/x/events_x_unittest.cc172
-rw-r--r--ui/events/x/events_x_utils.cc77
-rw-r--r--ui/events/x/events_x_utils.h35
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>.